Таймер обратного отсчета СЕКУНДА-1 на ARDUINO с памятью на 10 значений. Для: УФ - сушилки, Фоторезиста, Шеллака, Печатей
Схему, скетч и описание можно взять тут:
СКЕТЧ:
#include <LiquidCrystal.h>
#include <EEPROM.h>
LiquidCrystal _lcd1(8, 9, 4, 5, 6, 7);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;
int _gtv2;
bool _gtv1 = 0;
bool _gtv3;
int _gtv5;
bool _gtv6;
bool _gtv7;
bool _gtv8;
int _gtv9;
bool _gtv11 = 0;
int _gtv10;
bool _count3I = 0;
int _count3P = 0;
bool _gen2I = 0;
bool _gen2O = 0;
unsigned long _gen2P = 0UL;
bool _gen3I = 0;
bool _gen3O = 0;
unsigned long _gen3P = 0UL;
bool _trgt1 = 0;
bool _trgt1I = 0;
bool _count1I = 0;
int _count1P = 0;
int _swi2;
int _disp1oldLength = 0;
bool _tim5I = 0;
bool _tim5O = 0;
unsigned long _tim5P = 0UL;
bool _pzs1OES = 0;
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
bool _tim2I = 0;
bool _tim2O = 0;
unsigned long _tim2P = 0UL;
bool _tim3I = 0;
bool _tim3O = 0;
unsigned long _tim3P = 0UL;
bool _tim4I = 0;
bool _tim4O = 0;
unsigned long _tim4P = 0UL;
bool _count2I = 0;
int _count2P = 0;
bool _SEEPR10OSN = 0;
int _dms1Q0 = 0;
int _dms1Q1 = 0;
int _dms1Q2 = 0;
int _dms1Q3 = 0;
int _dms1Q4 = 0;
int _dms1Q5 = 0;
int _dms1Q6 = 0;
int _dms1Q7 = 0;
int _dms1Q8 = 0;
int _dms1Q9 = 0;
int _dms1Q10 = 0;
bool _SEEPR11OSN = 0;
bool _SEEPR1OSN = 0;
bool _SEEPR2OSN = 0;
bool _SEEPR3OSN = 0;
bool _SEEPR4OSN = 0;
bool _SEEPR5OSN = 0;
bool _SEEPR6OSN = 0;
bool _SEEPR7OSN = 0;
bool _SEEPR8OSN = 0;
int _mux1;
bool _dms2Q0 = 0;
bool _dms2Q1 = 0;
bool _dms2Q2 = 0;
bool _dms2Q3 = 0;
bool _dms2Q4 = 0;
bool _dms2Q5 = 0;
bool _dms2Q6 = 0;
bool _dms2Q7 = 0;
bool _dms2Q8 = 0;
bool _dms2Q9 = 0;
bool _dms2Q10 = 0;
String _swi1;
bool _SEEPR9OSN = 0;
String _swi3;
int _disp2oldLength = 0;
bool _bounseInputD10S = 0;
bool _bounseInputD10O = 0;
unsigned long _bounseInputD10P = 0UL;
bool _bounseInputD12S = 0;
bool _bounseInputD12O = 0;
unsigned long _bounseInputD12P = 0UL;
bool _bounseInputD11S = 0;
bool _bounseInputD11O = 0;
unsigned long _bounseInputD11P = 0UL;
bool _bounseInputD1S = 0;
bool _bounseInputD1O = 0;
unsigned long _bounseInputD1P = 0UL;
void setup()
{
pinMode(1, INPUT);
digitalWrite(1, HIGH);
pinMode(12, INPUT);
digitalWrite(12, HIGH);
pinMode(10, INPUT);
digitalWrite(10, HIGH);
pinMode(11, INPUT);
digitalWrite(11, HIGH);
pinMode(3, OUTPUT);
_lcd1.begin(16, 2);
_bounseInputD10O = digitalRead(10);
_bounseInputD12O = digitalRead(12);
_bounseInputD11O = digitalRead(11);
_bounseInputD1O = digitalRead(1);
}
void loop()
{if (_isNeedClearDisp1) {_lcd1.clear(); _isNeedClearDisp1= 0;}
bool _bounceInputTmpD10 = (digitalRead (10));
if (_bounseInputD10S)
{
if (millis() >= (_bounseInputD10P + 40))
{_bounseInputD10O= _bounceInputTmpD10; _bounseInputD10S=0;}
}
else
{
if (_bounceInputTmpD10 != _bounseInputD10O )
{_bounseInputD10S=1; _bounseInputD10P = millis();}
}
bool _bounceInputTmpD12 = (digitalRead (12));
if (_bounseInputD12S)
{
if (millis() >= (_bounseInputD12P + 40))
{_bounseInputD12O= _bounceInputTmpD12; _bounseInputD12S=0;}
}
else
{
if (_bounceInputTmpD12 != _bounseInputD12O )
{_bounseInputD12S=1; _bounseInputD12P = millis();}
}
bool _bounceInputTmpD11 = (digitalRead (11));
if (_bounseInputD11S)
{
if (millis() >= (_bounseInputD11P + 40))
{_bounseInputD11O= _bounceInputTmpD11; _bounseInputD11S=0;}
}
else
{
if (_bounceInputTmpD11 != _bounseInputD11O )
{_bounseInputD11S=1; _bounseInputD11P = millis();}
}
bool _bounceInputTmpD1 = (digitalRead (1));
if (_bounseInputD1S)
{
if (millis() >= (_bounseInputD1P + 40))
{_bounseInputD1O= _bounceInputTmpD1; _bounseInputD1S=0;}
}
else
{
if (_bounceInputTmpD1 != _bounseInputD1O )
{_bounseInputD1S=1; _bounseInputD1P = millis();}
}
if(_gtv8) _count3P = (_gtv10);
if (_gen2O)
{
if (! _count3I)
{
if (( (_gen2O) ^ (!(_bounseInputD12O)) )) {_count3P = _count3P+1;} else {_count3P = _count3P-1;};
_count3I = 1;
}
}
else
{
_count3I=0;
}
if (_gtv1) _count3P = 0;
if (( (!(_bounseInputD1O)) || (!(_bounseInputD12O)) )) { if (! _gen2I) { _gen2I = 1; _gen2O = 1; _gen2P = millis(); } } else { _gen2I = 0 ; _gen2O= 0;}
if (_gen2I) { if ( _isTimer ( _gen2P , 200 )) { _gen2P = millis(); _gen2O = ! _gen2O;}}
if (_trgt1) { if (! _gen3I) { _gen3I = 1; _gen3O = 1; _gen3P = millis(); } } else { _gen3I = 0 ; _gen3O= 0;}
if (_gen3I) { if ( _isTimer ( _gen3P , 500 )) { _gen3P = millis(); _gen3O = ! _gen3O;}}
bool _tmp1 = ( (!(_bounseInputD10O)) || (_gtv3) );
if (_tmp1) { if (! _trgt1I) _trgt1 = ! _trgt1; }
_trgt1I = _tmp1;
if(!(_bounseInputD10O)) _count1P = (_gtv2);
if (_gen3O)
{
if (! _count1I)
{
_count1P = _count1P-1;
_count1I = 1;
}
}
else
{
_count1I=0;
}
if (_gtv3) _count1P = 0;
if(_gtv6)
{_swi2=_gtv5;}
else
{_swi2=_gtv2;}
if(( ( _count1P <= 0) && (_gtv6) )) {_tim5O = 1; _tim5I = 1;} else { if(_tim5I) {_tim5I = 0; _tim5P = millis();} else { if (_tim5O) {if ( _isTimer(_tim5P, 2000)) _tim5O = 0;}}}
if(_gen1O)
{if((!_pzs1OES)){ tone(2, 1000); _pzs1OES =1;}} else {if(_pzs1OES){noTone(2); _pzs1OES =0; }}
if (_tim5O) { if (! _gen1I) { _gen1I = 1; _gen1O = 1; _gen1P = millis(); } } else { _gen1I = 0 ; _gen1O= 0;}
if (_gen1I) { if ( _isTimer ( _gen1P , 200 )) { _gen1P = millis(); _gen1O = ! _gen1O;}}
_gtv6 = _trgt1;
digitalWrite(3, _trgt1);
_gtv5 = _count1P;
if (1) {
_dispTempLength1 = ((((String("TIME: ")) + ((String(_swi2)))))).length();
if (_disp1oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;}
_disp1oldLength = _dispTempLength1;
_lcd1.setCursor(int((16 - _dispTempLength1)/2), 0);
_lcd1.print((((String("TIME: ")) + ((String(_swi2))))));
} else {
if (_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;}
}
_gtv3 = (_count1P) < (0);
_gtv2 = _count3P;
_gtv1 = (_count3P) < (0);
if (!(_bounseInputD11O))
{ if (_tim1I) { if (_isTimer(_tim1P, 3000)) {_tim1O = 1;}} else {_tim1I =1; _tim1P = millis();}} else {_tim1O = 0; _tim1I = 0;}
if(!(_bounseInputD11O)) {_tim2O = 1; _tim2I = 1;} else { if(_tim2I) {_tim2I = 0; _tim2P = millis();} else { if (_tim2O) {if ( _isTimer(_tim2P, 200)) _tim2O = 0;}}}
if(!(_bounseInputD11O)) {_tim3O = 1; _tim3I = 1;} else { if(_tim3I) {_tim3I = 0; _tim3P = millis();} else { if (_tim3O) {if ( _isTimer(_tim3P, 100)) _tim3O = 0;}}}
if(_tim1O) {_tim4O = 1; _tim4I = 1;} else { if(_tim4I) {_tim4I = 0; _tim4P = millis();} else { if (_tim4O) {if ( _isTimer(_tim4P, 300)) _tim4O = 0;}}}
if (_gtv8)
{
if (! _count2I)
{
_count2P = _count2P+1;
_count2I = 1;
}
}
else
{
_count2I=0;
}
if (_gtv11) _count2P = 0;
if(_dms2Q0){ if(!_SEEPR10OSN){ EEPROMWriteInt(0, 0); _SEEPR10OSN=1;} }else{ if(_SEEPR10OSN){_SEEPR10OSN=0;}}
if((_gtv9 == 0)){_dms1Q0 = _gtv2;} else {_dms1Q0 = 0;}
if((_gtv9 == 1)){_dms1Q1 = _gtv2;} else {_dms1Q1 = 0;}
if((_gtv9 == 2)){_dms1Q2 = _gtv2;} else {_dms1Q2 = 0;}
if((_gtv9 == 3)){_dms1Q3 = _gtv2;} else {_dms1Q3 = 0;}
if((_gtv9 == 4)){_dms1Q4 = _gtv2;} else {_dms1Q4 = 0;}
if((_gtv9 == 5)){_dms1Q5 = _gtv2;} else {_dms1Q5 = 0;}
if((_gtv9 == 6)){_dms1Q6 = _gtv2;} else {_dms1Q6 = 0;}
if((_gtv9 == 7)){_dms1Q7 = _gtv2;} else {_dms1Q7 = 0;}
if((_gtv9 == 8)){_dms1Q8 = _gtv2;} else {_dms1Q8 = 0;}
if((_gtv9 == 9)){_dms1Q9 = _gtv2;} else {_dms1Q9 = 0;}
if((_gtv9 == 10)){_dms1Q10 = _gtv2;} else {_dms1Q10 = 0;}
if(_dms2Q1){ if(!_SEEPR11OSN){ EEPROMWriteInt(2, _dms1Q1); _SEEPR11OSN=1;} }else{ if(_SEEPR11OSN){_SEEPR11OSN=0;}}
if(_dms2Q2){ if(!_SEEPR1OSN){ EEPROMWriteInt(4, _dms1Q2); _SEEPR1OSN=1;} }else{ if(_SEEPR1OSN){_SEEPR1OSN=0;}}
if(_dms2Q3){ if(!_SEEPR2OSN){ EEPROMWriteInt(6, _dms1Q3); _SEEPR2OSN=1;} }else{ if(_SEEPR2OSN){_SEEPR2OSN=0;}}
if(_dms2Q4){ if(!_SEEPR3OSN){ EEPROMWriteInt(8, _dms1Q4); _SEEPR3OSN=1;} }else{ if(_SEEPR3OSN){_SEEPR3OSN=0;}}
if(_dms2Q5){ if(!_SEEPR4OSN){ EEPROMWriteInt(10, _dms1Q5); _SEEPR4OSN=1;} }else{ if(_SEEPR4OSN){_SEEPR4OSN=0;}}
if(_dms2Q6){ if(!_SEEPR5OSN){ EEPROMWriteInt(12, _dms1Q6); _SEEPR5OSN=1;} }else{ if(_SEEPR5OSN){_SEEPR5OSN=0;}}
if(_dms2Q7){ if(!_SEEPR6OSN){ EEPROMWriteInt(14, _dms1Q7); _SEEPR6OSN=1;} }else{ if(_SEEPR6OSN){_SEEPR6OSN=0;}}
if(_dms2Q8){ if(!_SEEPR7OSN){ EEPROMWriteInt(16, _dms1Q8); _SEEPR7OSN=1;} }else{ if(_SEEPR7OSN){_SEEPR7OSN=0;}}
if(_dms2Q9){ if(!_SEEPR8OSN){ EEPROMWriteInt(18, _dms1Q9); _SEEPR8OSN=1;} }else{ if(_SEEPR8OSN){_SEEPR8OSN=0;}}
if((_gtv9) == 0) {_mux1 = (EEPROMReadInt(0));}
if((_gtv9) == 1) {_mux1 = (EEPROMReadInt(2));}
if((_gtv9) == 2) {_mux1 = (EEPROMReadInt(4));}
if((_gtv9) == 3) {_mux1 = (EEPROMReadInt(6));}
if((_gtv9) == 4) {_mux1 = (EEPROMReadInt(8));}
if((_gtv9) == 5) {_mux1 = (EEPROMReadInt(10));}
if((_gtv9) == 6) {_mux1 = (EEPROMReadInt(12));}
if((_gtv9) == 7) {_mux1 = (EEPROMReadInt(14));}
if((_gtv9) == 8) {_mux1 = (EEPROMReadInt(16));}
if((_gtv9) == 9) {_mux1 = (EEPROMReadInt(18));}
if((_gtv9) == 10) {_mux1 = (EEPROMReadInt(20));}
if((_gtv9 == 0)){_dms2Q0 = _gtv7;} else {_dms2Q0 = 0;}
if((_gtv9 == 1)){_dms2Q1 = _gtv7;} else {_dms2Q1 = 0;}
if((_gtv9 == 2)){_dms2Q2 = _gtv7;} else {_dms2Q2 = 0;}
if((_gtv9 == 3)){_dms2Q3 = _gtv7;} else {_dms2Q3 = 0;}
if((_gtv9 == 4)){_dms2Q4 = _gtv7;} else {_dms2Q4 = 0;}
if((_gtv9 == 5)){_dms2Q5 = _gtv7;} else {_dms2Q5 = 0;}
if((_gtv9 == 6)){_dms2Q6 = _gtv7;} else {_dms2Q6 = 0;}
if((_gtv9 == 7)){_dms2Q7 = _gtv7;} else {_dms2Q7 = 0;}
if((_gtv9 == 8)){_dms2Q8 = _gtv7;} else {_dms2Q8 = 0;}
if((_gtv9 == 9)){_dms2Q9 = _gtv7;} else {_dms2Q9 = 0;}
if((_gtv9 == 10)){_dms2Q10 = _gtv7;} else {_dms2Q10 = 0;}
if((_gtv9) == (0))
{_swi1=String("-");}
else
{_swi1=(String(_gtv10));}
if(_dms2Q10){ if(!_SEEPR9OSN){ EEPROMWriteInt(20, _dms1Q10); _SEEPR9OSN=1;} }else{ if(_SEEPR9OSN){_SEEPR9OSN=0;}}
if((_gtv9) == (0))
{_swi3=String("-");}
else
{_swi3=(String(_gtv9));}
_gtv7 = _tim1O;
_gtv9 = _count2P;
_gtv8 = ( (!(_tim4O)) && (( (_tim2O) && (!(_tim3O)) )) );
_gtv11 = (_count2P) >= (11);
_gtv10 = _mux1;
if (1) {
_dispTempLength1 = ((((((((String("SAVE:")) + (_swi3))) + (String(" sek:")))) + (_swi1)))).length();
if (_disp2oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;}
_disp2oldLength = _dispTempLength1;
_lcd1.setCursor(0, 1);
_lcd1.print((((((((String("SAVE:")) + (_swi3))) + (String(" sek:")))) + (_swi1))));
} else {
if (_disp2oldLength > 0) {_isNeedClearDisp1 = 1; _disp2oldLength = 0;}
}
}
bool _isTimer(unsigned long startTime, unsigned long period )
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
}
int EEPROMReadInt(int p_address)
{
byte lowByte = EEPROM.read(p_address);
byte highByte = EEPROM.read(p_address + 1);
return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
}
void EEPROMWriteInt(int p_address, int p_value)
{
byte lowByte = ((p_value >> 0) & 0xFF);
byte highByte = ((p_value >> 8) & 0xFF);
EEPROM.write(p_address, lowByte);
EEPROM.write(p_address + 1, highByte);
}
Отлично и спасибо большое,будем ждать новый вариант !!!
ОтветитьУдалитьЗдравствуй ! У меня к вам просьба,не могли бы вы немного подкорректировать скеч,а именно кнопки вперёд и назад,при однократном нажатии изменяли по одной секунде а при длительном нажатии хотя бы по 10 секунд листали,был бы очень благодарен вам.
ОтветитьУдалитьЗдравствуйте. Скетч не я писал, и этим "языком" пока не владею, так что изменения не могу внести (((
УдалитьИдея Ваша здравая, что то не подумал я про это когда общался с программистом.
У меня в архиве скетч в 2х вариантах, в программе FLprog (в ней он был написан) и из нее же экспортирован в родной формат Arduini IDE. Можно найти знающего человека и попросить внести изменения.
Жаль,я уже сделал платку и пользуюсь,а с программированием тоже беда,пользую готовыми проектами (
УдалитьСегодня закончил свою лампу,остался корпус сделать,спасибо за таймер !!! https://youtu.be/am1Vp4PeJHg
ОтветитьУдалитьОтлично получилось!
УдалитьПодскажите а а использование i2C модулем с LCD 1602 как переделать ваш код
ОтветитьУдалитьИ вопрос про подсветку можно её подключить так чтобы при нажатии на любую кнопку включалась например на 30 секунд
Соф писал не я, поэтому не знаю как в нем что то делать, переделывать как под модуль i2C, так и подсветку. А смысл в этой схеме использовать модуль i2C, штатных выводов Ардуино и так хватает за глаза.
УдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьпеределал код под дисплей LCD 1602 i2C
Удалитькому надо пишете
с подсветкой при нажатии
Так набросай страничку со схемой и скетчем ))
УдалитьСкинте пожалуйста код под дисплей LCD 1602 i2C
ОтветитьУдалитьУ меня нет его. Могу предложить только удалить с дисплея модуль i2C и использовать дисплей как обычный по схеме.
УдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьЭтот комментарий был удален автором.
ОтветитьУдалить