Мигать значениями на экране

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015
Доброе время суток. Собрал часы с термометром и прочей шушерой. У меня к Вам два вопроса.
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();}

}

 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Аналоговые пины могут работать как цифровые, за некоторым исключением на некоторых платформах. Подключай пищалку на аналоговый.

По поводу мигания: таймер и флаг - виден ли текст. Прошёл интервал - меняешь флаг на противоположный и проверяешь: если выставлен - рисуешь текст, если сброшен - стираешь текст. Всё просто.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017
Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

Спасибо большое. Все получилось. Вместо кучи функций, одна маленькая и удобная.



 
//           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();}
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

это маленькое?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DetSimen пишет:

это маленькое?

Первая - маленькая, вторая - удобная.

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

Ну я не про весь код)) только про то как вызывается смена показаний на экране))