Официальный сайт компании Arduino по адресу arduino.cc
Часы на ГРИ. Как прикрутить некоторые функции?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Сб, 16/09/2017 - 19:12
Как в этот скетч прикрутить подачу сигнала каждый полный час? Хочу сделать меню чтобы биппер включался от логической еденицы. Например: часы на ГРИ 4 индикатора при начатии кнопки SET сначало включаслось: 1. Настройка времени, 2. Установка биппера вкл/выкл, 3. Отображение формата времени 12/24, 4. Защита от выгорания катодов.
#include <DS3231.h> #include <Wire.h> // выводы для дешифратора int out1 = A3; int out2 = A1; int out4 = A0; int out8 = A2; // выводы для транзисторных ключей int key1= 4; int key2 = 6; int key3 = 7; int key4 = 8; int led1=11;// вывод светодиода int keyb=A6;// пин для клавиатуры 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; void setup() { // put your setup code here, to run once: // задаем частоту ШИМ на 9 выводе 30кГц TCCR1B=TCCR1B&0b11111000|0x01; analogWrite(9,130); // Start the I2C interface Wire.begin(); // Start the serial interface Serial.begin(9600); //задаем режим работы выходов микроконтроллера 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); startTime = millis(); startTime2=startTime; sec = 0; // считываем текущее вермя ReadDS3231(); } void ReadDS3231() //функция считывает в глобальные переменные minute и hour текущие значения { minute=Clock.getMinute(); hour=Clock.getHour(h12, PM); } 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) // кнопка увеличения количества часов или минут(при настройке) { 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.println(blinkflag); } 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; show(digits); // вывести цифры на дисплей //проверяем нажатые кнопки 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; } }
Отвёрткой.
yaelectrik, покажите функции, которые нужно прикрутить.
uint8_t currentHour;
У меня пока только есть функция для биппера.
yaelectrik, у меня к Вам два вопроса:
1. Вы считаете, что loop - подходящее название функции для биппера?
2. Вы уверены, что Ваша "функция" компилируется? Функцию, которая не компилируется, прикрутить к проекту невозможно.
Я пробовал ее запускать в loop. Запустил по ней команду digitalWrite(bip,HIGH) c новым часом времени.
Неправильно. По часу бипнуть (выставить 1). Ничего не делать в течение длительности бипа (допустим полсекунды). Выставить ноль, дабы вернуть как было.
btw, а зачем выбор 12-24? часы делают под себя. Мне нра 24, и в моих вообще полностью, с корнями, нету ваще ваще режима на 12. Определитесь. И делайте.