Нужна помощь в коде.

Cessi71
Offline
Зарегистрирован: 21.05.2016

Доброго времени суток уважаемое сообщество.

Недавно купил Ардуину и решил что-нибудь сделать. Ардуина у меня 1.5 недели , с С## разбираюсь неделю с нуля (сам). Когда то давно(очень) изучал бейсик. Прошу сильно не смеятся с кода. Что-то вычитал сдесь, что-то на других ресурсах... 

Банальный градусник с двумя датчиками температуры, барометр и датчик влажности плюс часы. Все это выводится на индикатор 20х4. Имеются три кнопки для настройки часов. Кнопка "Меню" при длительном нажатии -вход в режим настройки(ей же перемещаемся по часам, минутам, секундам и дням) и кнопки + и -(увеличить или уменьшить значение). Стоит фотоприемник. С пульта ИК, кнопкой можно вкл/выкл подсветку индикатора. Кнопка пульта запоминается в EEPROM. Понимаю что у меня получился быдлокод - просьба ткните носом в особо бесграмотные места.

Помощ нужна :  как сделать что бы запрограмированная на вкл /выкл подсветки кнопка ИК пульта при длительном удержании вызавала функцию настройки часов???? Хотя бы алгоритм.... За пример с подробными коментариями буду в двойне благодарен.

#include <EEPROM.h>
#include <IRremote.h>
#include <class_noDELAY.h>
#include <LCD_1602_RUS.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <DHT.h>
#include <RTC.h>
#include "sav_button.h"

LCD_1602_RUS lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 20 chars and 4 line display

int RECV_PIN = 11; //вход ИК приемника
IRrecv irrecv(RECV_PIN);
decode_results results;

RTC  time;
Adafruit_BMP085 bmp;
#define DHTPIN 2     // PIN подключения DHT
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321 тип датчика
DHT dht(DHTPIN, DHTTYPE);

SButton button_Men(4,50,1000,4000,500);   //---кнопка меню
SButton button_PL(5,50,1000,4000,500);    //---кнопка +
SButton button_MN(6,50,1000,4000,500);    //---кнопка-

noDELAY nD_CL;    //---задержка обновления часов
noDELAY nD_DHT;   //---задержка обновления DHT
noDELAY nD_BMP;   //---задержка обновления BMP


bool lc = false;  //---состояние подсветки экрана
long result;      //---код кнопки ИК пульта из EEPROM
long ir_lc;       //---код принятый с пульта


void setup() {
  delay(300);
  lcd.init();
  lcd.backlight();
  button_Men.begin();
  button_PL.begin();
  button_MN.begin();
  irrecv.enableIRIn(); // включить приемник
  
//	инициализация модуля RTC
	time.begin(RTC_DS3231);			// на базе чипа DS3231						модуль подключается к аппаратным выводам I2C
  dht.begin();                //  инициализация модуля DHT
  bmp.begin();                //  инициализация модуля BMP
  
  //	установка даты и времени
	//  time.settime(0,44,10,28,04,16,3);	// 0  сек, 17 мин, 15 час, 1, октября, 2015 года, четверг
  //  time.settime(35,10,20);			// 35 сек, 10 мин, 20 час, дату оставить без изменений
  //	time.settime(-1,-1,-1,31,12,15);	// 31, декабря, 2015 года, время и день недели оставить без изменений
  nD_CL.start();
  nD_BMP.start();
  nD_DHT.start();
    // получение данных с DHT
  //int h = dht.readHumidity();
  //int t = dht.readTemperature();
  
  //отрисовка экрана
  lcd.setCursor(0,3);
  lcd.print(L"ВЛАЖНОСТЬ:");
  lcd.setCursor(19,3);
  lcd.print("%");
  lcd.setCursor(7,1);
  lcd.setCursor(0,1);
  lcd.print(L"ТЕМП: ");  
  lcd.setCursor(12,1);
  lcd.print(L"°");
  lcd.setCursor(19,1);
  lcd.print(L"°"); 
  lcd.setCursor(0,2);
  lcd.print(L"ДАВЛЕНИЕ:");
  lcd.setCursor(18,2);
  lcd.print(L"мм");
  lcd.setCursor(11,2);
  lcd.print(bmp.readPressure()/133.3,0);
  lcd.setCursor(7,1);
  lcd.print(bmp.readTemperature(),1); 
  //читаем EEPROM кнопку
  int address=0;
  EEPROM.get( address, result );
  
  
Serial.begin(9600); 
  
}
//********************************************************************

