Мигать значениями на экране
- Войдите на сайт для отправки комментариев
Ср, 23/05/2018 - 12:53
Доброе время суток. Собрал часы с термометром и прочей шушерой. У меня к Вам два вопроса.
1) Куда можно подключить пьезо пищалку? Свободных пинов не осталось кроме 0, 1 и аналоговых входов.
сейчас nrf24l01 и buzzer сидят вместе на 10 пине.
2) Как сделать что бы значения температуры, влажности, давления и второй температуры мигали по очереди с одинаковым интервалом?
Вот код приемника
// button[ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7][ 8][ 9].***
#define BUTTON_PIN 2, 3, 4, 5, 6, 7 //, 11, 21, 14, 22 // pins & buttons ***
// #define DURATION_BOUNCE 10 // custom settings
// #define DURATION_CLICK_DB 300
// #define DURATION_INACTIVITY_DN 1000
// #define DURATION_INACTIVITY_UP 5000
#define LDR_PIN A0 //считываем значения с A0
#include <BUTTON.h>
#include <Wire.h>
#include <DS3231.h>
#include <LiquidCrystal_I2C.h>
#include <BMP085.h>
#include <EEPROM.h>
DS3231 rtc(SDA, SCL);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Time RTC_Time;
BMP085 dps = BMP085();
//bmp180
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h> // https://github.com/maniacbug/RF24
const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба"
RF24 radio(8, 10); // CE, CSN
long Temperature = 0, Pressure = 0, Altitude = 0; //bmp180
int light = 9; //подсветка дисплея
int buzz = 10; //пьезо пищалка
float brightness = 255.00; //начальное значение яркости
float fadeAmount = 25.50; //шаг яркости
int brightness_auto = 255;
int MIN_BRIGHTNESS = 100; //значения при минимальной яркости
int MAX_BRIGHTNESS = 1023; //значенияе при максимальной яркости
int flagRead=0; //переменные для блинка
int flagReadA=0; //переменные для автовыключения будильника
int alarm_on = 0; //включение будильника
int regim=1; // режимы часов
int se=0; //настройка секунд
int th=0; //настройка часов времени
int tm=0; //настройка минут времени
int ah=0; //настройка часов будильника
int am=0; //настройка минут будильника
int as=0; //секунды будильника
int da=0; //число
int mo=0; //месяц
int we=0; //день недели
int ye=0; //год
int auto_light = 0; //режим автолайт по умолчанию выключен
int celsius; // Температура с ds18b20
int addr_al = 0; //ячейка EEPROM состояние будильника
int addr_ah = 1; //ячейка EEPROM часы в будильнике
int addr_am = 2; //ячейка EEPROM минуты в будильнике
int addr_li = 10; //ячейка EEPROM уровень яркости дисплея
int addr_auto_light = 80; //ячейка EEPROM режим автолайт состояние
char* weekday[8] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; //массив настройки дня недели
uint8_t bell[8] = {0x4, 0xe, 0xe, 0xe, 0x1f, 0x0, 0x4}; //колокольчик
uint8_t temp_cel[8] = {B00111, B00101, B00111, B00000, B00000, B00000, B00000}; //значок градуса
const int ADDR =0x40; //si7021
int X0,X1,Y0,Y1,Y2,Y3; //si7021
double X,Y,X_out,Y_out1,Y_out2; //si7021
void setup() {
Serial.begin(9600);
// button_pin_auto;
button_pin_pullUp;
// button_pin_pullDn;
pinMode(light, OUTPUT);
pinMode(buzz, OUTPUT);
Wire.begin();
rtc.begin();
lcd.begin();
lcd.clear();
lcd.createChar(0, bell); //колокольчик
lcd.createChar(1, temp_cel); //цельсии
Wire.beginTransmission(ADDR); //si7021
Wire.endTransmission(); //si7021
dps.init(MODE_STANDARD, 3200, true); //???????????
radio.begin();
delay(2);
radio.setChannel(9); // канал (0-127)
// скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
// RF24_250KBPS на nRF24L01 (без +) неработает.
// меньше скорость, выше чувствительность приемника.
radio.setDataRate(RF24_1MBPS);
// мощьность передатчика RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM,
radio.setPALevel(RF24_PA_HIGH);
radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe"
radio.startListening(); // включаем приемник, начинаем слушать трубу
}
void read_RTC(){ //читаем значение из часов
RTC_Time = rtc.getTime();
se = RTC_Time.sec;
th = RTC_Time.hour;
tm = RTC_Time.min;
da = RTC_Time.date;
mo = RTC_Time.mon;
ye = RTC_Time.year;
we = RTC_Time.dow;}
void printTime(){ //показ времени (и всего остального)
button_read; //читаем состояние кнопок
read_RTC(); //вызов функции с чтением времени
/*
if (radio.available()){ // проверяем не пришло ли чего в буфер.
radio.read(&celsius, sizeof(celsius/16.0)); // читаем данные, указываем сколько байт читать
}
Serial.println(celsius/16.0);
*/
if (button[3].event_click_Dn == 1) {SET_T();}
if (button[0].event_click_Dn == 1) {lcd.clear();SET_A();}
if (button[2].event_click_Dn == 1) {lcd.clear();SET_AUTO_LIGHT();}
lcd.setCursor(0, 0);
lcd.print(rtc.getTimeStr(FORMAT_SHORT)); //показать время
auto_light = EEPROM.read(addr_auto_light); //читаем состояние автолайт
alarm_on = EEPROM.read(addr_al); //читаем состояние буудильника
ah = EEPROM.read(addr_ah);
am = EEPROM.read(addr_am);
blink_tempin(flagRead * 3000); //показ температуры (смена каждые 3 сек)
lcd.setCursor(0, 1);
lcd.print(rtc.getDateStr());//показать дату
lcd.setCursor(13, 1);
lcd.print(rtc.getDOWStr(FORMAT_SHORT)); //показать день недели
if(alarm_on == 1){
lcd.setCursor(5, 0);lcd.write(0); //показать колокольчик
if(th==ah && tm==am && se==as){lcd.clear();Alarm_work();}}
else{lcd.setCursor(5, 0);lcd.print(" ");}}
void blink_tempin(unsigned long interval){ //показ температуры внутри
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
Wire.beginTransmission(ADDR);
Wire.write(0xE3);
Wire.endTransmission();
Wire.requestFrom(ADDR,2);
if(Wire.available()<=2);
{
X0 = Wire.read();
X1 = Wire.read();
X0 = X0<<8;
X_out = X0+X1;
}
X=(175.72*X_out)/65536;
X=X-46.85;
dps.getTemperature(&Temperature);
lcd.clear();
lcd.setCursor(7, 0);
lcd.print("IN");
lcd.print(((Temperature*0.1) + X + rtc.getTemp()) / 3); //среднее значение с 3 датчиков
lcd.write(1); //значок цельсий
lcd.print("C"); //цельсия
}
else{
blink_mmHg(flagRead * 3000);
flagRead = 1;}}}
void blink_mmHg(unsigned long interval){ // показ давления
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
dps.getPressure(&Pressure);
//dps.getAltitude(&Altitude);
lcd.clear();
lcd.setCursor(6, 0);
lcd.print(Pressure/133.3); //Выводим давление в мм.рт ст
lcd.print("mmHg"); //цельсия
}
else{
blink_rh(flagRead * 3000);
flagRead = 1;}}}
void blink_rh(unsigned long interval){ // показ влажности
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
Wire.beginTransmission(ADDR);
Wire.write(0xE3);
Wire.endTransmission();
Wire.beginTransmission(ADDR);
Wire.write(0xE5);
Wire.endTransmission();
Wire.requestFrom(ADDR,2);
if(Wire.available()<=2);{
Y0 = Wire.read();
Y2=Y0/100;
Y0=Y0%100;
Y1 = Wire.read();
Y_out1 = Y2*25600;
Y_out2 = Y0*256+Y1;}
Y_out1 = (125*Y_out1)/65536;
Y_out2 = (125*Y_out2)/65536;
Y = Y_out1+Y_out2;
Y=Y-6;
lcd.clear();
lcd.setCursor(8, 0);
lcd.print("RH");
lcd.print(Y);
lcd.print("%");
}
else{
blink_tempout(flagRead * 3000);
flagRead = 1;}}}
void blink_tempout(unsigned long interval){ // показ температуры снаружи
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
// код с показом температуры снаружи. (через nrf24l01)
//int celsius;
if (radio.available()){ // проверяем не пришло ли чего в буфер.
radio.read(&celsius, sizeof(celsius/16.0)); // читаем данные, указываем сколько байт читать
}
lcd.clear();
lcd.setCursor(6, 0);
lcd.print("OUT");
lcd.print(celsius/16.0); //среднее значение с 3 датчиков
lcd.write(1); //значок цельсий
lcd.print("C"); //цельсия
Serial.println(celsius/16.0);
}
else{
//blink_tempin(flagRead * 3000);
flagRead = 1;}}}
void SET_T(){ //установка времени
read_RTC();
regim=2;
while(regim==2){ //установка часов
button_read;
blink_th(flagRead * 250);
if (button[1].event_click_Dn == 1) {th++;}
if (button[2].event_click_Dn == 1) {th--;}
if(th>23){th=0;}if(th<0){th=23;}
if (button[3].event_click_Dn == 1) {regim++;}}
while(regim==3){ //установка минут
button_read;
blink_tm(flagRead * 250);
if (button[1].event_click_Dn == 1) {tm++;}
if (button[2].event_click_Dn == 1) {tm--;}
if(tm>59){tm=0;}if(tm<0){tm=59;}
if (button[3].event_click_Dn == 1) {rtc.setTime(th, tm, se);regim++;}}
while(regim==4){ //установка числа
button_read;
blink_da(flagRead * 250);
if (button[1].event_click_Dn == 1) {da++;}
if (button[2].event_click_Dn == 1) {da--;}
if(da>31){da=1;}if(da<1){da=31;}
if (button[3].event_click_Dn == 1) {regim++;}}
while(regim==5){ //установка месяца
button_read;
blink_mo(flagRead * 250);
if (button[1].event_click_Dn == 1) {mo++;}
if (button[2].event_click_Dn == 1) {mo--;}
if(mo>12){mo=1;}if(mo<1){mo=12;}
if (button[3].event_click_Dn == 1) {regim++;}}
while(regim==6){ //установка года
button_read;
blink_ye(flagRead * 250);
if (button[1].event_click_Dn == 1) {ye++;}
if (button[2].event_click_Dn == 1) {ye--;}
if(ye>2100){ye=2017;}if(ye<2017){ye=2100;}
if (button[3].event_click_Dn == 1) {rtc.setDate(da, mo, ye);regim++;}}
while(regim==7){ //установка дня недели
button_read;
blink_we(flagRead * 250);
if (button[1].event_click_Dn == 1) {we++;}
if (button[2].event_click_Dn == 1) {we--;}
if(we>7){we=1;}if(we<1){we=7;}
if (button[3].event_click_Dn == 1) {rtc.setDOW(we);regim=1;lcd.clear();}}}
void blink_th(unsigned long interval){ //мигаем переменной часов в установке
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
lcd.clear();
if(th<10){
lcd.setCursor(0, 0);
lcd.print("0");
lcd.setCursor(1, 0);}
lcd.print(th); //показать врем
lcd.print(":");
if(tm<10){
lcd.setCursor(3, 0);
lcd.print("0");
lcd.setCursor(4, 0);}
lcd.print(tm);
if(da<10){
lcd.setCursor(0, 1);
lcd.print("0");
lcd.setCursor(1, 1);}
else{lcd.setCursor(0, 1);}
lcd.print(da);//показать дату
lcd.print(".");
if(mo<10){
lcd.setCursor(3, 1);
lcd.print("0");
lcd.setCursor(4, 1);}
lcd.print(mo);
lcd.print(".");
lcd.print(ye);
lcd.print(" ");
lcd.print(rtc.getDOWStr(FORMAT_SHORT));//показать день недели
flagRead = 1;}
else{
lcd.setCursor(0, 0);
lcd.print(" ");
flagRead = 1;}}}
void blink_tm(unsigned long interval){ //мигаем переменной минут в установке
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
lcd.clear();
if(th<10){
lcd.setCursor(0, 0);
lcd.print("0");
lcd.setCursor(1, 0);}
lcd.print(th); //показать врем
lcd.print(":");
if(tm<10){
lcd.setCursor(3, 0);
lcd.print("0");
lcd.setCursor(4, 0);}
lcd.print(tm);
if(da<10){
lcd.setCursor(0, 1);
lcd.print("0");
lcd.setCursor(1, 1);}
else{lcd.setCursor(0, 1);}
lcd.print(da);//показать дату
lcd.print(".");
if(mo<10){
lcd.setCursor(3, 1);
lcd.print("0");
lcd.setCursor(4, 1);}
else{lcd.setCursor(3, 1);}
lcd.print(mo);
lcd.print(".");
lcd.print(ye);
lcd.print(" ");
lcd.print(rtc.getDOWStr(FORMAT_SHORT));//показать день недели
flagRead = 1;}
else{
lcd.setCursor(3, 0);
lcd.print(" ");
flagRead = 1;}}}
void blink_da(unsigned long interval){ //мигаем переменной число в установке
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
lcd.clear();
if(th<10){
lcd.setCursor(0, 0);
lcd.print("0");
lcd.setCursor(1, 0);}
lcd.print(th); //показать врем
lcd.print(":");
if(tm<10){
lcd.setCursor(3, 0);
lcd.print("0");
lcd.setCursor(4, 0);}
lcd.print(tm);
if(da<10){
lcd.setCursor(0, 1);
lcd.print("0");
lcd.setCursor(1, 1);}
else{lcd.setCursor(0, 1);}
lcd.print(da);//показать дату
lcd.print(".");
if(mo<10){
lcd.setCursor(3, 1);
lcd.print("0");
lcd.setCursor(4, 1);}
else{lcd.setCursor(3, 1);}
lcd.print(mo);
lcd.print(".");
lcd.print(ye);
lcd.print(" ");
lcd.print(rtc.getDOWStr(FORMAT_SHORT));//показать день недели
flagRead = 1;}
else{
lcd.setCursor(0, 1);
lcd.print(" ");
flagRead = 1;}}}
void blink_mo(unsigned long interval){ //мигаем переменной месяц в установке
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
lcd.clear();
if(th<10){
lcd.setCursor(0, 0);
lcd.print("0");
lcd.setCursor(1, 0);}
lcd.print(th); //показать врем
lcd.print(":");
if(tm<10){
lcd.setCursor(3, 0);
lcd.print("0");
lcd.setCursor(4, 0);}
lcd.print(tm);
if(da<10){
lcd.setCursor(0, 1);
lcd.print("0");
lcd.setCursor(1, 1);}
else{lcd.setCursor(0, 1);}
lcd.print(da);//показать дату
lcd.print(".");
if(mo<10){
lcd.setCursor(3, 1);
lcd.print("0");
lcd.setCursor(4, 1);}
else{lcd.setCursor(3, 1);}
lcd.print(mo);
lcd.print(".");
lcd.print(ye);
lcd.print(" ");
lcd.print(rtc.getDOWStr(FORMAT_SHORT));//показать день недели
flagRead = 1;}
else{
lcd.setCursor(3, 1);
lcd.print(" ");
flagRead = 1;}}}
void blink_ye(unsigned long interval){ //мигаем переменной год в установке
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
lcd.clear();
if(th<10){
lcd.setCursor(0, 0);
lcd.print("0");
lcd.setCursor(1, 0);}
lcd.print(th); //показать врем
lcd.print(":");
if(tm<10){
lcd.setCursor(3, 0);
lcd.print("0");
lcd.setCursor(4, 0);}
lcd.print(tm);
if(da<10){
lcd.setCursor(0, 1);
lcd.print("0");
lcd.setCursor(1, 1);}
else{lcd.setCursor(0, 1);}
lcd.print(da);//показать дату
lcd.print(".");
if(mo<10){
lcd.setCursor(3, 1);
lcd.print("0");
lcd.setCursor(4, 1);}
else{lcd.setCursor(3, 1);}
lcd.print(mo);
lcd.print(".");
lcd.print(ye);
lcd.print(" ");
lcd.print(rtc.getDOWStr(FORMAT_SHORT));//показать день недели
flagRead = 1;}
else{
lcd.setCursor(6, 1);
lcd.print(" ");
flagRead = 1;}}}
void blink_we(unsigned long interval){ //мигаем переменной день недели в установке
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
lcd.clear();
if(th<10){
lcd.setCursor(0, 0);
lcd.print("0");
lcd.setCursor(1, 0);}
lcd.print(th); //показать врем
lcd.print(":");
if(tm<10){
lcd.setCursor(3, 0);
lcd.print("0");
lcd.setCursor(4, 0);}
lcd.print(tm);
if(da<10){
lcd.setCursor(0, 1);
lcd.print("0");
lcd.setCursor(1, 1);}
else{lcd.setCursor(0, 1);}
lcd.print(da);//показать дату
lcd.print(".");
if(mo<10){
lcd.setCursor(3, 1);
lcd.print("0");
lcd.setCursor(4, 1);}
else{lcd.setCursor(3, 1);}
lcd.print(mo);
lcd.print(".");
lcd.print(ye);
lcd.print(" ");
if(we==7){lcd.print(weekday[0]);} //показать день недели
if(we==1){lcd.print(weekday[1]);}
if(we==2){lcd.print(weekday[2]);}
if(we==3){lcd.print(weekday[3]);}
if(we==4){lcd.print(weekday[4]);}
if(we==5){lcd.print(weekday[5]);}
if(we==6){lcd.print(weekday[6]);}
flagRead = 1;}
else{
lcd.setCursor(13, 1);
lcd.print(" ");
flagRead = 1;}}}
void SET_A(){
regim=2;
while(regim==2){ //включение отключение будильника
button_read;
if (button[1].event_click_Dn == 1) {alarm_on = !alarm_on;lcd.clear();}
if (button[2].event_click_Dn == 1) {alarm_on = !alarm_on;lcd.clear();}
lcd.setCursor(3, 0);
lcd.print("Alarm");
if(alarm_on == 1){blink_alarm_on(flagRead * 250);}
else{blink_alarm_off(flagRead * 250);}
ah = EEPROM.read(addr_ah);
am = EEPROM.read(addr_am);
lcd.setCursor(5, 1);
if(ah<10){lcd.setCursor(5, 1);lcd.print("0");lcd.setCursor(6, 1);}
lcd.print(ah);
lcd.setCursor(7, 1);
lcd.print(":");
if(am<10){lcd.setCursor(8, 1);lcd.print("0");lcd.setCursor(9, 1);}
lcd.print(am);
if (button[0].event_click_Dn == 1) {regim++;}}
while(regim==3){ //установка часов будильника
button_read;
blink_ah(flagRead * 250);
if (button[1].event_click_Dn == 1) {ah++;}
if (button[2].event_click_Dn == 1) {ah--;}
if(ah>23){ah=0;}if(ah<0){ah=23;}
if (button[0].event_click_Dn == 1) {regim++;}}
while(regim==4){ //установка минут будильника
button_read;
blink_am(flagRead * 250);
if (button[1].event_click_Dn == 1) {am++;}
if (button[2].event_click_Dn == 1) {am--;}
if(am>59){am=0;}if(am<0){am=59;}
if (button[0].event_click_Dn == 1) {
lcd.clear();
EEPROM.write(addr_al, alarm_on);
EEPROM.write(addr_ah, ah);
EEPROM.write(addr_am, am);
regim=1;}}}
void blink_alarm_on(unsigned long interval){
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
lcd.setCursor(10, 0);lcd.print("on");}
else{lcd.setCursor(10, 0);lcd.print(" ");flagRead = 1;}}}
void blink_alarm_off(unsigned long interval){
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){lcd.setCursor(10, 0);lcd.print("off");}
else{lcd.setCursor(10, 0);lcd.print(" ");flagRead = 1;}}}
void blink_ah(unsigned long interval){ //мигаем переменной включаем будильник
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("Alarm");
if(alarm_on == 1){lcd.setCursor(10, 0);lcd.print("on");}
else{lcd.setCursor(10, 0);lcd.print("off");}
lcd.setCursor(5, 1);
if(ah<10){lcd.setCursor(5, 1);lcd.print("0");lcd.setCursor(6, 1);}
lcd.print(ah);
lcd.setCursor(7, 1);
lcd.print(":");
if(am<10){lcd.setCursor(8, 1);lcd.print("0");lcd.setCursor(9, 1);}
lcd.print(am);
flagRead = 1;}
else{lcd.setCursor(5, 1);lcd.print(" ");flagRead = 1;}}}
void blink_am(unsigned long interval){ //мигаем переменной включаем будильник
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("Alarm");
if(alarm_on == 1){lcd.setCursor(10, 0);lcd.print("on");}
else{lcd.setCursor(10, 0);lcd.print("off");}
lcd.setCursor(5, 1);
if(ah<10){lcd.setCursor(5, 1);lcd.print("0");lcd.setCursor(6, 1);}
lcd.print(ah);
lcd.setCursor(7, 1);
lcd.print(":");
lcd.setCursor(8, 1);
if(am<10){lcd.setCursor(8, 1);lcd.print("0");lcd.setCursor(9, 1);}
lcd.print(am);
flagRead = 1;}
else{lcd.setCursor(8, 1);lcd.print(" ");flagRead = 1;}}}
void Alarm_work(){
regim=2;
while(regim==2){
button_read;
light_lcd(); //почему то мигает дисплеем(может так и лучше???)
Alarm_buzz(flagRead * 500);
lcd.setCursor(0, 0);
lcd.print("Alarm activated!");
lcd.setCursor(4, 1);
lcd.print(rtc.getTimeStr()); //показать время
Alarm_auto_off(flagReadA * 30000); //автовыключение будильника через 30 сек (получилось что через минуту???)
if (button[4].event_click_Dn == 1) {noTone(buzz);lcd.clear();regim=1;}}}
void Alarm_buzz(unsigned long interval){ //пищим будильником
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
tone(buzz, 500, 500);
flagRead = 1;}
else{
tone(buzz, 1000, 500);
flagRead = 1;}}}
void Alarm_auto_off(unsigned long interval){ ////автовыключение будильника через 30 сек
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
noTone(buzz);lcd.clear();regim=1;
flagReadA = 1;}}}
void SET_AUTO_LIGHT(){
regim=2;
while(regim==2){ //включение-отключение автолайт
button_read;
if (button[1].event_click_Dn == 1) {auto_light = !auto_light;lcd.clear();}
if (button[2].event_click_Dn == 1) {auto_light = !auto_light;lcd.clear();}
lcd.setCursor(0, 0);
lcd.print("Auto light:");
if(auto_light == 1){blink_auto_light_on(flagRead * 250);}
else{blink_auto_light_off(flagRead * 250);}
if (auto_light==1 && button[3].event_click_Dn == 1) {
lcd.clear();
EEPROM.write(addr_auto_light, auto_light);
lcd.clear();regim=1;
}
if (auto_light==0 && button[3].event_click_Dn == 1) {
lcd.clear();
EEPROM.write(addr_auto_light, auto_light);
regim=9;
}
}
while(regim==9){ //установка яркости обычного режима
button_read;
if (button[1].event_click_Dn == 1) {if(brightness < 255){brightness = brightness + fadeAmount;}}
if (button[2].event_click_Dn == 1) {if(brightness > 0){lcd.clear();brightness = brightness - fadeAmount;}}
lcd.setCursor(3, 0);
lcd.print("Set light");
lcd.setCursor(5, 1);
lcd.print(brightness/255*100);
if(brightness < 255){lcd.setCursor(10, 1);lcd.print("%");}
else{lcd.setCursor(11, 1);lcd.print("%");}
analogWrite(light, brightness);
if (button[3].event_click_Dn == 1) {
EEPROM.put(addr_li, brightness);
lcd.clear();regim=1;}}}
void blink_auto_light_on(unsigned long interval){
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
lcd.setCursor(12, 0);lcd.print("on");}
else{lcd.setCursor(12, 0);lcd.print("__");flagRead = 1;}}}
void blink_auto_light_off(unsigned long interval){
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){lcd.setCursor(12, 0);lcd.print("off");}
else{lcd.setCursor(12, 0);lcd.print("___");flagRead = 1;}}}
void light_lcd(){
EEPROM.get(addr_li, brightness);
analogWrite(light, brightness);
}
void auto_light_on(){
brightness_auto = analogRead(LDR_PIN);
brightness_auto = constrain(brightness_auto,MIN_BRIGHTNESS,MAX_BRIGHTNESS);
int ldr_value = map(brightness_auto, MAX_BRIGHTNESS, MIN_BRIGHTNESS, 0, 255);
analogWrite(light, ldr_value);
}
void loop() {
if(regim==1){printTime();}
if(auto_light==0){light_lcd();}
if(auto_light==1){auto_light_on();}
}
Аналоговые пины могут работать как цифровые, за некоторым исключением на некоторых платформах. Подключай пищалку на аналоговый.
По поводу мигания: таймер и флаг - виден ли текст. Прошёл интервал - меняешь флаг на противоположный и проверяешь: если выставлен - рисуешь текст, если сброшен - стираешь текст. Всё просто.
http://arduino.ru/forum/programmirovanie/tsikl-vmesto-delay-rabotaet-bud...
Спасибо большое. Все получилось. Вместо кучи функций, одна маленькая и удобная.
// button[ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7][ 8][ 9].*** #define BUTTON_PIN 2, 3, 4, 5, 6, 7 //, 11, 21, 14, 22 // pins & buttons *** // #define DURATION_BOUNCE 10 // custom settings // #define DURATION_CLICK_DB 300 // #define DURATION_INACTIVITY_DN 1000 // #define DURATION_INACTIVITY_UP 5000 #define LDR_PIN A0 //считываем значения с A0 #include <BUTTON.h> #include <Wire.h> #include <DS3231.h> #include <LiquidCrystal_I2C.h> #include <BMP085.h> #include <EEPROM.h> DS3231 rtc(SDA, SCL); LiquidCrystal_I2C lcd(0x27, 16, 2); Time RTC_Time; BMP085 dps = BMP085(); //bmp180 #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> // https://github.com/maniacbug/RF24 const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба" RF24 radio(8, 10); // CE, CSN long Temperature = 0, Pressure = 0, Altitude = 0; //bmp180 int light = 9; //подсветка дисплея int buzz = 10; //пьезо пищалка float brightness = 255.00; //начальное значение яркости float fadeAmount = 25.50; //шаг яркости int brightness_auto = 255; int MIN_BRIGHTNESS = 100; //значения при минимальной яркости int MAX_BRIGHTNESS = 1023; //значенияе при максимальной яркости int flagRead=0; //переменные для блинка int flagReadA=0; //переменные для автовыключения будильника int alarm_on = 0; //включение будильника int regim=1; // режимы часов int se=0; //настройка секунд int th=0; //настройка часов времени int tm=0; //настройка минут времени int ah=0; //настройка часов будильника int am=0; //настройка минут будильника int as=0; //секунды будильника int da=0; //число int mo=0; //месяц int we=0; //день недели int ye=0; //год int auto_light = 0; //режим автолайт по умолчанию выключен int celsius; // Температура с ds18b20 int addr_al = 0; //ячейка EEPROM состояние будильника int addr_ah = 1; //ячейка EEPROM часы в будильнике int addr_am = 2; //ячейка EEPROM минуты в будильнике int addr_li = 10; //ячейка EEPROM уровень яркости дисплея int addr_auto_light = 80; //ячейка EEPROM режим автолайт состояние char* weekday[8] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; //массив настройки дня недели uint8_t bell[8] = {0x4, 0xe, 0xe, 0xe, 0x1f, 0x0, 0x4}; //колокольчик uint8_t temp_cel[8] = {B00111, B00101, B00111, B00000, B00000, B00000, B00000}; //значок градуса const int ADDR =0x40; //si7021 int X0,X1,Y0,Y1,Y2,Y3; //si7021 double X,Y,X_out,Y_out1,Y_out2; //si7021 #include <SimpleTimer.h> // Подключаем библиотеку SimpleTimer SimpleTimer timer; // Создаем объект SimpleTimer с именем timer int ID_TEMP; // Тут хранится ID (номер) таймера void setup() { // put your setup code here, to run once: Serial.begin(9600); // button_pin_auto; button_pin_pullUp; // button_pin_pullDn; pinMode(light, OUTPUT); pinMode(buzz, OUTPUT); Wire.begin(); rtc.begin(); lcd.begin(); lcd.clear(); lcd.createChar(0, bell); //колокольчик lcd.createChar(1, temp_cel); //цельсии Wire.beginTransmission(ADDR); //si7021 Wire.endTransmission(); //si7021 dps.init(MODE_STANDARD, 3200, true); //??????????? radio.begin(); delay(2); radio.setChannel(9); // канал (0-127) radio.setDataRate(RF24_1MBPS); radio.setPALevel(RF24_PA_HIGH); radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe" radio.startListening(); // включаем приемник, начинаем слушать трубу ID_TEMP = timer.setInterval(2000, TEMP); timer.disable(ID_TEMP); timer.setTimeout(5000, Start); timer.setTimer(1000, TimerToStart, 5); } void Start() { Serial.println("START"); timer.enable(ID_TEMP); } void TimerToStart() { static int count=1; Serial.println(count); count++; //if (count == 5) {Start();} } void read_RTC(){ //читаем значение из часов RTC_Time = rtc.getTime(); se = RTC_Time.sec; th = RTC_Time.hour; tm = RTC_Time.min; da = RTC_Time.date; mo = RTC_Time.mon; ye = RTC_Time.year; we = RTC_Time.dow;} void printTime(){ //показ времени (и всего остального) button_read; //читаем состояние кнопок read_RTC(); //вызов функции с чтением времени /* if (radio.available()){ // проверяем не пришло ли чего в буфер. radio.read(&celsius, sizeof(celsius/16.0)); // читаем данные, указываем сколько байт читать } Serial.println(celsius/16.0); */ if (button[3].event_click_Dn == 1) {SET_T();} if (button[0].event_click_Dn == 1) {lcd.clear();SET_A();} if (button[2].event_click_Dn == 1) {lcd.clear();SET_AUTO_LIGHT();} lcd.setCursor(0, 0); lcd.print(rtc.getTimeStr(FORMAT_SHORT)); //показать время auto_light = EEPROM.read(addr_auto_light); //читаем состояние автолайт alarm_on = EEPROM.read(addr_al); //читаем состояние буудильника ah = EEPROM.read(addr_ah); am = EEPROM.read(addr_am); //blink_tempin(flagRead * 3000); //показ температуры (смена каждые 3 сек) timer.run(); // Вот где происходит "опрос" lcd.setCursor(0, 1); lcd.print(rtc.getDateStr());//показать дату lcd.setCursor(13, 1); lcd.print(rtc.getDOWStr(FORMAT_SHORT)); //показать день недели if(alarm_on == 1){ lcd.setCursor(5, 0);lcd.write(0); //показать колокольчик if(th==ah && tm==am && se==as){lcd.clear();Alarm_work();}} else{lcd.setCursor(5, 0);lcd.print(" ");}} void TEMP() // Вызываем смену температур { // Создаем переменные значение которых хранится в памяти, а не инициализируется каждый раз заново // за это отвечает static static int flagRoute = 0; // Напрявление вращения то есть отнимаем или прибавляем в переменную i switch(flagRoute){ case 0: // Если flagRoute равен 0 то выполним следующий код Wire.beginTransmission(ADDR); Wire.write(0xE3); Wire.endTransmission(); Wire.requestFrom(ADDR,2); if(Wire.available()<=2); { X0 = Wire.read(); X1 = Wire.read(); X0 = X0<<8; X_out = X0+X1; } X=(175.72*X_out)/65536; X=X-46.85; dps.getTemperature(&Temperature); lcd.clear(); lcd.setCursor(7, 0); lcd.print("IN"); lcd.print(((Temperature*0.1) + X + rtc.getTemp()) / 3); //среднее значение с 3 датчиков lcd.write(1); //значок цельсий lcd.print("C"); //цельсия flagRoute = 1; break; case 1: flagRoute = 2; dps.getPressure(&Pressure); //dps.getAltitude(&Altitude); lcd.clear(); lcd.setCursor(6, 0); lcd.print(Pressure/133.3); //Выводим давление в мм.рт ст lcd.print("mmHg"); //цельсия break; case 2: flagRoute = 3; Wire.beginTransmission(ADDR); Wire.write(0xE3); Wire.endTransmission(); Wire.beginTransmission(ADDR); Wire.write(0xE5); Wire.endTransmission(); Wire.requestFrom(ADDR,2); if(Wire.available()<=2);{ Y0 = Wire.read(); Y2=Y0/100; Y0=Y0%100; Y1 = Wire.read(); Y_out1 = Y2*25600; Y_out2 = Y0*256+Y1;} Y_out1 = (125*Y_out1)/65536; Y_out2 = (125*Y_out2)/65536; Y = Y_out1+Y_out2; Y=Y-6; lcd.clear(); lcd.setCursor(8, 0); lcd.print("RH"); lcd.print(Y); lcd.print("%"); break; case 3: flagRoute = 0; if (radio.available()){ // проверяем не пришло ли чего в буфер. radio.read(&celsius, sizeof(celsius/16.0)); // читаем данные, указываем сколько байт читать } lcd.clear(); lcd.setCursor(6, 0); lcd.print("OUT"); lcd.print(celsius/16.0); //среднее значение с 3 датчиков lcd.write(1); //значок цельсий lcd.print("C"); //цельсия break; } } void SET_T(){ //установка времени read_RTC(); regim=2; while(regim==2){ //установка часов button_read; blink_th(flagRead * 250); if (button[1].event_click_Dn == 1) {th++;} if (button[2].event_click_Dn == 1) {th--;} if(th>23){th=0;}if(th<0){th=23;} if (button[3].event_click_Dn == 1) {regim++;}} while(regim==3){ //установка минут button_read; blink_tm(flagRead * 250); if (button[1].event_click_Dn == 1) {tm++;} if (button[2].event_click_Dn == 1) {tm--;} if(tm>59){tm=0;}if(tm<0){tm=59;} if (button[3].event_click_Dn == 1) {rtc.setTime(th, tm, se);regim++;}} while(regim==4){ //установка числа button_read; blink_da(flagRead * 250); if (button[1].event_click_Dn == 1) {da++;} if (button[2].event_click_Dn == 1) {da--;} if(da>31){da=1;}if(da<1){da=31;} if (button[3].event_click_Dn == 1) {regim++;}} while(regim==5){ //установка месяца button_read; blink_mo(flagRead * 250); if (button[1].event_click_Dn == 1) {mo++;} if (button[2].event_click_Dn == 1) {mo--;} if(mo>12){mo=1;}if(mo<1){mo=12;} if (button[3].event_click_Dn == 1) {regim++;}} while(regim==6){ //установка года button_read; blink_ye(flagRead * 250); if (button[1].event_click_Dn == 1) {ye++;} if (button[2].event_click_Dn == 1) {ye--;} if(ye>2100){ye=2017;}if(ye<2017){ye=2100;} if (button[3].event_click_Dn == 1) {rtc.setDate(da, mo, ye);regim++;}} while(regim==7){ //установка дня недели button_read; blink_we(flagRead * 250); if (button[1].event_click_Dn == 1) {we++;} if (button[2].event_click_Dn == 1) {we--;} if(we>7){we=1;}if(we<1){we=7;} if (button[3].event_click_Dn == 1) {rtc.setDOW(we);regim=1;lcd.clear();}}} void blink_th(unsigned long interval){ //мигаем переменной часов в установке static unsigned long prevTime=0; if(millis() - prevTime > interval){ static boolean flag = 0; prevTime = millis(); flag =! flag; if(flag){ lcd.clear(); if(th<10){ lcd.setCursor(0, 0); lcd.print("0"); lcd.setCursor(1, 0);} lcd.print(th); //показать врем lcd.print(":"); if(tm<10){ lcd.setCursor(3, 0); lcd.print("0"); lcd.setCursor(4, 0);} lcd.print(tm); if(da<10){ lcd.setCursor(0, 1); lcd.print("0"); lcd.setCursor(1, 1);} else{lcd.setCursor(0, 1);} lcd.print(da);//показать дату lcd.print("."); if(mo<10){ lcd.setCursor(3, 1); lcd.print("0"); lcd.setCursor(4, 1);} lcd.print(mo); lcd.print("."); lcd.print(ye); lcd.print(" "); lcd.print(rtc.getDOWStr(FORMAT_SHORT));//показать день недели flagRead = 1;} else{ lcd.setCursor(0, 0); lcd.print(" "); flagRead = 1;}}} void blink_tm(unsigned long interval){ //мигаем переменной минут в установке static unsigned long prevTime=0; if(millis() - prevTime > interval){ static boolean flag = 0; prevTime = millis(); flag =! flag; if(flag){ lcd.clear(); if(th<10){ lcd.setCursor(0, 0); lcd.print("0"); lcd.setCursor(1, 0);} lcd.print(th); //показать врем lcd.print(":"); if(tm<10){ lcd.setCursor(3, 0); lcd.print("0"); lcd.setCursor(4, 0);} lcd.print(tm); if(da<10){ lcd.setCursor(0, 1); lcd.print("0"); lcd.setCursor(1, 1);} else{lcd.setCursor(0, 1);} lcd.print(da);//показать дату lcd.print("."); if(mo<10){ lcd.setCursor(3, 1); lcd.print("0"); lcd.setCursor(4, 1);} else{lcd.setCursor(3, 1);} lcd.print(mo); lcd.print("."); lcd.print(ye); lcd.print(" "); lcd.print(rtc.getDOWStr(FORMAT_SHORT));//показать день недели flagRead = 1;} else{ lcd.setCursor(3, 0); lcd.print(" "); flagRead = 1;}}} void blink_da(unsigned long interval){ //мигаем переменной число в установке static unsigned long prevTime=0; if(millis() - prevTime > interval){ static boolean flag = 0; prevTime = millis(); flag =! flag; if(flag){ lcd.clear(); if(th<10){ lcd.setCursor(0, 0); lcd.print("0"); lcd.setCursor(1, 0);} lcd.print(th); //показать врем lcd.print(":"); if(tm<10){ lcd.setCursor(3, 0); lcd.print("0"); lcd.setCursor(4, 0);} lcd.print(tm); if(da<10){ lcd.setCursor(0, 1); lcd.print("0"); lcd.setCursor(1, 1);} else{lcd.setCursor(0, 1);} lcd.print(da);//показать дату lcd.print("."); if(mo<10){ lcd.setCursor(3, 1); lcd.print("0"); lcd.setCursor(4, 1);} else{lcd.setCursor(3, 1);} lcd.print(mo); lcd.print("."); lcd.print(ye); lcd.print(" "); lcd.print(rtc.getDOWStr(FORMAT_SHORT));//показать день недели flagRead = 1;} else{ lcd.setCursor(0, 1); lcd.print(" "); flagRead = 1;}}} void blink_mo(unsigned long interval){ //мигаем переменной месяц в установке static unsigned long prevTime=0; if(millis() - prevTime > interval){ static boolean flag = 0; prevTime = millis(); flag =! flag; if(flag){ lcd.clear(); if(th<10){ lcd.setCursor(0, 0); lcd.print("0"); lcd.setCursor(1, 0);} lcd.print(th); //показать врем lcd.print(":"); if(tm<10){ lcd.setCursor(3, 0); lcd.print("0"); lcd.setCursor(4, 0);} lcd.print(tm); if(da<10){ lcd.setCursor(0, 1); lcd.print("0"); lcd.setCursor(1, 1);} else{lcd.setCursor(0, 1);} lcd.print(da);//показать дату lcd.print("."); if(mo<10){ lcd.setCursor(3, 1); lcd.print("0"); lcd.setCursor(4, 1);} else{lcd.setCursor(3, 1);} lcd.print(mo); lcd.print("."); lcd.print(ye); lcd.print(" "); lcd.print(rtc.getDOWStr(FORMAT_SHORT));//показать день недели flagRead = 1;} else{ lcd.setCursor(3, 1); lcd.print(" "); flagRead = 1;}}} void blink_ye(unsigned long interval){ //мигаем переменной год в установке static unsigned long prevTime=0; if(millis() - prevTime > interval){ static boolean flag = 0; prevTime = millis(); flag =! flag; if(flag){ lcd.clear(); if(th<10){ lcd.setCursor(0, 0); lcd.print("0"); lcd.setCursor(1, 0);} lcd.print(th); //показать врем lcd.print(":"); if(tm<10){ lcd.setCursor(3, 0); lcd.print("0"); lcd.setCursor(4, 0);} lcd.print(tm); if(da<10){ lcd.setCursor(0, 1); lcd.print("0"); lcd.setCursor(1, 1);} else{lcd.setCursor(0, 1);} lcd.print(da);//показать дату lcd.print("."); if(mo<10){ lcd.setCursor(3, 1); lcd.print("0"); lcd.setCursor(4, 1);} else{lcd.setCursor(3, 1);} lcd.print(mo); lcd.print("."); lcd.print(ye); lcd.print(" "); lcd.print(rtc.getDOWStr(FORMAT_SHORT));//показать день недели flagRead = 1;} else{ lcd.setCursor(6, 1); lcd.print(" "); flagRead = 1;}}} void blink_we(unsigned long interval){ //мигаем переменной день недели в установке static unsigned long prevTime=0; if(millis() - prevTime > interval){ static boolean flag = 0; prevTime = millis(); flag =! flag; if(flag){ lcd.clear(); if(th<10){ lcd.setCursor(0, 0); lcd.print("0"); lcd.setCursor(1, 0);} lcd.print(th); //показать врем lcd.print(":"); if(tm<10){ lcd.setCursor(3, 0); lcd.print("0"); lcd.setCursor(4, 0);} lcd.print(tm); if(da<10){ lcd.setCursor(0, 1); lcd.print("0"); lcd.setCursor(1, 1);} else{lcd.setCursor(0, 1);} lcd.print(da);//показать дату lcd.print("."); if(mo<10){ lcd.setCursor(3, 1); lcd.print("0"); lcd.setCursor(4, 1);} else{lcd.setCursor(3, 1);} lcd.print(mo); lcd.print("."); lcd.print(ye); lcd.print(" "); if(we==7){lcd.print(weekday[0]);} //показать день недели if(we==1){lcd.print(weekday[1]);} if(we==2){lcd.print(weekday[2]);} if(we==3){lcd.print(weekday[3]);} if(we==4){lcd.print(weekday[4]);} if(we==5){lcd.print(weekday[5]);} if(we==6){lcd.print(weekday[6]);} flagRead = 1;} else{ lcd.setCursor(13, 1); lcd.print(" "); flagRead = 1;}}} void SET_A(){ regim=2; while(regim==2){ //включение отключение будильника button_read; if (button[1].event_click_Dn == 1) {alarm_on = !alarm_on;lcd.clear();} if (button[2].event_click_Dn == 1) {alarm_on = !alarm_on;lcd.clear();} lcd.setCursor(3, 0); lcd.print("Alarm"); if(alarm_on == 1){blink_alarm_on(flagRead * 250);} else{blink_alarm_off(flagRead * 250);} ah = EEPROM.read(addr_ah); am = EEPROM.read(addr_am); lcd.setCursor(5, 1); if(ah<10){lcd.setCursor(5, 1);lcd.print("0");lcd.setCursor(6, 1);} lcd.print(ah); lcd.setCursor(7, 1); lcd.print(":"); if(am<10){lcd.setCursor(8, 1);lcd.print("0");lcd.setCursor(9, 1);} lcd.print(am); if (button[0].event_click_Dn == 1) {regim++;}} while(regim==3){ //установка часов будильника button_read; blink_ah(flagRead * 250); if (button[1].event_click_Dn == 1) {ah++;} if (button[2].event_click_Dn == 1) {ah--;} if(ah>23){ah=0;}if(ah<0){ah=23;} if (button[0].event_click_Dn == 1) {regim++;}} while(regim==4){ //установка минут будильника button_read; blink_am(flagRead * 250); if (button[1].event_click_Dn == 1) {am++;} if (button[2].event_click_Dn == 1) {am--;} if(am>59){am=0;}if(am<0){am=59;} if (button[0].event_click_Dn == 1) { lcd.clear(); EEPROM.write(addr_al, alarm_on); EEPROM.write(addr_ah, ah); EEPROM.write(addr_am, am); regim=1;}}} void blink_alarm_on(unsigned long interval){ static unsigned long prevTime=0; if(millis() - prevTime > interval){ static boolean flag = 0; prevTime = millis(); flag =! flag; if(flag){ lcd.setCursor(10, 0);lcd.print("on");} else{lcd.setCursor(10, 0);lcd.print(" ");flagRead = 1;}}} void blink_alarm_off(unsigned long interval){ static unsigned long prevTime=0; if(millis() - prevTime > interval){ static boolean flag = 0; prevTime = millis(); flag =! flag; if(flag){lcd.setCursor(10, 0);lcd.print("off");} else{lcd.setCursor(10, 0);lcd.print(" ");flagRead = 1;}}} void blink_ah(unsigned long interval){ //мигаем переменной включаем будильник static unsigned long prevTime=0; if(millis() - prevTime > interval){ static boolean flag = 0; prevTime = millis(); flag =! flag; if(flag){ lcd.clear(); lcd.setCursor(3, 0); lcd.print("Alarm"); if(alarm_on == 1){lcd.setCursor(10, 0);lcd.print("on");} else{lcd.setCursor(10, 0);lcd.print("off");} lcd.setCursor(5, 1); if(ah<10){lcd.setCursor(5, 1);lcd.print("0");lcd.setCursor(6, 1);} lcd.print(ah); lcd.setCursor(7, 1); lcd.print(":"); if(am<10){lcd.setCursor(8, 1);lcd.print("0");lcd.setCursor(9, 1);} lcd.print(am); flagRead = 1;} else{lcd.setCursor(5, 1);lcd.print(" ");flagRead = 1;}}} void blink_am(unsigned long interval){ //мигаем переменной включаем будильник static unsigned long prevTime=0; if(millis() - prevTime > interval){ static boolean flag = 0; prevTime = millis(); flag =! flag; if(flag){ lcd.clear(); lcd.setCursor(3, 0); lcd.print("Alarm"); if(alarm_on == 1){lcd.setCursor(10, 0);lcd.print("on");} else{lcd.setCursor(10, 0);lcd.print("off");} lcd.setCursor(5, 1); if(ah<10){lcd.setCursor(5, 1);lcd.print("0");lcd.setCursor(6, 1);} lcd.print(ah); lcd.setCursor(7, 1); lcd.print(":"); lcd.setCursor(8, 1); if(am<10){lcd.setCursor(8, 1);lcd.print("0");lcd.setCursor(9, 1);} lcd.print(am); flagRead = 1;} else{lcd.setCursor(8, 1);lcd.print(" ");flagRead = 1;}}} void Alarm_work(){ regim=2; while(regim==2){ button_read; light_lcd(); //почему то мигает дисплеем(может так и лучше???) Alarm_buzz(flagRead * 500); lcd.setCursor(0, 0); lcd.print("Alarm activated!"); lcd.setCursor(4, 1); lcd.print(rtc.getTimeStr()); //показать время Alarm_auto_off(flagReadA * 30000); //автовыключение будильника через 30 сек (получилось что через минуту???) if (button[4].event_click_Dn == 1) {noTone(buzz);lcd.clear();regim=1;}}} void Alarm_buzz(unsigned long interval){ //пищим будильником static unsigned long prevTime=0; if(millis() - prevTime > interval){ static boolean flag = 0; prevTime = millis(); flag =! flag; if(flag){ tone(buzz, 500, 500); flagRead = 1;} else{ tone(buzz, 1000, 500); flagRead = 1;}}} void Alarm_auto_off(unsigned long interval){ ////автовыключение будильника через 30 сек static unsigned long prevTime=0; if(millis() - prevTime > interval){ static boolean flag = 0; prevTime = millis(); flag =! flag; if(flag){ noTone(buzz);lcd.clear();regim=1; flagReadA = 1;}}} void SET_AUTO_LIGHT(){ regim=2; while(regim==2){ //включение-отключение автолайт button_read; if (button[1].event_click_Dn == 1) {auto_light = !auto_light;lcd.clear();} if (button[2].event_click_Dn == 1) {auto_light = !auto_light;lcd.clear();} lcd.setCursor(0, 0); lcd.print("Auto light:"); if(auto_light == 1){blink_auto_light_on(flagRead * 250);} else{blink_auto_light_off(flagRead * 250);} if (auto_light==1 && button[3].event_click_Dn == 1) { lcd.clear(); EEPROM.write(addr_auto_light, auto_light); lcd.clear();regim=1; } if (auto_light==0 && button[3].event_click_Dn == 1) { lcd.clear(); EEPROM.write(addr_auto_light, auto_light); regim=9; } } while(regim==9){ //установка яркости обычного режима button_read; if (button[1].event_click_Dn == 1) {if(brightness < 255){brightness = brightness + fadeAmount;}} if (button[2].event_click_Dn == 1) {if(brightness > 0){lcd.clear();brightness = brightness - fadeAmount;}} lcd.setCursor(3, 0); lcd.print("Set light"); lcd.setCursor(5, 1); lcd.print(brightness/255*100); if(brightness < 255){lcd.setCursor(10, 1);lcd.print("%");} else{lcd.setCursor(11, 1);lcd.print("%");} analogWrite(light, brightness); if (button[3].event_click_Dn == 1) { EEPROM.put(addr_li, brightness); lcd.clear();regim=1;}}} void blink_auto_light_on(unsigned long interval){ static unsigned long prevTime=0; if(millis() - prevTime > interval){ static boolean flag = 0; prevTime = millis(); flag =! flag; if(flag){ lcd.setCursor(12, 0);lcd.print("on");} else{lcd.setCursor(12, 0);lcd.print("__");flagRead = 1;}}} void blink_auto_light_off(unsigned long interval){ static unsigned long prevTime=0; if(millis() - prevTime > interval){ static boolean flag = 0; prevTime = millis(); flag =! flag; if(flag){lcd.setCursor(12, 0);lcd.print("off");} else{lcd.setCursor(12, 0);lcd.print("___");flagRead = 1;}}} void light_lcd(){ EEPROM.get(addr_li, brightness); analogWrite(light, brightness); } void auto_light_on(){ brightness_auto = analogRead(LDR_PIN); brightness_auto = constrain(brightness_auto,MIN_BRIGHTNESS,MAX_BRIGHTNESS); int ldr_value = map(brightness_auto, MAX_BRIGHTNESS, MIN_BRIGHTNESS, 0, 255); analogWrite(light, ldr_value); } void loop() { // put your main code here, to run repeatedly: if(regim==1){printTime();} if(auto_light==0){light_lcd();} if(auto_light==1){auto_light_on();} }это маленькое?
это маленькое?
Первая - маленькая, вторая - удобная.
Ну я не про весь код)) только про то как вызывается смена показаний на экране))