количество импульсов по времени.
- Войдите на сайт для отправки комментариев
Ср, 03/11/2021 - 23:49
Итак.... развиваю тему часов на ГРИ. За основу была взята "древняя" прошивка, без наворотов. Из "плюшек" только перебор цифр при смене времени. Для начала "прикрутил" сигнал часа на пищалке. Затем для сигнала часа "прикрутил" МР3 модуль. Теперь есть идея, но нет понимания как её реализовать. Задача выводить на пин импульсы с определённым периодом количеством равное часам. По итогу к пину будет подключаться либо эл.магнит (бой), либо шаговый двигатель.
понимаю что нужно взять переменную, прировнять её к часам, а вот что дальше делать с этой переменной... как задать длительность импульса и промежуток между ними?
У переменной нет ни длительности импульса, ни промежутка между ними...
Это я прекрасно понимаю. Но количество импульсов завязывается именно на неё. Ну хорошо... Как я делал раньше.... Создавал условие типа: если часы=12 и мин=0 и сек=0 , то ... далее либо включение пина либо команда на мр3. при этом замечал что на пищалке каждый час разная длительность импульса. как я понимаю, это потому что прошивка "находит" эту строку в разное время в течении секунды.
Я вижу вариант с созданием условий типа :
если часы=8 и минуты=0 и сек=00 то пин=1
иначе часы=0 и мин=0 и сек=2 то пин=1... и тд до нужного количества импульсов.
Но в таком варианте длительность импульса секунда (или меньше), что много, но решаемо на железе. а вот промежуток между уже не уменьшить. да и код на каждый час получается большим. Должен же быть способ проще.
Выложенный вами ваш скетчик оживит обсуждение вашей проблемы. Это я вам как врач говорю
Нарисуйте импульс на ноге через delay - всё равно часы, им спешить не положено. Возьмите обратный цикл for в котором переменная со значением часов будет уменьшаться до нуля и прокрутите ранее написанный импульс. На ноге выпадет точно соответствующее часам количество импульсов.
Это я вам как врач говорю
А заодно и "как мать и как женщина" :-)
..."но сися у меня одна...")
Есть у этой прошивки ещё одна особенность. Если документирую вывод в монитор порта состояние клавиатуры, то кнопки работать перестают.
Код то хоть можешь правильно вставить? И со спойлером, а не простынёй.
мог бы .... вставил.
мог бы .... вставил.
где тебе часами заниматься, если ты код не можешь вставить...
Вот вот. Посмотри вокруг - другие ведь могут.
думаю это не самый оптимальный вариант. "делей" же буквально тормозит полностью программу. Предполагается, что вся канитель с импульсами займёт 1-8 сек (от количества часов). То есть на это время мигание разделителей прекратится...
спасибо! понял.
#include <DFPlayer_Mini_Mp3.h> #include <DS3231.h> #include <Wire.h> #include <SoftwareSerial.h> // выводы для дешифратора int out1 = A3; int out2 = A1; int out4 = A0; int out8 = A2; // выводы для транзисторных ключей int key1 = 8; int key2 = 7; int key3 = 6; int key4 = 4; int led1=11;// вывод светодиода int keyb=A6;// пин для клавиатуры int buzz=3;// пин пищалки int keynum=0; //номер нажатой кнопки int mode =0; //0 - отображение текущего времени 1- установка времени int currentdigit = 0; //0 - установка часов 1- установка минут bool blinkflag = 0; // флаг для мигания цифр при установке времени bool timeout=false; // таймаут после нажатия кнопки (для устраниния дребезга) unsigned long startTime; //для мигания светодиода unsigned long startTime2; // для опроса нажатых кнопок int sec; //переменная увеличивается каждые 500мс на единицу. Нужна для мигания секундных светодиодов, бывает в двух значениях 0 - светодиоды не горят, 1 - горят, если больше 1, то сбрысывается в 0 // переменные, необходимые для работы ds3231 DS3231 Clock; bool Century=false; bool h12; bool PM; byte ADay, AHour, AMinute, ASecond, ABits; bool ADy, A12h, Apm; //определяем глобальные переменные для различных параметров часов int second,minute,hour,date,month,year,temperature; int lastMinute; void setup() { // put your setup code here, to run once: // задаем частоту ШИМ на 9 выводе 30кГц TCCR1B=TCCR1B&0b11111000|0x01; analogWrite(9,150); // настраиваем скважность импульса. Этим подгоняем напряжение на лампах 180 В // Start the I2C interface Wire.begin(); // Start the serial interface Serial.begin(9600); mp3_set_serial (Serial); //set Serial for DFPlayer-mini mp3 module mp3_set_volume (20); //задаём громкость //задаем режим работы выходов микроконтроллера pinMode(out1,OUTPUT); pinMode(out2,OUTPUT); pinMode(out4,OUTPUT); pinMode(out8,OUTPUT); pinMode(key1,OUTPUT); pinMode(key2,OUTPUT); pinMode(key3,OUTPUT); pinMode(key4,OUTPUT); pinMode(led1,OUTPUT); pinMode(buzz,OUTPUT); startTime = millis(); startTime2=startTime; sec = 0; // считываем текущее вермя ReadDS3231(); delay(1000); lastMinute = minute%10; } void ReadDS3231() //функция считывает в глобальные переменные minute и hour текущие значения { minute=Clock.getMinute(); hour=Clock.getHour(h12, PM); second=Clock.getSecond(); } void loop() { // put your main code here, to run repeatedly: int digits[3]; // массив для текущего значения времени на четыре цифры int keyval= analogRead(keyb); // считываем значение с клавиатуры unsigned long currentTime = millis(); //текущее время с момента запуска рограммы if (currentTime>=(startTime2+200)) // если прошло 200мс посмотрим какая кнопка была нажата { timeout=false; //проверим нажатие кнопок if (keynum==3) // кнопка переключения между режимами "время" и "настройка" { timeout=true; // запрещаем считывать нажатия кнопок if (mode==0) mode=1; // если отображалось время, переходим в режим настроек else if (mode==1) mode=0; //если был режим настроек, переключаемся на текущее время } if (keynum==2) // кнопка переключения между часами и минутами { timeout=true; // запрещаем считывать нажатия кнопок // currentdigit либо 0 - настройка часов, либо 1 - настройка минут currentdigit++; if (currentdigit==2) currentdigit=0; } if (keynum==1 && mode==1) // кнопка увеличения количества часов или минут(при настройке) { blinkflag=true; // прекращаем мигать цифрами startTime=millis(); timeout=true; // запрещаем считывать нажатия кнопок if (currentdigit==0) // если меняем часы { if (hour<=22) hour++; else hour=0; Clock.setHour(hour); } if (currentdigit==1) // если меняем минуты { if (minute<=58) minute++; else minute=0; Clock.setMinute(minute);//Set the minute Clock.setSecond(0); } } keynum=0; //сбрасываем нажатую кнопку startTime2=millis(); } if (currentTime>=(startTime+500)) // если прошло 500мс { blinkflag=!blinkflag; // инвертируем флаг мигающей цифры if(sec<1) // светодиоды не горят { // зажечь светодиоды digitalWrite(led1,HIGH); //Вывод в консоль для отладки //Serial.print(hour); // Serial.print(" "); //Serial.print(minute); //Serial.print(" "); // Serial.print(second); // Serial.println(" "); // Serial.println(blinkflag); Serial.print("Keyval="); Serial.println(keyval); } if(sec>=1) // светодиоды горят { // потушить светодиоды digitalWrite(led1,LOW); } startTime = currentTime; ReadDS3231(); sec = (sec+1); if(sec>=2) sec=0; } digits[0] = hour/10; digits[1] = hour%10; digits[2] = minute/10; digits[3] = minute%10; //антиотравление if (minute%10!=lastMinute && mode == 0) { digits[3] = lastMinute; lastMinute = minute%10; Safe(digits); digits[3] = lastMinute; } // show(digits); // вывести цифры на дисплей //пищалка. Если установлена на плате, активная 5 В //if ((hour>=8) & (hour<=20) & (minute==0) & (second==0)) //digitalWrite(buzz,HIGH); //else //digitalWrite(buzz,LOW); //МР3 модуль if ((hour==8) & (minute==30) & (second==0)) //Если час=8 и минуты=30 и секунды =0 { mp3_play (20);} // то включаем трек -3 else if((hour==9) & (minute==0) & (second==0)){ //иначе если час=9, мин=0, сек=0 mp3_play (1);} // то играем трек-7 ... else if((hour==10) & (minute==0) & (second==0)){ mp3_play (3);} else if((hour==11) & (minute==0) & (second==0)){ mp3_play (4);} else if((hour==12) & (minute==0) & (second==0)){ mp3_play (2);} else if((hour==13) & (minute==0) & (second==0)){ mp3_play (11);} else if((hour==14) & (minute==0) & (second==0)){ mp3_play (18);} else if((hour==15) & (minute==0) & (second==0)){ mp3_play (6);} else if((hour==16) & (minute==0) & (second==0)){ mp3_play (10);} else if((hour==17) & (minute==0) & (second==0)){ mp3_play (19);} else if((hour==18) & (minute==0) & (second==0)){ mp3_play (12);} else if((hour==19) & (minute==0) & (second==0)){ mp3_play (9);} else if((hour==20) & (minute==0) & (second==0)){ mp3_play (21);} else if((hour==21) & (minute==0) & (second==0)){ mp3_play (5);} else if ((hour>=8) & (hour<=13) & (minute==59) & (second==50)){ //тиканье mp3_play (16);} else if ((hour>=14) & (hour<=20) & (minute==59) & (second==50)){ mp3_play (17);} //проверяем нажатые кнопки if(!timeout) //если разрешено, считываем нажатую кнопку { /*keyval - значение функции analogread * если нажата первая кнопка, то принимает значение около 200 * если нажата вторая кнопка то значение около 700 * если третяя кнопка, то значение будет около 1000 * эти значения зависят от выбранных резисторов в клавиатуре */ if (keyval>150 && keyval<400) keynum=1; if (keyval>700 && keyval<900) keynum=2; if (keyval>960) keynum=3; } } void show(int a[]) { //выведем цифру a[0] на первый индикатор setNumber(a[0]); if (!(mode==1&¤tdigit==0&&blinkflag==false)) //если мы в режиме настройки и происходит настройка часов, то в первая цифра будет мигать { digitalWrite(key1,HIGH); delay(2); //потушим первый индикатор digitalWrite(key1,LOW); delay(1); } //цифра a[1] на второй индикатор setNumber(a[1]); if (!(mode==1&¤tdigit==0&&blinkflag==false)) { digitalWrite(key2,HIGH); delay(2); //потушим второй индикатор digitalWrite(key2,LOW); delay(1); } //цифра a[2] на третий индикатор setNumber(a[2]); if (!(mode==1&¤tdigit==1&&blinkflag==false)) { digitalWrite(key3,HIGH); delay(2); //потушим третий индикатор digitalWrite(key3,LOW); delay(1); } //выведем цифру a[3] на четвертый индикатор setNumber(a[3]); if (!(mode==1&¤tdigit==1&&blinkflag==false)) { digitalWrite(key4,HIGH); delay(2); //потушим четвертый индикатор digitalWrite(key4,LOW); delay(1); } } // передача цифры на дешифратор void setNumber(int num) { switch (num) { case 0: digitalWrite (out1,LOW); digitalWrite (out2,LOW); digitalWrite (out4,LOW); digitalWrite (out8,LOW); break; case 1: digitalWrite (out1,HIGH); digitalWrite (out2,LOW); digitalWrite (out4,LOW); digitalWrite (out8,LOW); break; case 2: digitalWrite (out1,LOW); digitalWrite (out2,HIGH); digitalWrite (out4,LOW); digitalWrite (out8,LOW); break; case 3: digitalWrite (out1,HIGH); digitalWrite (out2,HIGH); digitalWrite (out4,LOW); digitalWrite (out8,LOW); break; case 4: digitalWrite (out1,LOW); digitalWrite (out2,LOW); digitalWrite (out4,HIGH); digitalWrite (out8,LOW); break; case 5: digitalWrite (out1,HIGH); digitalWrite (out2,LOW); digitalWrite (out4,HIGH); digitalWrite (out8,LOW); break; case 6: digitalWrite (out1,LOW); digitalWrite (out2,HIGH); digitalWrite (out4,HIGH); digitalWrite (out8,LOW); break; case 7: digitalWrite (out1,HIGH); digitalWrite (out2,HIGH); digitalWrite (out4,HIGH); digitalWrite (out8,LOW); break; case 8: digitalWrite (out1,LOW); digitalWrite (out2,LOW); digitalWrite (out4,LOW); digitalWrite (out8,HIGH); break; case 9: digitalWrite (out1,HIGH); digitalWrite (out2,LOW); digitalWrite (out4,LOW); digitalWrite (out8,HIGH); break; } } void Safe(int n[]) { int h1 = n[0]; int h2 = n[1]; int m1 = n[2]; int m2 = n[3]; n[0]++; while(n[0]!=h1) { for (int x=0;x<2;x++) { show(n); } n[0]++; if (n[0]>9) n[0]=0; } n[1]++; while(n[1]!=h2) { for (int x=0;x<2;x++) { show(n); } n[1]++; if (n[1]>9) n[1]=0; } n[2]++; while(n[2]!=m1) { for (int x=0;x<2;x++) { show(n); } n[2]++; if (n[2]>9) n[2]=0; } n[3]++; while(n[3]!=m2) { for (int x=0;x<2;x++) { show(n); } n[3]++; if (n[3]>9) n[3]=0; } }мог бы .... вставил.
Вот и вставьте. Как выражается граф, это входной тест
Вашу портянку я удалю
код показывает, что ни про массивы, ни про циклы, ни про switch() вы не в курсе....
Может какую-то книжку почитать?
не то что бы совсем не в курсе..... Код изначально не мой и ему лет энцать.... Более того это уже плод коллективного (хоть и не сильно развитого) разума. Моё тут только "пищалка" и "мр3". Книжку обязательно почитаю, уроки Гайвера пересмотрю....
Интересно, вот тут делей для чего? - чтобы цифры мигали?
//выведем цифру a[0] на первый индикатор setNumber(a[0]); if (!(mode==1&¤tdigit==0&&blinkflag==false)) //если мы в режиме настройки и происходит настройка часов, то в первая цифра будет мигать { digitalWrite(key1,HIGH); delay(2); //потушим первый индикатор digitalWrite(key1,LOW); delay(1); }если зажигать цифру на 2 миллисекунды -думаете кто-то это сможет заметить?
На сколько я понимаю, это для работы динамической индикации. Цифры выводятся последовательно. Кстати... Если тот же импульс реализовать через "делей" , то и индикация "повиснет". Не вариант....
Ну значит не через делей, а через блинк визаут делей. Тема такая есть . Посмотрите и сделайте импульс. Обратный фор всё равно делать надо, только не через фор, а самому по тому же принципу растягивая на весь луп.
На сколько я понимаю, это для работы динамической индикации
во-первых, в комментариях написано совсем иное - я специально их оставил, копируя код. Во-вторых, при динамической индикации никто не ставит задержек в выключенном состоянии - это нарушит показ соседних цифр.
Думаю, это никакая не "динамика". а именно что попытка мигать цифрой. Только реализованное вообще без понимания предмета.
Почитал я "напутствие" для новичков..... Почитал соседние темы.... Пересмотрел свою.... И меня что то терзают смутные сомнения..... Это форум вообще про Ардуино? Только самый ленивый меня не "пнул" и "носом не тыкнул".... Вы тут как "камеди клаб" что ли? все из бывших КВНовцов? И главное на это времени и сил не жалко, а вот просто взять и по теме ответить.... Вас в школе били что ли, что Вы тут самоутверждаетесь.... Как там в "напутсвии"? " уровень подготовки старожилов известен, ваш, еще нужно подтвердить." Возможно уровень и известен.... но каков он на самом то деле? что то не бросается в глаза. Уровень "дедовщины", да высокий.... ну так форум то вроде не про это.
А вот этот участок кода у вас работает?
//МР3 модуль if ((hour==8) & (minute==30) & (second==0)) //Если час=8 и минуты=30 и секунды =0 { mp3_play (20);} // то включаем трек -3 else if((hour==9) & (minute==0) & (second==0)){ //иначе если час=9, мин=0, сек=0 mp3_play (1);} // то играем трек-7 ... else if((hour==10) & (minute==0) & (second==0)){ mp3_play (3);} else if((hour==11) & (minute==0) & (second==0)){ mp3_play (4);} else if((hour==12) & (minute==0) & (second==0)){ mp3_play (2);} else if((hour==13) & (minute==0) & (second==0)){ mp3_play (11);} else if((hour==14) & (minute==0) & (second==0)){ mp3_play (18);} else if((hour==15) & (minute==0) & (second==0)){ mp3_play (6);} else if((hour==16) & (minute==0) & (second==0)){ mp3_play (10);} else if((hour==17) & (minute==0) & (second==0)){ mp3_play (19);} else if((hour==18) & (minute==0) & (second==0)){ mp3_play (12);} else if((hour==19) & (minute==0) & (second==0)){ mp3_play (9);} else if((hour==20) & (minute==0) & (second==0)){ mp3_play (21);} else if((hour==21) & (minute==0) & (second==0)){ mp3_play (5);} else if ((hour>=8) & (hour<=13) & (minute==59) & (second==50)){ //тиканье mp3_play (16);} else if ((hour>=14) & (hour<=20) & (minute==59) & (second==50)){ mp3_play (17);}тут же вместо логических операций битовые используются, как оно вообще работает? Или компилятор сам исправляет такое в ардуино?
ТС перезалей пожалуйста свой код, чтобы номера строк были. Как у вас вообще получилось без номеров код вставить?
А дубли Сообщения получились потому, что задолбали 502 и 504 ошибки форума!!! Когда уже починят?!
#include <DFPlayer_Mini_Mp3.h> #include <DS3231.h> #include <Wire.h> #include <SoftwareSerial.h> // выводы для дешифратора int out1 = A3; int out2 = A1; int out4 = A0; int out8 = A2; // выводы для транзисторных ключей int key1 = 8; int key2 = 7; int key3 = 6; int key4 = 4; int led1=11;// вывод светодиода int keyb=A6;// пин для клавиатуры int buzz=3;// пин пищалки int keynum=0; //номер нажатой кнопки int mode =0; //0 - отображение текущего времени 1- установка времени int currentdigit = 0; //0 - установка часов 1- установка минут bool blinkflag = 0; // флаг для мигания цифр при установке времени bool timeout=false; // таймаут после нажатия кнопки (для устраниния дребезга) unsigned long startTime; //для мигания светодиода unsigned long startTime2; // для опроса нажатых кнопок int sec; //переменная увеличивается каждые 500мс на единицу. Нужна для мигания секундных светодиодов, бывает в двух значениях 0 - светодиоды не горят, 1 - горят, если больше 1, то сбрысывается в 0 // переменные, необходимые для работы ds3231 DS3231 Clock; bool Century=false; bool h12; bool PM; byte ADay, AHour, AMinute, ASecond, ABits; bool ADy, A12h, Apm; //определяем глобальные переменные для различных параметров часов int second,minute,hour,date,month,year,temperature; int lastMinute; void setup() { // put your setup code here, to run once: // задаем частоту ШИМ на 9 выводе 30кГц TCCR1B=TCCR1B&0b11111000|0x01; analogWrite(9,150); // настраиваем скважность импульса. Этим подгоняем напряжение на лампах 180 В // Start the I2C interface Wire.begin(); // Start the serial interface Serial.begin(9600); mp3_set_serial (Serial); //set Serial for DFPlayer-mini mp3 module mp3_set_volume (20); //задаём громкость //задаем режим работы выходов микроконтроллера pinMode(out1,OUTPUT); pinMode(out2,OUTPUT); pinMode(out4,OUTPUT); pinMode(out8,OUTPUT); pinMode(key1,OUTPUT); pinMode(key2,OUTPUT); pinMode(key3,OUTPUT); pinMode(key4,OUTPUT); pinMode(led1,OUTPUT); pinMode(buzz,OUTPUT); startTime = millis(); startTime2=startTime; sec = 0; // считываем текущее вермя ReadDS3231(); delay(1000); lastMinute = minute%10; } void ReadDS3231() //функция считывает в глобальные переменные minute и hour текущие значения { minute=Clock.getMinute(); hour=Clock.getHour(h12, PM); second=Clock.getSecond(); } void loop() { // put your main code here, to run repeatedly: int digits[3]; // массив для текущего значения времени на четыре цифры int keyval= analogRead(keyb); // считываем значение с клавиатуры unsigned long currentTime = millis(); //текущее время с момента запуска рограммы if (currentTime>=(startTime2+200)) // если прошло 200мс посмотрим какая кнопка была нажата { timeout=false; //проверим нажатие кнопок if (keynum==3) // кнопка переключения между режимами "время" и "настройка" { timeout=true; // запрещаем считывать нажатия кнопок if (mode==0) mode=1; // если отображалось время, переходим в режим настроек else if (mode==1) mode=0; //если был режим настроек, переключаемся на текущее время } if (keynum==2) // кнопка переключения между часами и минутами { timeout=true; // запрещаем считывать нажатия кнопок // currentdigit либо 0 - настройка часов, либо 1 - настройка минут currentdigit++; if (currentdigit==2) currentdigit=0; } if (keynum==1 && mode==1) // кнопка увеличения количества часов или минут(при настройке) { blinkflag=true; // прекращаем мигать цифрами startTime=millis(); timeout=true; // запрещаем считывать нажатия кнопок if (currentdigit==0) // если меняем часы { if (hour<=22) hour++; else hour=0; Clock.setHour(hour); } if (currentdigit==1) // если меняем минуты { if (minute<=58) minute++; else minute=0; Clock.setMinute(minute);//Set the minute Clock.setSecond(0); } } keynum=0; //сбрасываем нажатую кнопку startTime2=millis(); } if (currentTime>=(startTime+500)) // если прошло 500мс { blinkflag=!blinkflag; // инвертируем флаг мигающей цифры if(sec<1) // светодиоды не горят { // зажечь светодиоды digitalWrite(led1,HIGH); //Вывод в консоль для отладки //Serial.print(hour); // Serial.print(" "); //Serial.print(minute); //Serial.print(" "); // Serial.print(second); // Serial.println(" "); // Serial.println(blinkflag); Serial.print("Keyval="); Serial.println(keyval); } if(sec>=1) // светодиоды горят { // потушить светодиоды digitalWrite(led1,LOW); } startTime = currentTime; ReadDS3231(); sec = (sec+1); if(sec>=2) sec=0; } digits[0] = hour/10; digits[1] = hour%10; digits[2] = minute/10; digits[3] = minute%10; //антиотравление if (minute%10!=lastMinute && mode == 0) { digits[3] = lastMinute; lastMinute = minute%10; Safe(digits); digits[3] = lastMinute; } // show(digits); // вывести цифры на дисплей //пищалка. Если установлена на плате, активная 5 В //if ((hour>=8) & (hour<=20) & (minute==0) & (second==0)) //digitalWrite(buzz,HIGH); //else //digitalWrite(buzz,LOW); //МР3 модуль if ((hour==8) & (minute==30) & (second==0)) //Если час=8 и минуты=30 и секунды =0 { mp3_play (20);} // то включаем трек -3 else if((hour==9) & (minute==0) & (second==0)){ //иначе если час=9, мин=0, сек=0 mp3_play (1);} // то играем трек-7 ... else if((hour==10) & (minute==0) & (second==0)){ mp3_play (3);} else if((hour==11) & (minute==0) & (second==0)){ mp3_play (4);} else if((hour==12) & (minute==0) & (second==0)){ mp3_play (2);} else if((hour==13) & (minute==0) & (second==0)){ mp3_play (11);} else if((hour==14) & (minute==0) & (second==0)){ mp3_play (18);} else if((hour==15) & (minute==0) & (second==0)){ mp3_play (6);} else if((hour==16) & (minute==0) & (second==0)){ mp3_play (10);} else if((hour==17) & (minute==0) & (second==0)){ mp3_play (19);} else if((hour==18) & (minute==0) & (second==0)){ mp3_play (12);} else if((hour==19) & (minute==0) & (second==0)){ mp3_play (9);} else if((hour==20) & (minute==0) & (second==0)){ mp3_play (21);} else if((hour==21) & (minute==0) & (second==0)){ mp3_play (5);} else if ((hour>=8) & (hour<=13) & (minute==59) & (second==50)){ //тиканье mp3_play (16);} else if ((hour>=14) & (hour<=20) & (minute==59) & (second==50)){ mp3_play (17);} //проверяем нажатые кнопки if(!timeout) //если разрешено, считываем нажатую кнопку { /*keyval - значение функции analogread * если нажата первая кнопка, то принимает значение около 200 * если нажата вторая кнопка то значение около 700 * если третяя кнопка, то значение будет около 1000 * эти значения зависят от выбранных резисторов в клавиатуре */ if (keyval>150 && keyval<400) keynum=1; if (keyval>700 && keyval<900) keynum=2; if (keyval>960) keynum=3; } } void show(int a[]) { //выведем цифру a[0] на первый индикатор setNumber(a[0]); if (!(mode==1&¤tdigit==0&&blinkflag==false)) //если мы в режиме настройки и происходит настройка часов, то в первая цифра будет мигать { digitalWrite(key1,HIGH); delay(2); //потушим первый индикатор digitalWrite(key1,LOW); delay(1); } //цифра a[1] на второй индикатор setNumber(a[1]); if (!(mode==1&¤tdigit==0&&blinkflag==false)) { digitalWrite(key2,HIGH); delay(2); //потушим второй индикатор digitalWrite(key2,LOW); delay(1); } //цифра a[2] на третий индикатор setNumber(a[2]); if (!(mode==1&¤tdigit==1&&blinkflag==false)) { digitalWrite(key3,HIGH); delay(2); //потушим третий индикатор digitalWrite(key3,LOW); delay(1); } //выведем цифру a[3] на четвертый индикатор setNumber(a[3]); if (!(mode==1&¤tdigit==1&&blinkflag==false)) { digitalWrite(key4,HIGH); delay(2); //потушим четвертый индикатор digitalWrite(key4,LOW); delay(1); } } // передача цифры на дешифратор void setNumber(int num) { switch (num) { case 0: digitalWrite (out1,LOW); digitalWrite (out2,LOW); digitalWrite (out4,LOW); digitalWrite (out8,LOW); break; case 1: digitalWrite (out1,HIGH); digitalWrite (out2,LOW); digitalWrite (out4,LOW); digitalWrite (out8,LOW); break; case 2: digitalWrite (out1,LOW); digitalWrite (out2,HIGH); digitalWrite (out4,LOW); digitalWrite (out8,LOW); break; case 3: digitalWrite (out1,HIGH); digitalWrite (out2,HIGH); digitalWrite (out4,LOW); digitalWrite (out8,LOW); break; case 4: digitalWrite (out1,LOW); digitalWrite (out2,LOW); digitalWrite (out4,HIGH); digitalWrite (out8,LOW); break; case 5: digitalWrite (out1,HIGH); digitalWrite (out2,LOW); digitalWrite (out4,HIGH); digitalWrite (out8,LOW); break; case 6: digitalWrite (out1,LOW); digitalWrite (out2,HIGH); digitalWrite (out4,HIGH); digitalWrite (out8,LOW); break; case 7: digitalWrite (out1,HIGH); digitalWrite (out2,HIGH); digitalWrite (out4,HIGH); digitalWrite (out8,LOW); break; case 8: digitalWrite (out1,LOW); digitalWrite (out2,LOW); digitalWrite (out4,LOW); digitalWrite (out8,HIGH); break; case 9: digitalWrite (out1,HIGH); digitalWrite (out2,LOW); digitalWrite (out4,LOW); digitalWrite (out8,HIGH); break; } } void Safe(int n[]) { int h1 = n[0]; int h2 = n[1]; int m1 = n[2]; int m2 = n[3]; n[0]++; while(n[0]!=h1) { for (int x=0;x<2;x++) { show(n); } n[0]++; if (n[0]>9) n[0]=0; } n[1]++; while(n[1]!=h2) { for (int x=0;x<2;x++) { show(n); } n[1]++; if (n[1]>9) n[1]=0; } n[2]++; while(n[2]!=m1) { for (int x=0;x<2;x++) { show(n); } n[2]++; if (n[2]>9) n[2]=0; } n[3]++; while(n[3]!=m2) { for (int x=0;x<2;x++) { show(n); } n[3]++; if (n[3]>9) n[3]=0; } }А вот этот участок кода у вас работает?
//МР3 модуль if ((hour==8) & (minute==30) & (second==0)) //Если час=8 и минуты=30 и секунды =0 { mp3_play (20);} // то включаем трек -3 else if((hour==9) & (minute==0) & (second==0)){ //иначе если час=9, мин=0, сек=0 mp3_play (1);} // то играем трек-7 ... else if((hour==10) & (minute==0) & (second==0)){ mp3_play (3);} else if((hour==11) & (minute==0) & (second==0)){ mp3_play (4);} else if((hour==12) & (minute==0) & (second==0)){ mp3_play (2);} else if((hour==13) & (minute==0) & (second==0)){ mp3_play (11);} else if((hour==14) & (minute==0) & (second==0)){ mp3_play (18);} else if((hour==15) & (minute==0) & (second==0)){ mp3_play (6);} else if((hour==16) & (minute==0) & (second==0)){ mp3_play (10);} else if((hour==17) & (minute==0) & (second==0)){ mp3_play (19);} else if((hour==18) & (minute==0) & (second==0)){ mp3_play (12);} else if((hour==19) & (minute==0) & (second==0)){ mp3_play (9);} else if((hour==20) & (minute==0) & (second==0)){ mp3_play (21);} else if((hour==21) & (minute==0) & (second==0)){ mp3_play (5);} else if ((hour>=8) & (hour<=13) & (minute==59) & (second==50)){ //тиканье mp3_play (16);} else if ((hour>=14) & (hour<=20) & (minute==59) & (second==50)){ mp3_play (17);}тут же вместо логических операций битовые используются, как оно вообще работает? Или компилятор сам исправляет такое в ардуино?
ТС перезалей пожалуйста свой код, чтобы номера строк были. Как у вас вообще получилось без номеров код вставить?
ТС, вот смотри какая мысль у меня по твоему вопросу. Вместо запуска mp3 (или перед ним - я не знаю как он работает - отдал команду на проигрывание и пошёл дальше или ждёт завершения проигрыша?) в этом участке кода взводишь флаг «надо бы подолбить в колокол», ещё одной переменной присваиваешь значение часа, в другой запоминаешь значение миллис. Я думаю идею понял? По типу блин без делея уже управляешь электромагнитом или чем там в колокол хотел долбить. )
А вот этот участок кода у вас работает?
//МР3 модуль if ((hour==8) & (minute==30) & (second==0)) //Если час=8 и минуты=30 и секунды =0 { mp3_play (20);} // то включаем трек -3 else if((hour==9) & (minute==0) & (second==0)){ //иначе если час=9, мин=0, сек=0 mp3_play (1);} // то играем трек-7 ... else if((hour==10) & (minute==0) & (second==0)){ mp3_play (3);} else if((hour==11) & (minute==0) & (second==0)){ mp3_play (4);} else if((hour==12) & (minute==0) & (second==0)){ mp3_play (2);} else if((hour==13) & (minute==0) & (second==0)){ mp3_play (11);} else if((hour==14) & (minute==0) & (second==0)){ mp3_play (18);} else if((hour==15) & (minute==0) & (second==0)){ mp3_play (6);} else if((hour==16) & (minute==0) & (second==0)){ mp3_play (10);} else if((hour==17) & (minute==0) & (second==0)){ mp3_play (19);} else if((hour==18) & (minute==0) & (second==0)){ mp3_play (12);} else if((hour==19) & (minute==0) & (second==0)){ mp3_play (9);} else if((hour==20) & (minute==0) & (second==0)){ mp3_play (21);} else if((hour==21) & (minute==0) & (second==0)){ mp3_play (5);} else if ((hour>=8) & (hour<=13) & (minute==59) & (second==50)){ //тиканье mp3_play (16);} else if ((hour>=14) & (hour<=20) & (minute==59) & (second==50)){ mp3_play (17);}тут же вместо логических операций битовые используются, как оно вообще работает? Или компилятор сам исправляет такое в ардуино?
ТС перезалей пожалуйста свой код, чтобы номера строк были. Как у вас вообще получилось без номеров код вставить?
Да, всё работает. Это моё "произведение". не вижу ни какого противоречия. А без номеров вставил убрав их во вкладке "дополнительно" окна вставки.
МР3 плеер подключен с библиотекой и используются штатные команды.
По своему вопросу... подумываю попробовать использовать библиотеку Гайвера для шаговых двигателей. Прописать по образу и подобию, только на выполнение шагов мотора. Там и количество можно задать и скорость , то есть промежуток между ними.
ТС, вот смотри какая мысль у меня по твоему вопросу. Вместо запуска mp3 (или перед ним - я не знаю как он работает - отдал команду на проигрывание и пошёл дальше или ждёт завершения проигрыша?) в этом участке кода взводишь флаг «надо бы подолбить в колокол», ещё одной переменной присваиваешь значение часа, в другой запоминаешь значение миллис. Я думаю идею понял? По типу блин без делея уже управляешь электромагнитом или чем там в колокол хотел долбить. )
Вот с языка сорвал. Секунду будет пытаться воспроизвести музыку?
Надо поставить флаг, что воспроизвёл. И на первой секунде снять.
в прошивке с колоколом МР3 не будет совсем. За ненадобностью.
МР3 работает стабильно. Глюков за почти 2 года не замечал. И собрано уже 4 экземпляра.
Ардуино окончания воспроизведения не ждёт. У неё вообще с модулем МР3 обратной связи нет. Отправила команду и дальше своими делами занимается.
#include <Stepper.h> // change this to the number of steps on your motor #define STEPS 100 // create an instance of the stepper class, specifying // the number of steps of the motor and the pins it's // attached to Stepper stepper(STEPS, 8, 9, 10, 11); // the previous reading from the analog input int previous = 0; void setup() { // set the speed of the motor to 30 RPMs stepper.setSpeed(30); } void loop() { // get the sensor value int val = analogRead(0); // move a number of steps equal to the change in the // sensor reading stepper.step(val - previous); // remember the previous value of the sensor previous = val; }Есть вот такой пример. Допустим я убираю опрос с датчика, а переменную количества шагов приравниваю к часам. Скорость мне даст нужный промежуток между импульсами. (то что 4 пина, это пока не принципиально)
Количество шагов задается при создании объекта. Ничего из вашей задумки не выйдет.
в прошивке с колоколом МР3 не будет совсем.
Так зачем Вы это говно нам показываете?
в прошивке с колоколом МР3 не будет совсем.
Так зачем Вы это говно нам показываете?
А нахрена тогда просили всю прошивку выкатить?
Количество шагов задается при создании объекта. Ничего из вашей задумки не выйдет.
Это число шагов на 360 градусов. Так что нормальная идея, в принципе. К тому же библиотечки шаговых умеют в неблокирующем режиме работать, без delay и sms.
Количество шагов задается при создании объекта. Ничего из вашей задумки не выйдет.
Задаётся количество шагов на полный оборот мотора. А сколько шагов он сделает зависит от положения потенциометра. Вроде так.
А вот этот участок кода у вас работает?
... else if((hour==10) & (minute==0) & (second==0)){ ...тут же вместо логических операций битовые используются, как оно вообще работает? Или компилятор сам исправляет такое в ардуино?
А чем вообще вообще логические операции отличаются от битовых?
Только тем, что битовые работают с каждым битом числа, а логические работают с любым числом как с однобитным.
Но в логических переменных используется всего один бит. Результат конъюнкции или дизъюнкции при работе с такими переменными приводят к одному и тому же результату вне зависимости от того, логическая это операция или битовая (все биты кроме нулевого как были, так и останутся равными 0).
Другими словами, в данном конкретном случае (пока, например, не используются отрицания) это работает. Но гарантий, что будет продолжать работать и при усложнении выражений, естественно, нет.
Не прокатывает с этой библиотекой для шаговых моторов. Она тормозит выполнение кода пока шаговик работает....
Ну не может быть, что бы у такой простой задачи не было лёгкого решения.
Может так попробовать
const byte PIN = 2; // unsigned long on_ = 0; byte schet = 0; byte hours_ = 7; // например, пробить 7 часов bool ZVON = true; void setup() { pinMode(PIN, OUTPUT); } void loop() { if (ZVON) { if ((millis() - on_) >= 1000) { on_ = millis(); schet++; if (schet < 2) { digitalWrite(PIN, HIGH);//1сек сигнал } else { digitalWrite(PIN, LOW);//3сек пауза if (schet > 3) { hours_--; // количество сигналов schet = 0; } } if (hours_ == 0) { ZVON = false; } } } }Неправильно библиотеку используете, думаю. Должен у неё быть и неблокирующий ход.
Может так попробовать
const byte PIN = 2; // unsigned long on_ = 0; byte schet = 0; byte hours_ = 7; // например, пробить 7 часов bool ZVON = true; void setup() { pinMode(PIN, OUTPUT); } void loop() { if (ZVON) { if ((millis() - on_) >= 1000) { on_ = millis(); schet++; if (schet < 2) { digitalWrite(PIN, HIGH);//1сек сигнал } else { digitalWrite(PIN, LOW);//3сек пауза if (schet > 3) { hours_--; // количество сигналов schet = 0; } } if (hours_ == 0) { ZVON = false; } } } }Ну я типа таком и писал выше. ))
Может так попробовать
const byte PIN = 2; // unsigned long on_ = 0; byte schet = 0; byte hours_ = 7; // например, пробить 7 часов bool ZVON = true; void setup() { pinMode(PIN, OUTPUT); } void loop() { if (ZVON) { if ((millis() - on_) >= 1000) { on_ = millis(); schet++; if (schet < 2) { digitalWrite(PIN, HIGH);//1сек сигнал } else { digitalWrite(PIN, LOW);//3сек пауза if (schet > 3) { hours_--; // количество сигналов schet = 0; } } if (hours_ == 0) { ZVON = false; } } } }Ну я типа таком и писал выше. ))
Да почините уже сервер, задолбало!!!
Ну я типа таком и писал выше. ))
Да. похоже что так.
Когда-то Alexey_Rem показал мне пример (ещё раз ему спасибо), по сути это его разновидность,
где угодно может подойти)))
честно говоря, на практике не пробовал ещё. В описании библиотеки нашёл, что команда "шагать" останавливает выполнение кода до завершения действия. Ну это видимо самая простая библиотека и пример работает по принципу "блинк", действие происходит и ладно....
добился таки я результата. Пересмотрел уроки, всеми тут так не любимого, Гайвера и нашёл пару примеров из которых вывел нужный мне. потом подработал его по примеру от ВООМ. По сути можно было добиться полного выполнения исходной задачи, но вовремя себя остановил. Пришло понимание, что получить, например, в 8 вечера 20 сигналов, это явный перебор. Пока остановился на пяти. Но количество, длительность, пауза... это всё легко меняется и уже можно подогнать на конечном изделии. Главное часть кода сформирована и удачно вписалась в исходный код и проходит "обкатку" на готовых часах.
Как в китайском боевике: главный герой пошел учится к Великому мастеру(там ему открылась истина) и потом сам сам тал Великим воином и всех победил
Офигенный сюжет! Буду к этому стремиться.
Как в китайском боевике: главный герой пошел учится к Великому мастеру(там ему открылась истина)
не, конец другой - после обучения герою открыдась Истина, что бежать побеждать никого не надо, и он предался размышлениям и созерцанию тишины, в которой можно расслышать хлопок одной ладонью...
Думаю, это никакая не "динамика". а именно что попытка мигать цифрой. Только реализованное вообще без понимания предмета.
"Думать надо меньше, а соображать больше!" (с)
Ни какой попытки мигать цифрой тут нет! Ну и само собой это не динамическая индикация.... (тут я конечно тупанул) Это просто задержка, что бы действие не выполнялось несколько раз за кротчайший промежуток времени и всё! как я выяснил, это не редко практикуется не только для часов ГРИ, но и на других видах часов и вообще при выводе на экран или сегменты.
.... потом подработал его по примеру от ВООМ. .....
прошу прощения... пример был от Дим-мычъ.