void loop() 
{
  nD_CL.read(1000);    
  nD_BMP.read(10000);
  nD_DHT.read(2000);
  lcd.noBlink();
  
//*********************Задержка и вывод времени******************************************
  if (nD_CL.tick)
  {
  lcd.setCursor(0,0);
  lcd.print(time.gettime("d-m, H:i:s, D"));
  }
//*********************Задержка вывода датчиков***************************************
  if (nD_DHT.tick)
  {
  //int h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  //int t = dht.readTemperature();  
  lcd.setCursor(14,1);
  lcd.print(dht.readTemperature(),1);
  lcd.setCursor(11,3);
  lcd.print(dht.readHumidity(),0); 
  }
  if (nD_BMP.tick)
  {
  lcd.setCursor(11,2);
  lcd.print(bmp.readPressure()/133.3,0);
  lcd.setCursor(7,1);
  lcd.print(bmp.readTemperature(),1);     
   }
//------------------вход в режим настройки часов длительным нажатием кнопки меню-------------------------  
    switch( button_Men.Loop() )
  {
       case SB_LONG_CLICK:
       set_sh();
       break;
   }   
 //--------------обработка команд пульта-----------------------  
   //Serial.print(lc);
   int x=0;
   if (irrecv.decode(&results))
  {
  long ir_lc=results.value;
  Serial.println(results.value);
  if (ir_lc == result )     //---если нажетая кнопка на пульте совпадает со считанной из памяти
  {
   //----меняем состояние подсветки
   if (lc == false){lcd.noBacklight(); lc = !lc; }  
       else {lcd.backlight(); lc = !lc;}     
  
  irrecv.resume();
  }


 
// -------------вызов функции обучения и запоминания пульта длительным нажатием +  -------------------
    switch( button_PL.Loop() )
  {
    case SB_LONG_CLICK:
    IR_liarn(  ir_lc);
    break;  
  }
}
//************************************************************************************************
//******************************конец основной программы******************************************
//************************************************************************************************

//************************************************************************************************
//*****************************функция установки часов********************************************
void set_sh()
    {
   unsigned long currentMillis; 
   long previousMillis=millis();  
  //int Dn;
  //int ms;
  //int gd;
   int  kurs=8;
   lcd.setCursor(8,0);
   lcd.blink();
  //
setp:
  currentMillis = millis();
  //n=currentMillis - previousMillis;
// Если ни чего не делали выход из режима установки времени автоматически 
    if( currentMillis - previousMillis > 20000) {
    return;
    }    


// задержка обновления часов на экране 1сек
   nD_CL.read(1000);
   //считывание текущего времени
   int Dn=time.weekday;
   int sh=time.Hours;
   int mn=time.minutes;
   int sc=time.seconds;
//-----выход при длительном нажатии кн "меню"------------------   
   switch( button_Men.Loop() )
   {
   case SB_LONG_CLICK: // выход при длительном нажатии кнопки "Men"
   return;
   break;
//-----------ПЕРЕМЕЩЕНИЕ курсора коротким нажатием кн "меню"---------------------   
   case SB_CLICK:
   previousMillis=currentMillis; //если перемещали курсор - сброс счетчика выхода  из режима
   kurs=kurs+3;
   if (kurs<=18) {}
   else {kurs=8;  lcd.setCursor(kurs,0); }
   break;
   }
//-----------------------УВЕЛИЧЕНИЕ значения под курсором------------------
switch( button_PL.Loop() )
   {
   case SB_CLICK:
   previousMillis=currentMillis; //если нажимали"+" - сброс счетчика выхода  из режима
   if (kurs==8) 
   {
    sh=sh+1;
   if (sh<=23){}
   else{sh=0;} time.settime(-1,-1,sh);
    taim(kurs); 
   }
   if (kurs==11)
   {
   mn=mn+1;
   if (mn<=59){}
   else{mn=0;} time.settime(-1,mn);taim(kurs);
   }
   if (kurs==14)
   {sc=0; time.settime(0);  taim(kurs);}
   if (kurs==17)
   {Dn=Dn+1;
   if (Dn<=5){}
   else {Dn=0;} time.settime(-1,-1,-1,-1,-1,-1,Dn); taim(kurs);
   }
   break;
   }    
//-----------------------Уменьшение значения под курсором------------------
      switch( button_MN.Loop() )
       {
        case SB_CLICK:
        previousMillis=currentMillis; //если нажимали"-" - сброс счетчика выхода  из режима
         if (kurs==8) 
         {sh=sh-1;
         if (sh<=23){}
           else{sh=0;} time.settime(-1,-1,sh); taim(kurs);
         }
         if (kurs==11)
         {mn=mn-1;
         if (mn<=59){}
            else{mn=0;} time.settime(-1,mn); taim(kurs);
         }
         if (kurs==14){sc=0; time.settime(0); taim(kurs);}
         if (kurs==17)
         {Dn=Dn-1;
         if (Dn<=5){}
         else {Dn=0;} time.settime(-1,-1,-1,-1,-1,-1,Dn); taim(kurs);
         }
        break;
       }    
    
 //********************************задержка обновленияи ндикации часов****************************   
   
  if (nD_CL.tick)
   {
   lcd.setCursor(7,0);
   lcd.print(time.gettime("H:i:s, D"));
   lcd.setCursor(kurs,0);
   }
   goto setp;
   }
//*************************************************************************************************   
//*****************************функция обновления времени при установке**************************** 
void taim(int kurs) // 
   {
   lcd.setCursor(7,0);
   lcd.print(time.gettime("H:i:s, D"));
   lcd.setCursor(kurs,0);
   }
//*************************************************************************************************
//****************************функция обучения командам пульта и запись в EEPROM*******************
long IR_liarn(long ir_lc)
  {
  //{Serial.print("liarn");
  qw:
  int address=0;
  if (irrecv.decode(&results)) // Если данные пришл 
  {
    delay(300);
    //---если код нажатой кнопки совпадает с существующей то выход
  if (results.value==result){
  //Serial.print("Now");
  return result;
  }
    //---иначе пишем в память 
  else
  {
  //Serial.print("noPult");
  EEPROM.put(address,results.value);
  delay(100);
    return result=results.value;
  }
  irrecv.resume(); // Принимаем следующую команд
  }  
  goto qw;
  }
//**************************************************************************************************
//**************************************************************************************************






 

 

Cessi71
Offline
Зарегистрирован: 21.05.2016

Прошу прощения , код в первом сообщении не рабочий. Вот рабочий:

#include <EEPROM.h>
#include <IRremote.h>
#include <class_noDELAY.h>
#include <LCD_1602_RUS.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <DHT.h>
#include <RTC.h>
#include "sav_button.h"

LCD_1602_RUS lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 20 chars and 4 line display

int RECV_PIN = 11; //вход ИК приемника
IRrecv irrecv(RECV_PIN);
decode_results results;

RTC  time;
Adafruit_BMP085 bmp;
#define DHTPIN 2     // PIN подключения DHT
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321 тип датчика
DHT dht(DHTPIN, DHTTYPE);

SButton button_Men(4,50,1000,4000,500);   //---кнопка меню
SButton button_PL(5,50,1000,4000,500);    //---кнопка +
SButton button_MN(6,50,1000,4000,500);    //---кнопка-

noDELAY nD_CL;    //---задержка обновления часов
noDELAY nD_DHT;   //---задержка обновления DHT
noDELAY nD_BMP;   //---задержка обновления BMP


bool lc = false;  //---состояние подсветки экрана
long result;      //---код кнопки ИК пульта из EEPROM
long ir_lc;       //---код принятый с пульта


void setup() {
  delay(300);
  lcd.init();
  lcd.backlight();
  button_Men.begin();
  button_PL.begin();
  button_MN.begin();
  irrecv.enableIRIn(); // включить приемник
  
//  инициализация модуля RTC
  time.begin(RTC_DS3231);     // на базе чипа DS3231            модуль подключается к аппаратным выводам I2C
  dht.begin();                //  инициализация модуля DHT
  bmp.begin();                //  инициализация модуля BMP
  
  //  установка даты и времени
  //  time.settime(0,44,10,28,04,16,3); // 0  сек, 17 мин, 15 час, 1, октября, 2015 года, четверг
  //  time.settime(35,10,20);     // 35 сек, 10 мин, 20 час, дату оставить без изменений
  //  time.settime(-1,-1,-1,31,12,15);  // 31, декабря, 2015 года, время и день недели оставить без изменений
  nD_CL.start();
  nD_BMP.start();
  nD_DHT.start();
    // получение данных с DHT
  //int h = dht.readHumidity();
  //int t = dht.readTemperature();
  
  //отрисовка экрана
  lcd.setCursor(0,3);
  lcd.print(L"ВЛАЖНОСТЬ:");
  lcd.setCursor(19,3);
  lcd.print("%");
  lcd.setCursor(7,1);
  lcd.setCursor(0,1);
  lcd.print(L"ТЕМП: ");  
  lcd.setCursor(12,1);
  lcd.print(L"°");
  lcd.setCursor(19,1);
  lcd.print(L"°"); 
  lcd.setCursor(0,2);
  lcd.print(L"ДАВЛЕНИЕ:");
  lcd.setCursor(18,2);
  lcd.print(L"мм");
  lcd.setCursor(11,2);
  lcd.print(bmp.readPressure()/133.3,0);
  lcd.setCursor(7,1);
  lcd.print(bmp.readTemperature(),1); 
  //читаем EEPROM кнопку
  int address=0;
  EEPROM.get( address, result );
  
  
Serial.begin(9600); 
  
}
//********************************************************************

void loop() 
{
  nD_CL.read(1000);    
  nD_BMP.read(10000);
  nD_DHT.read(2000);
  lcd.noBlink();
  
//*********************Задержка и вывод времени******************************************
  if (nD_CL.tick)
  {
  lcd.setCursor(0,0);
  lcd.print(time.gettime("d-m, H:i:s, D"));
  }
//*********************Задержка вывода датчиков***************************************
  if (nD_DHT.tick)
  {
  //int h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  //int t = dht.readTemperature();  
  lcd.setCursor(14,1);
  lcd.print(dht.readTemperature(),1);
  lcd.setCursor(11,3);
  lcd.print(dht.readHumidity(),0); 
  }
  if (nD_BMP.tick)
  {
  lcd.setCursor(11,2);
  lcd.print(bmp.readPressure()/133.3,0);
  lcd.setCursor(7,1);
  lcd.print(bmp.readTemperature(),1);     
   }
//------------------вход в режим настройки часов длительным нажатием кнопки меню-------------------------  
    switch( button_Men.Loop() )
  {
       case SB_LONG_CLICK:
       set_sh();
       break;
   }   
 //--------------обработка команд пульта-----------------------  
   //Serial.print(lc);
   int x=0;
   if (irrecv.decode(&results))
  {
  long ir_lc=results.value;
  Serial.println(results.value);
  if (ir_lc == result )     //---если нажетая кнопка на пульте совпадает со считанной из памяти
  {
   //----меняем состояние подсветки
   if (lc == false){lcd.noBacklight(); lc = !lc; }  
       else {lcd.backlight(); lc = !lc;}     
  }
  irrecv.resume();
  }


 
// -------------вызов функции обучения и запоминания пульта длительным нажатием +  -------------------
    switch( button_PL.Loop() )
  {
    case SB_LONG_CLICK:
    IR_liarn(  ir_lc);
    break;  
  }
}
//************************************************************************************************
//******************************конец основной программы******************************************
//************************************************************************************************

//************************************************************************************************
//*****************************функция установки часов********************************************
void set_sh()
    {
   unsigned long currentMillis; 
   long previousMillis=millis();  
  //int Dn;
  //int ms;
  //int gd;
   int  kurs=8;
   lcd.setCursor(8,0);
   lcd.blink();
  //
setp:
  currentMillis = millis();
  //n=currentMillis - previousMillis;
// Если ни чего не делали выход из режима установки времени автоматически 
    if( currentMillis - previousMillis > 20000) {
    return;
    }    


// задержка обновления часов на экране 1сек
   nD_CL.read(1000);
   //считывание текущего времени
   int Dn=time.weekday;
   int sh=time.Hours;
   int mn=time.minutes;
   int sc=time.seconds;
//-----выход при длительном нажатии кн "меню"------------------   
   switch( button_Men.Loop() )
   {
   case SB_LONG_CLICK: // выход при длительном нажатии кнопки "Men"
   return;
   break;
//-----------ПЕРЕМЕЩЕНИЕ курсора коротким нажатием кн "меню"---------------------   
   case SB_CLICK:
   previousMillis=currentMillis; //если перемещали курсор - сброс счетчика выхода  из режима
   kurs=kurs+3;
   if (kurs<=18) {}
   else {kurs=8;  lcd.setCursor(kurs,0); }
   break;
   }
//-----------------------УВЕЛИЧЕНИЕ значения под курсором------------------
switch( button_PL.Loop() )
   {
   case SB_CLICK:
   previousMillis=currentMillis; //если нажимали"+" - сброс счетчика выхода  из режима
   if (kurs==8) 
   {
    sh=sh+1;
   if (sh<=23){}
   else{sh=0;} time.settime(-1,-1,sh);
    taim(kurs); 
   }
   if (kurs==11)
   {
   mn=mn+1;
   if (mn<=59){}
   else{mn=0;} time.settime(-1,mn);taim(kurs);
   }
   if (kurs==14)
   {sc=0; time.settime(0);  taim(kurs);}
   if (kurs==17)
   {Dn=Dn+1;
   if (Dn<=5){}
   else {Dn=0;} time.settime(-1,-1,-1,-1,-1,-1,Dn); taim(kurs);
   }
   break;
   }    
//-----------------------Уменьшение значения под курсором------------------
      switch( button_MN.Loop() )
       {
        case SB_CLICK:
        previousMillis=currentMillis; //если нажимали"-" - сброс счетчика выхода  из режима
         if (kurs==8) 
         {sh=sh-1;
         if (sh>=0){}
           else{sh=23;} time.settime(-1,-1,sh); taim(kurs);
         }
         if (kurs==11)
         {mn=mn-1;
         if (mn>=0){}
            else{mn=59;} time.settime(-1,mn); taim(kurs);
         }
         if (kurs==14){sc=0; time.settime(0); taim(kurs);}
         if (kurs==17)
         {Dn=Dn-1;
         if (Dn>=0){}
         else {Dn=6;} time.settime(-1,-1,-1,-1,-1,-1,Dn); taim(kurs);
         }
        break;
       }    
    
 //********************************задержка обновленияи ндикации часов****************************   
   
  if (nD_CL.tick)
   {
   lcd.setCursor(7,0);
   lcd.print(time.gettime("H:i:s, D"));
   lcd.setCursor(kurs,0);
   }
   goto setp;
   }
//*************************************************************************************************   
//*****************************функция обновления времени при установке**************************** 
void taim(int kurs) // 
   {
   lcd.setCursor(7,0);
   lcd.print(time.gettime("H:i:s, D"));
   lcd.setCursor(kurs,0);
   }
//*************************************************************************************************
//****************************функция обучения командам пульта и запись в EEPROM*******************
long IR_liarn(long ir_lc)
  {
  //{Serial.print("liarn");
  qw:
  int address=0;
  if (irrecv.decode(&results)) // Если данные пришл 
  {
    delay(300);
    //---если код нажатой кнопки совпадает с существующей то выход
  if (results.value==result){
  //Serial.print("Now");
  return result;
  }
    //---иначе пишем в память 
  else
  {
  //Serial.print("noPult");
  EEPROM.put(address,results.value);
  delay(100);
    return result=results.value;
  }
  irrecv.resume(); // Принимаем следующую команд
  }  
  goto qw;
  }
//**************************************************************************************************
//**************************************************************************************************





Кнопка ИК пульта при удержании выдает код, а потом нули повторяющиеся.