помогите с акваконтроллером

serega.gram
Offline
Зарегистрирован: 15.04.2015

помогите я вдруг поня что я чего то не понимаю                                                                                                          имееться arduino uno, lsd1602 с кнопками, часы ds3231, термодатчик Ds18b20, два шим irf520n и Y82 - L298N

была задумка плавное включение и затухание светодиодов по времени и плавный запуск охлаждения. окружающая температура будет браться с часов а внутренняя с датчика.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

И какая часть кода не работает как задумано?

bwn
Offline
Зарегистрирован: 25.08.2014

Если весь холивар осилите, посмотрите здесь . Код не шедевр, но летает. Пережевано очень тщательно. Нет плавного запуска охлаждения, но это уже детали. Брать наружную температура с часов, которые наверняка стоят рядом с тепловыделяющими элементами в закрытым корпусе, не самое лучшее решение.

serega.gram
Offline
Зарегистрирован: 15.04.2015

дело в том что я даже скетчи объединять не могу. я надеялся что может у кого то есть такой скетч с такими комплектующими. я находил похожее но при заливке выдавало ошибку компиляции. а в исправление я тоже новечёк

serega.gram
Offline
Зарегистрирован: 15.04.2015

дело в том что я даже скетчи объединять не могу. я надеялся что может у кого то есть такой скетч с такими комплектующими. я находил похожее но при заливке выдавало ошибку компиляции. а в исправление я тоже новечёк

serega.gram
Offline
Зарегистрирован: 15.04.2015

помогите соеденить два скетча

 
#include <Wire.h>
 
#define Sh1 3  // Первый канал ШИМ
#define Sh2 5  // Второй канал ШИМ
#define Rel 7  // Канал управления реле
#define DS3231_I2C_ADDRESS 0x68 // SDA A4, SCL A5
 
int i;                   // переменная цикла
byte MyStep;             // номер в массиве
byte MyStep_old;         // старый номер в массиве
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;  // данные с DS3231
int min_sum;             // минуты с начала дня
int min_sum_ras;         // минуты с начала дня по расписанию 
 
byte minute_old;
 
// Массивы таймеров вкл/выкл
// рабочие дни
// 00:00    Sh1-Off, Sh2-Off,  Rel-Off, dimming1,2 = 0 sec
// 06:15    Sh1-0n,  Sh2-Off,  Rel-Off, dimming1 = 240 sec
// 08:00    Sh1-0n,  Sh2-On,   Rel-Off, dimming2 = 240 sec
// 09:00    Sh1-Off, Sh2-Off,  Rel-On,  dimming = 0 sec
// 12:00    Sh1-0n,  Sh2-0n,   Rel-Off, dimming = 0 sec
// 14:00    Sh1-Off, Sh2-Off,  Rel-On,  dimming = 0 sec
// 21:00    Sh1-0n,  Sh2-On,   Rel-Off, dimming1,2 = 0 sec
// 21:20    Sh1-0n,  Sh2-Off,  Rel-Off, dimming2 = 240 sec
// 21:30    Sh1-Off, Sh2-Off,  Rel-Off, dimming1 = 240 sec
 
// выходные дни
// 00:00    Sh1-Off, Sh2-Off,  Rel-Off, dimming1,2 = 0 sec
// 08:00    Sh1-0n,  Sh2-Off,  Rel-Off, dimming1 = 240 sec
// 08:30    Sh1-0n,  Sh2-On,   Rel-Off, dimming2 = 240 sec
// 09:00    Sh1-Off, Sh2-Off,  Rel-On,  dimming = 0 sec
// 21:00    Sh1-0n,  Sh2-On,   Rel-Off, dimming1,2 = 0 sec
// 21:20    Sh1-0n,  Sh2-Off,  Rel-Off, dimming2 = 240 sec
// 21:30    Sh1-Off, Sh2-Off,  Rel-Off, dimming1 = 240 sec
 
// рабочие дни
byte Hr[9] =   {0,  6, 8, 9, 12, 14, 21, 21, 21};    // часы вкл/выкл
byte Min[9]  = {0, 15, 0, 0,  0,  0,  0, 20, 30};    // минуты вкл/выкл
byte DimT1[9]  = {0, 240, 0, 0, 0, 0, 0, 0, 240};    // время димера первого канала
byte DimT2[9]  = {0, 0, 240, 0, 0, 0, 0, 240, 0};    // время димера второго канала
boolean Sh_K1[9] = {false, true,  true, false, true, false, true,  true,  false};  // состояние первого канала
boolean Sh_K2[9] = {false, false, true, false, true, false, true,  false, false};  // состояние второго канала
boolean Sh_R1[9] = {false, false, false, true, false, true,  false, false, false};  // состояние канала реле
 
// выходные дни
byte Hr_V[7] =   {0, 8, 8,  9, 21, 21, 21};      // часы вкл/выкл
byte Min_V[7]  = {0, 0, 30, 0, 0, 20, 30};       // минуты вкл/выкл
byte DimT1_V[7]  = {0, 240, 0, 0, 0, 0, 240};    // время димера первого канала
byte DimT2_V[7]  = {0, 0, 240, 0, 0, 240, 0};    // время димера второго канала
boolean Sh_K1_V[7] = {false, true,  true, false, true,  true,  false};  // состояние первого канала
boolean Sh_K2_V[7] = {false, false, true, false, true,  false, false};  // состояние второго канала
boolean Sh_R1_V[7] = {false, false, false, true, false, false, false};  // состояние канала реле
 
void setup() {
  Wire.begin(); 
  // инициализация каналов
  pinMode(Sh1, OUTPUT);  
  pinMode(Sh2, OUTPUT);
  pinMode(Rel, OUTPUT);
  analogWrite(Sh1, 0);  
  analogWrite(Sh2, 0);
  digitalWrite(Rel, LOW);
  // сброс первоночальных значений (чтобы при первом обращении к этим переменным сработало обновление по минутам и суткам)
  minute_old = 255;
  MyStep_old = 255;
  MyStep = 0;
  
  //Первоночальная установка времени
  //setDateDs3231(14, 56, 16, 2, 10, 12, 13); //second, minute, hour, dayOfWeek, dayOfMonth, month, year
  
  //----------------------
  // включить для отладки
  Serial.begin(9600);
  //----------------------
}
 
 
//**********************************************
// Основной цикл
void loop()
{
  getDateDs3231(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // Читаем время
  if (minute != minute_old)       // изменились минуты 
    {
    //-------------------------------------------------------
    SerialTimeDate();               // включить для отладки
    //-------------------------------------------------------
    min_sum = hour * 60 + minute; // подсчитываем минуты с начала дня
    minute_old = minute;          // сохраняем минуты
    // проверяем расписание
    if (dayOfWeek < 6)            // рабочие дни
      {  
      MyStep = Schedule_Working();
      if (MyStep != MyStep_old)   // изменилось расписание
        {
        digitalWrite(Rel, (Sh_R1[MyStep])? HIGH:LOW); // включаем/выключаем канал реле (Sh_R1[MyStep]==true возвращает HIGH, если истина)
        if (Sh_R1[MyStep] != Sh_R1[MyStep_old]) SerialKanal(3, 0, 0, 0) ;  // включить для отладки
        dimmer1();                // управляем 1 каналом ШИМ
        dimmer2();                // управляем 2 каналом ШИМ
        MyStep_old = MyStep;      // отработали действие в расписании
        }
      }
    else                          // выходные дни
      {
      MyStep = Schedule_Weekend();
      if (MyStep != MyStep_old)   // изменилось расписание
        {
        digitalWrite(Rel, (Sh_R1_V[MyStep])? HIGH:LOW); // включаем/выключаем канал реле (Sh_R1[MyStep]==true возвращает HIGH, если истина)
        if (Sh_R1[MyStep] != Sh_R1[MyStep_old]) SerialKanal(3, 0, 0, 0) ;  // включить для отладки
        dimmer1_V();               // управляем 1 каналом ШИМ
        dimmer2_V();               // управляем 2 каналом ШИМ
        MyStep_old = MyStep;       // отработали действие в расписании
        }
      }
    }
}
// *******************************************************************
byte Schedule_Working(void)
{
for (i = 0; i<9; i++) //опрашиваем массив расписаний
  {
  min_sum_ras = Hr[i] * 60 + Min[i]; // подсчитываем минуты с начала дня по расписанию
  if (min_sum >= min_sum_ras) MyStep = i;
  }
return MyStep;
}
// *******************************************************************
byte Schedule_Weekend(void)
{
for (i = 0; i<7; i++) //опрашиваем массив расписаний
  {
  min_sum_ras = Hr_V[i] * 60 + Min_V[i]; // подсчитываем минуты с начала дня по расписанию
  if (min_sum >= min_sum_ras) MyStep = i;
  }
return MyStep;
}
// *******************************************************************
void dimmer1 (void)      // ШИМ 1 канала (рабочие дни)
{
byte Start_D;            // стартовое значение ШИМ канала
byte Stop_D;             // конечное значение ШИМ канала
int Sleep_D;           // задержка
if (DimT1[MyStep] != 0)  // если нужно плавно включить/выключить ШИМ канал
  {
  Start_D = (Sh_K1[MyStep_old]) ? 255:0; // вычисляем стартовое значение ШИМ канала (предыдущее состояние)
  Stop_D = (Sh_K1[MyStep]) ? 255:0;      // вычисляем конечное значение ШИМ канала (расписание)
  Sleep_D = DimT1[MyStep] * 3.9216;    // вычисляем задержку в мс. 3.9216 = 1000/255
  //--------------------------------------------------------------------
  SerialKanal(1, Start_D, Stop_D, Sleep_D); // включить для отладки
  //--------------------------------------------------------------------
  if (Start_D != Stop_D)                 // если изменилось
    {
    if (Start_D < Stop_D)
      {
      for (i=Start_D; i<Stop_D; i++)     // увеличиваем яркость
          {
          analogWrite(Sh1, i);
          delay (Sleep_D);
          }
      }
    else
      {
      for (i=Start_D; i>Stop_D; i--)     // уменьшаем яркость
          {
          analogWrite(Sh1, i);
          delay (Sleep_D);
          }
      }
    }
  }
digitalWrite(Sh1, (Sh_K1[MyStep])? HIGH:LOW); // записываем конечное значение
}
// *******************************************************************
void dimmer2 (void)      // ШИМ 2 канала  (рабочие дни)
{
byte Start_D;            // стартовое значение ШИМ канала
byte Stop_D;             // конечное значение ШИМ канала
int Sleep_D;           // задержка
if (DimT2[MyStep] != 0)  // если нужно плавно включить/выключить ШИМ канал
  {
  Start_D = (Sh_K2[MyStep_old]) ? 255:0; // вычисляем стартовое значение ШИМ канала (предыдущее состояние)
  Stop_D = (Sh_K2[MyStep]) ? 255:0;      // вычисляем конечное значение ШИМ канала (расписание)
  Sleep_D = DimT2[MyStep] * 3.9216;      // вычисляем задержку в мс. 3.9216 = 1000/255
  //--------------------------------------------------------------------
  SerialKanal(2, Start_D, Stop_D, Sleep_D); // включить для отладки
  //--------------------------------------------------------------------
  if (Start_D != Stop_D)                 // если изменилось
    {
    if (Start_D < Stop_D)
      {
      for (i=Start_D; i<Stop_D; i++)     // увеличиваем яркость
          {
          analogWrite(Sh2, i);
          delay (Sleep_D);
          }
      }
    else
      {
      for (i=Start_D; i>Stop_D; i--)     // уменьшаем яркость
          {
          analogWrite(Sh2, i);
          delay (Sleep_D);
          }
      }
    }
  }
digitalWrite(Sh2, (Sh_K2[MyStep])? HIGH:LOW); // записываем конечное значение
}
// *******************************************************************
void dimmer1_V (void)      // ШИМ 1 канала (выходные дни)
{
byte Start_D;              // стартовое значение ШИМ канала
byte Stop_D;               // конечное значение ШИМ канала
int Sleep_D;             // задержка
if (DimT1_V[MyStep] != 0)  // если нужно плавно включить/выключить ШИМ канал
  {
  Start_D = (Sh_K1_V[MyStep_old]) ? 255:0; // вычисляем стартовое значение ШИМ канала (предыдущее состояние)
  Stop_D = (Sh_K1_V[MyStep]) ? 255:0;      // вычисляем конечное значение ШИМ канала (расписание)
  Sleep_D = DimT1_V[MyStep] * 3.9216;      // вычисляем задержку в мс. 3.9216 = 1000/255
  //--------------------------------------------------------------------
  SerialKanal(1, Start_D, Stop_D, Sleep_D); // включить для отладки
  //--------------------------------------------------------------------
  if (Start_D != Stop_D)                   // если изменилось
    {
    if (Start_D < Stop_D)
      {
      for (i=Start_D; i<Stop_D; i++)       // увеличиваем яркость
          {
          analogWrite(Sh1, i);
          delay (Sleep_D);
          }
      }
    else
      {
      for (i=Start_D; i>Stop_D; i--)       // уменьшаем яркость
          {
          analogWrite(Sh1, i);
          delay (Sleep_D);
          }
      }
    }
  }
digitalWrite(Sh1, (Sh_K1_V[MyStep])? HIGH:LOW); // записываем конечное значение
}
// *******************************************************************
void dimmer2_V (void)      // ШИМ 2 канала  (выходные дни)
{
byte Start_D;              // стартовое значение ШИМ канала
byte Stop_D;               // конечное значение ШИМ канала
int Sleep_D;             // задержка
if (DimT2_V[MyStep] != 0)  // если нужно плавно включить/выключить ШИМ канал
  {
  Start_D = (Sh_K2_V[MyStep_old]) ? 255:0; // вычисляем стартовое значение ШИМ канала (предыдущее состояние)
  Stop_D = (Sh_K2_V[MyStep]) ? 255:0;      // вычисляем конечное значение ШИМ канала (расписание)
  Sleep_D = DimT2_V[MyStep] * 3.9216;      // вычисляем задержку в мс. 3.9216 = 1000/255
  //--------------------------------------------------------------------
  SerialKanal(2, Start_D, Stop_D, Sleep_D); // включить для отладки
  //--------------------------------------------------------------------
  if (Start_D != Stop_D)                   // если изменилось
    {
    if (Start_D < Stop_D)
      {
      for (i=Start_D; i<Stop_D; i++)       // увеличиваем яркость
          {
          analogWrite(Sh2, i);
          delay (Sleep_D);
          }
      }
    else
      {
      for (i=Start_D; i>Stop_D; i--)       // уменьшаем яркость
          {
          analogWrite(Sh2, i);
          delay (Sleep_D);
          }
      }
    }
  }
digitalWrite(Sh2, (Sh_K2_V[MyStep])? HIGH:LOW); // записываем конечное значение
}
 
// *******************************************************************
// Подпрограммы для DS3231
// *******************************************************************
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}
// ---------------------------
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}
// ---------------------------
void setDateDs3231(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   Wire.beginTransmission(DS3231_I2C_ADDRESS);
   Wire.write(0);
   Wire.write(decToBcd(second));    
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));     
   Wire.write(decToBcd(dayOfWeek));
   Wire.write(decToBcd(dayOfMonth));
   Wire.write(decToBcd(month));
   Wire.write(decToBcd(year));
   Wire.endTransmission();
}
// ---------------------------
void getDateDs3231(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{
 
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();
 
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
 
  *second     = bcdToDec(Wire.read() & 0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read() & 0x3f); 
  *dayOfWeek  = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}
// ---------------------------
 
// *******************************************************************
// Тестовая функция вывода времени в консоль
// *******************************************************************
void SerialTimeDate(void)
{
if (hour<10) Serial.print("0");
Serial.print(hour);
Serial.print(":");
if (minute<10) Serial.print("0");
Serial.print(minute);
Serial.print(":");
if (second<10) Serial.print("0");
Serial.print(second);
Serial.print(" ");
 
if (dayOfMonth<10) Serial.print("0");
Serial.print(dayOfMonth);
Serial.print(":");
if (month<10) Serial.print("0");
Serial.print(month);
Serial.print(":20");
Serial.print(year);
Serial.print(" DayW=");
Serial.print(dayOfWeek);
 
Serial.print("  Step=");
Serial.print(MyStep);
Serial.print(" SH1=");
Serial.print((Sh_K1[MyStep])? "HIGH ":"LOW ");
Serial.print(" SH2=");
Serial.print((Sh_K2[MyStep])? "HIGH ":"LOW ");
Serial.print(" Relay=");
Serial.print((Sh_R1[MyStep])? "HIGH ":"LOW ");
 
Serial.print("\n");
}
// ---------------------------
void SerialKanal(byte kan, byte s_t, byte s_p, int s_l)
{
SerialTimeDate();
if (kan <= 2)
  {
  Serial.print("Dimmer SH");
  Serial.print(kan);
  Serial.print(" Start=");
  Serial.print(s_t);
  Serial.print("  Stop=");
  Serial.print(s_p);
  Serial.print("  Sleep=");
  Serial.print(s_l);
  Serial.print("\n");
  }
}
// ---------------------------

 

serega.gram
Offline
Зарегистрирован: 15.04.2015
мне от сюда нужно как то забрать, управление с кнопок, меню подправить. одним словом, прописать верхний скетч под управление с кнопок и вывод инфы на экран. кто нибудь сможет помочь? ПОЖАЛУЙСТА
 
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal.h>
 
#define DS1307_I2C_ADDRESS 0x68
 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
const byte outPin = 3; // выход управления нагрузки
 
byte setMinClockOn; // 
byte setHorClockOn;
byte setMinClockOff; // 
byte setHorClockOff;
 
byte key(){ //// для кнопок ЛСДшилда
  int val = analogRead(0);
    if (val < 50) return 5;
    else if (val < 150) return 3;
    else if (val < 350) return 4;
    else if (val < 500) return 2;
    else if (val < 800) return 1;
    else return 0;  
}
 
/////////// часы ..
byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}
 
byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}
 
void setDateDs1307(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   Wire.beginTransmission(DS1307_I2C_ADDRESS);
   Wire.write(0);
   Wire.write(decToBcd(second));    
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));     
   Wire.write(decToBcd(dayOfWeek));
   Wire.write(decToBcd(dayOfMonth));
   Wire.write(decToBcd(month));
   Wire.write(decToBcd(year));
   Wire.endTransmission();
}
 
void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{
 
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();
 
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
 
  *second     = bcdToDec(Wire.read() & 0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read() & 0x3f); 
  *dayOfWeek  = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}
////
void setClock(){ // установка часов
  byte pos = 1;
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
    getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  
    lcd.clear();
    lcd.blink();
 
   while(key() != 1){ // крутим   цикл   
    byte KEY = key(); // читаем состояние кнопок
      delay(200);
    lcd.setCursor(1, 1);
    lcd.print("set to save");
    lcd.setCursor(0, 0);     // выводим инфу
     if (hour < 10) lcd.print("0");
    lcd.print(hour);
    lcd.print(":");
     if (minute < 10) lcd.print("0"); 
    lcd.print(minute);  
    lcd.print(" ");     
     if (dayOfMonth < 10) lcd.print("0");
    lcd.print(dayOfMonth);
    lcd.print("/");
     if (month < 10) lcd.print("0");
    lcd.print(month);
    lcd.print("/");
     if (year < 10) lcd.print("0");
    lcd.print(year);
    
    lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
    
    if (KEY == 5 && pos < 13) pos += 3; // крутим позицию
    else if (KEY == 2 && pos > 1) pos -= 3;
    
    else if (pos == 1 && KEY == 3) hour++; // крутим значения
    else if (pos == 1 && KEY == 4) hour--;
    else if (pos == 4 && KEY == 3) minute++;
    else if (pos == 4 && KEY == 4) minute--;    
    else if (pos == 7 && KEY == 3) dayOfMonth++;
    else if (pos == 7 && KEY == 4) dayOfMonth--;    
    else if (pos == 10 && KEY == 3) month++;
    else if (pos == 10 && KEY == 4) month--;    
    else if (pos == 13 && KEY == 3) year++;
    else if (pos == 13 && KEY == 4) year--;  
    
    if (hour > 23) hour = 0;
    else if (minute > 59) minute = 0;
    else if (dayOfMonth > 31) dayOfMonth = 0;
    else if (month > 12) month = 1;
    else if (year > 99) year = 0;
  }// конец цикла
  
 setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
   lcd.noBlink(); 
   lcd.clear();
   lcd.print("     Saved");
   delay(1500);
}///
 
void setOnOff(){    
  byte pos = 0;   
    lcd.clear();
    lcd.blink();
 
   while(key() != 1){ // крутим   цикл   
    byte KEY = key(); // читаем состояние кнопок
      delay(200);
    lcd.setCursor(1, 1);
    lcd.print("set to save");
    lcd.setCursor(0, 0);     // выводим инфу
     if (setHorClockOn < 10) lcd.print("0");
    lcd.print(setHorClockOn);
    lcd.print(":");
     if (setMinClockOn < 10) lcd.print("0"); 
    lcd.print(setMinClockOn);  
    lcd.print(" ");     
     if (setHorClockOff < 10) lcd.print("0");
    lcd.print(setHorClockOff);
    lcd.print(":");
     if (setMinClockOff < 10) lcd.print("0");
    lcd.print(setMinClockOff); 
    
    lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
    
    if (KEY == 5 && pos < 9) pos += 3; // крутим позицию
    else if (KEY == 2 && pos > 1) pos -= 3;
    
    else if (pos == 0 && KEY == 3) setHorClockOn++; // крутим значения
    else if (pos == 0 && KEY == 4) setHorClockOn--;
    else if (pos == 3 && KEY == 3) setMinClockOn++;
    else if (pos == 3 && KEY == 4) setMinClockOn--;    
    else if (pos == 6 && KEY == 3) setHorClockOff++;
    else if (pos == 6 && KEY == 4) setHorClockOff--;    
    else if (pos == 9 && KEY == 3) setMinClockOff++;
    else if (pos == 9 && KEY == 4) setMinClockOff--;    
 
    
    if (setHorClockOn > 23) setHorClockOn = 0;
    else if (setMinClockOn > 59) setMinClockOn = 0;
    else if (setHorClockOff > 23) setHorClockOff = 0;
    else if (setMinClockOff > 59) setMinClockOff = 0;
    
  }// конец цикла
   lcd.noBlink(); 
   lcd.clear();
 
   EEPROM.write(0, setMinClockOn);
   EEPROM.write(1, setHorClockOn);
   EEPROM.write(3, setMinClockOff);
   EEPROM.write(4, setHorClockOff);
 
   lcd.print("     Saved");
   delay(1500);
}///
 
void menu(){
  lcd.clear();
  char menuTxt[2][14] = {"set ON/OFF >>", "set clock  >>"};
  byte pos = 0;
  
  while(1){  
    delay(200);  
    byte KEY = key();
    
    lcd.setCursor(0, 0);
    lcd.print(pos+1);
    lcd.print(".");
    lcd.print(menuTxt[pos]);
    
    if (KEY == 3 && pos != 0) pos--;
    else if (KEY == 4 && pos < 1) pos++;
    
    if (KEY == 5 && pos == 0) setOnOff();
    else if (KEY == 5 && pos == 1) setClock(); 
  }
}  
 
void setup(){
  Wire.begin(); 
  lcd.begin(16, 2);
  lcd.clear();
  
  pinMode(outPin, OUTPUT);
  digitalWrite(outPin, LOW);
  
  setMinClockOn = EEPROM.read(0);
  setHorClockOn = EEPROM.read(1);
  setMinClockOff = EEPROM.read(3);
  setHorClockOff = EEPROM.read(4);
}
 
void loop()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;  
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  
  // обработка кнопок
  if (key() == 1) menu(); // если нажата селект
  else if (key() == 3) digitalWrite(outPin, HIGH);
  else if (key() == 4) digitalWrite(outPin, LOW);
 
  // сравниваем время и управляем выходом// 
  if (setMinClockOff == minute && setHorClockOff == hour
      && second == 0) digitalWrite(outPin, LOW);
  if (setMinClockOn == minute && setHorClockOn == hour
      && second == 0) digitalWrite(outPin, HIGH);    
 
 
//   lcd.clear();
    lcd.setCursor(0, 0);
     if (hour < 10) lcd.print("0"); 
    lcd.print(hour); 
    lcd.print(":");
     if (minute < 10) lcd.print("0"); 
    lcd.print(minute);
//  lcd.print(":");
//   if (second < 10) lcd.print("0");
//  lcd.print(second);
//    lcd.setCursor(8, 0); 
//    lcd.print("    ");  
    lcd.setCursor(0, 1);
     if (dayOfMonth < 10) lcd.print("0");
    lcd.print(dayOfMonth);
    lcd.print("/");
     if (month < 10) lcd.print("0");
    lcd.print(month);
    lcd.print("/");
     if (year < 10) lcd.print("0");
    lcd.print(year);
     //
    lcd.setCursor(11, 0);
     if (setHorClockOn < 10) lcd.print("0"); 
    lcd.print(setHorClockOn); 
    lcd.print(":");
     if (setMinClockOn < 10) lcd.print("0"); 
    lcd.print(setMinClockOn);
    
    lcd.setCursor(11, 1);
     if (setHorClockOff < 10) lcd.print("0"); 
    lcd.print(setHorClockOff); 
    lcd.print(":");
     if (setMinClockOff < 10) lcd.print("0"); 
    lcd.print(setMinClockOff);      
   
    lcd.setCursor(7, 0);
    if (digitalRead(outPin)) lcd.print("ON ");
    else lcd.print("Off");
    
    delay(200); // нужно для нармальной работы кнопок
}
bwn
Offline
Зарегистрирован: 25.08.2014

Для начала, почитайте как вставлять код.
На мой взгляд, чем это вместе складывать, проще новый на их основе написать.
И главное, что вы хотите? Потратить время (месяца 1,5-2) научится немного программить написать код под себя, или получить сразу работающий результат?

serega.gram
Offline
Зарегистрирован: 15.04.2015

я не предполагал что будет так. я думал закажу платку к ней комплектующие, соберу их скачаю скетч подходящий и всё будет работать. да ни тут то было, я расчитывал на готовый скетч. а учится время не позволяет. жаль. теперь будет просто валяться ардуинка.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

задарите её пионерам тогда.... 

bwn
Offline
Зарегистрирован: 25.08.2014

serega.gram пишет:

я не предполагал что будет так. я думал закажу платку к ней комплектующие, соберу их скачаю скетч подходящий и всё будет работать. да ни тут то было, я расчитывал на готовый скетч. а учится время не позволяет. жаль. теперь будет просто валяться ардуинка.

Так возьмите тот скетч на который я давал ссылку, он вроде делает почти как вам нужно. Комплектуха которая понадобится кроме вашей - LCD2004 под I2C, IR сенсор и шилд с релюшками.

serega.gram
Offline
Зарегистрирован: 15.04.2015

нашёл то что мне нужно. полностью рабочий скетч, но опять же нужна помощь по написанию самой простой менюшки, чтобы можно было кнопками изменить время вкл и выкл. и как продублировать ещё три выхода (11,12,13) один из них можно сделать шим. Не оставте мою беду в стороне пожалуйста

/*Подключаем библиотеки*/

#include <Wire.h>                    //необходимо для работы с часами
#include <OneWire.h>            // подключаем библиотеку для работы с 1-Wire
#include <DS1307.h>             // подключаем библиотеку для работы с часами DS1307
#include <LiquidCrystal.h>    // подключаем библиотеку для работы с LCD текстовыми экранами
#include <DallasTemperature.h>  // подключаем библиотеку для работы с термометром 18B20

#define TempPin 2   // pin для датчика температуры
int ledPin = 3;   // управление светодиодами, присоединён к pin 3
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);    //инициализируем дисплей
OneWire oneWire(TempPin);    // указываем, что через этот пин будем мониторить температуру
DallasTemperature tempSensor(&oneWire);    // создаем объект для работы с термометром
long tmIntv = 1000;    //интервал для обновления времени на экране каждую секунду
long tempIntv = 30000;    //интервал для обновления температуры, хватит и пол минуты
long prvMlsTm = 0;    //предыдущее показание миллисекунд для обновления показания часов
long prvMlsTemp = 0;   //предыдущее показание миллисекунд для обновления показания температуы
long prvMlsLght = 0;    //предыдущее показание миллисекунд для проверки временного интервала
long lghtIntv = 60000;    //интервал для проверки включения/выключения освещения аквариума, 1 минута
int lghtStat = 0;   //если подсветка включена, то в 1
int upLghtTime = 8;      //включаем в 8 утра
int downLghtTime = 17;     //выключаем в 17 вевера
int isNight = 0;    //если включаем на ночь, т.е. начальное время больше конечного
int prevSec = 0;  //предыдущее показание секунд для перезапуска если остановились
byte key(){ //// для кнопок ЛСДшилда
  int val = analogRead(0);
    if (val < 50) return 5;
    else if (val < 150) return 3;
    else if (val < 350) return 4;
    else if (val < 500) return 2;
    else if (val < 800) return 1;
    else return 0; 
//отрабатывает при включении Arduino
void setup() {

  pinMode(ledPin, OUTPUT); // режим порта устанавливаем на вывод (запись)
  tempSensor.begin();  //инициализируем термометр
  lcd.begin(16, 2);    //указываем, что индикатор 16 символов в две строки
  lcd.print("Time:");    //выводим "Time"

  if (upLghtTime > downLghtTime) {          //если ночное время
    isNight = 1;
  }
}

void printTemp () {     //отображаем температуру на экране
  float aTemp;   //температура аквариума
  float rTemp;    //температура комнаты

  tempSensor.requestTemperatures(); // отправляем запрос на получение температуры
  rTemp = tempSensor.getTempCByIndex(0);  //у нас термометр в комнате с индексом 0
  aTemp = tempSensor.getTempCByIndex(1);  //у нас термометр в аквариуме с индексом 1
  lcd.setCursor(0, 1);    //перемещаем позицию вывода
  lcd.print("R: ");
  lcd.print(rTemp);    //выводим температуру комнаты
  lcd.setCursor(7, 1);
  lcd.print(" A: ");
  lcd.print(aTemp);    //выводим температуру аквариума
  lcd.setCursor(15, 1);
  lcd.print(" ");
  lcd.home();

  //если экранированный кабель, то можно подключать до 32 термометров
}

void light () {    //включаем/выключаем освещение аквариума
  int hr;
  int isLght = 0;

  hr = RTC.get(DS1307_HR, true);    //получаем значение часов

  if (isNight == 0) {  //если день

    if (hr >= upLghtTime && hr < downLghtTime) {   //проверяем интервал
      isLght = 1;     //если необходимо включить свет
    } else {
      isLght = 0;
    }

  } else {    //если ночь

    if (hr - upLghtTime >= 0) {   //если больше или равно верхнему значению, то необходимо включить свет
      isLght = 1;   //если необходимо включить свет
    } else {
      if (hr < downLghtTime) {    //если меньше нижнего значения, то необходимо включить свет
        isLght = 1;    //если необходимо включить свет
      } else {
        isLght = 0;
      }
    }
  }  //закончился цикл выбора: день или ночь?

  if ((isLght == 1) && (lghtStat == 0)) {  //если свет еще не включен и выставлен флаг необходимости включить
    lghtStat = 1;
    digitalWrite(ledPin, HIGH);   //собственно, включаем подавая высокий уровень на вывод
  } else {
    if (isLght == 0 && lghtStat == 1) {
      lghtStat = 0;
      digitalWrite(ledPin, LOW);     //собственно, выключаем снимая высокий уровень на выводе
    }
  }

}

void printTime () {  //ф-ция вывода времения на экран
  int hr;
  int minut;
  int sec;

  lcd.setCursor(7, 0);
  hr = RTC.get(DS1307_HR, true);   //получаем часы

  if ( hr < 10) {
    lcd.print('0');   //выводим недостающий 0 если знаков меньше 10
  }

  lcd.print(hr);
  lcd.print(":");
  minut = RTC.get(DS1307_MIN, false);            //получаем минуты

  if ( minut < 10) {
    lcd.print('0');   //выводим недостающий 0 если знаков меньше 10
  }
  lcd.print(minut);
  lcd.print(":");

  sec = RTC.get(DS1307_SEC, false);     //получаем секунды
  if ( sec < 10) {
    lcd.print('0');   //выводим недостающий 0 если знаков меньше 10
  }

  //дело в том, что иногода часы останавливаются, поэтому если предыдущая и текущая секунды совпадают - перезапускаем часы
  if (prevSec == sec) {
    RTC.start();
  }

  prevSec = sec;

  lcd.print(sec);
}

void loop()     //постоянно отрабатывает в цикле
{
  unsigned long currentMillis = millis();   //миллисекунд прошло со старта
  //дело в том, что если делать через delay(), то система в это время простаивает,
  //а нам постоянно необходимо чего-нить обрабатывать
  //поэтому просто считаем прошедшее время и сверяем его с интервалами

  //проверяем не прошел ли нужный интервал для обновления часов, если прошел то
  if (currentMillis - prvMlsTm > tmIntv) {
    prvMlsTm = currentMillis;
    printTime();   //вызываем ф-цию вывода времени на экран если
  }
  //проверяем не прошел ли нужный интервал для обновления температуры, если прошел то
  if (currentMillis - prvMlsTemp > tempIntv) {
    prvMlsTemp = currentMillis;
    printTemp();  //
  }
  //проверяем не прошел ли нужный интервал для включения/выключения освещения, если прошел то
  if (currentMillis - prvMlsLght > lghtIntv) {
    prvMlsLght = currentMillis;
    light();    //вызываем ф-цию проверки необходимости включения/выключения освещения
  }
}

 

serega.gram
Offline
Зарегистрирован: 15.04.2015
<strong>помогите найти ошибку. такое дело скачал скетч  рабочий, в ардуино заливаеться но на на экран инфа не отображаеться </strong>

#include <Wire.h> 
 #include <DS1307new.h>
 #include <LiquidCrystal.h>
 #include <OneWire.h>
 #include <EEPROM.h>

 uint16_t startAddr = 0x0000; // Начальный адрес для хранения в NV-RAM
 uint16_t lastAddr; // новый адрес для хранения в NV-RAM
 uint16_t TimeIsSet = 0xaa55; // ПОМОЩНИК, что время не должно установить снова
 LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 OneWire ds (11); // on pin 11


 int hotpin = 0;
 int feedpin = 1;
 int lightpin = 3;
 int comppin = 13;
 int fanpin = 2;
 int timer = 0;
 int ledpin = 10;
 int fadeAmount = 15;    // шаг приращения/убывания яркости
 int brightness = 120;    // уставливаем начально значение яркости
 int lcd_key = 0;
 int adc_key_in = 0;
 int value= EEPROM.read(0);
 int  fadevalue = 5;
 #define btnRIGHT 0
 #define btnUP 1
 #define btnDOWN 2
 #define btnLEFT 3
 #define btnSELECT 4
 #define btnNONE 5


  
 char* Message[]={"Enter Day", "Enter Month", "Enter Year", "Enter Hour", "Enter Minutes"};
 int myTime[] = {10,9,2013,0,0};
 int i = 0;


 // опрос клавиатуры 
 int read_LCD_buttons()
 {
    adc_key_in = analogRead(0); // прочитать значение от датчика
    if (adc_key_in < 1015) {
     delay(100);
     adc_key_in = analogRead(0);
  }
  
  
  // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
  // we add approx 50 to those values and check to see if we are close
  if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
  if (adc_key_in < 50) return btnRIGHT; 
  if (adc_key_in < 195) return btnUP; 
  if (adc_key_in < 380) return btnDOWN; 
  if (adc_key_in < 555) return btnLEFT; 
  if (adc_key_in < 790) return btnSELECT; 
  return btnNONE; // when all others fail, return this...
 }



 
 void setup()
 {
               // Test of the SQW pin, D2 = Pullup on
   lcd.begin(16, 2); // start the library
   pinMode(feedpin, OUTPUT);
   pinMode(lightpin, OUTPUT);
   pinMode(comppin, OUTPUT);
   pinMode(fanpin, OUTPUT);
   pinMode(hotpin, OUTPUT);
   pinMode(ledpin, OUTPUT); 
   digitalWrite(feedpin, HIGH); 
   digitalWrite(comppin, HIGH);
   
   
 /*
    PLEASE NOTICE: WE HAVE MADE AN ADDRESS SHIFT FOR THE NV-RAM!!!
                   NV-RAM ADDRESS 0x08 HAS TO ADDRESSED WITH ADDRESS 0x00=0
                   TO AVOID OVERWRITING THE CLOCK REGISTERS IN CASE OF
                   ERRORS IN YOUR CODE. SO THE LAST ADDRESS IS 0x38=56!
 */
   RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));// Store startAddr in NV-RAM address 0x08 

 /*
    Uncomment the next 2 lines if you want to SET the clock
    Comment them out if the clock is set.
    DON'T ASK ME WHY: YOU MUST UPLOAD THE CODE TWICE TO LET HIM WORK
    AFTER SETTING THE CLOCK ONCE.
 */
 //TimeIsSet = 0xffff;
// RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t)); 

 /*
   Control the clock.
   Clock will only be set if NV-RAM Address does not contain 0xaa.
   DS1307 should have a battery backup.
 */
   RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
   if (TimeIsSet != 0xaa55)
   {
   RTC.stopClock();
   while(i<5){
   lcd.setCursor(0,0);
   lcd.print(Message[i]);
   lcd.setCursor(0,1);
   lcd.print(myTime[i]);
   
   lcd_key = read_LCD_buttons();
   switch (lcd_key) // depending on which button was pushed, we perform an action
  {
    case btnRIGHT:
      {
      break;
      }
    case btnLEFT:
      {
      break;
      }
    case btnUP:
      {
      myTime[i] = myTime[i]++;
      if (i == 0 && myTime[i] > 31) myTime[i] = 1;
      else if (i == 1 && myTime[i] > 12) myTime[i] = 1;
      else if (i == 3 && myTime[i] > 23) myTime[i] = 0;
      else if (i == 4 && myTime[i] > 59) myTime[i] = 0;
      lcd.clear();
      break;
      }
    case btnDOWN:
      {
      myTime[i] = myTime[i]--;
      if (i == 0 && myTime[i] < 1) myTime[i] = 31;
      else if (i == 1 && myTime[i] < 1) myTime[i] = 12;
      else if (i == 3 && myTime[i] < 0) myTime[i] = 23;
      else if (i == 4 && myTime[i] < 0) myTime[i] = 59;
      lcd.clear();
      break;
      }
    case btnSELECT:
      {
      i = i++;
      lcd.clear();
      break;
      }
      case btnNONE:
      {
        break;
      }
  }

 }
     
     
     
     
         
     RTC.fillByYMD(myTime[2],myTime[1],myTime[0]);
     RTC.fillByHMS(myTime[3],myTime[4],0);
     
     RTC.setTime();
     TimeIsSet = 0xaa55;
     RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
     RTC.startClock();
   }
   else
   {
     RTC.getTime();
   }

 /*
    Control Register for SQW pin which can be used as an interrupt.
 */
   RTC.ctrl = 0x00; // 0x00=disable SQW pin, 0x10=1Hz,
                                         // 0x11=4096Hz, 0x12=8192Hz, 0x13=32768Hz
   RTC.setCTRL();

   
   uint8_t MESZ;

   MESZ = RTC.isMEZSummerTime();
   
 }


 void loop()
 {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  lcd_key = read_LCD_buttons();
   switch (lcd_key) // depending on which button was pushed, we perform an action
  {
    case btnRIGHT:
      {if (brightness >= 0 && brightness < 255)
        {brightness = brightness + fadeAmount;
         break;}
         else {break;}
      }
    case btnLEFT:
      {if (brightness > 0 && brightness <= 255)
        {brightness = brightness - fadeAmount;
         break;}
         else {break;}
      }
    case btnUP:
     {if (value >= 0 && value < 255)
        {value = value + fadevalue;
         analogWrite(lightpin, value);
         break;}
         else {break;}
      }
    case btnDOWN:
      {if (value > 0 && value <= 255)
        {value = value - fadevalue;
         analogWrite(lightpin, value); 
         break;}
         else {break;}
      }
    case btnSELECT:
    {    EEPROM.write(0, value);
         break;}
       
      case btnNONE:
      {
        break;
      }
  }
  
  analogWrite(ledpin, brightness);
  
  
  if (! ds.search (addr)) {
  ds.reset_search ();
  delay (250);
  return;
  }
  
  
  ds.reset ();
  ds.select (addr);
  ds.write (0x44,1); // start conversion, with parasite power on at the end
  
  delay (1000); // maybe 750ms is enough, maybe not
  // we might do a ds.depower () here, but the reset will take care of it.
  
  present = ds.reset ();
  ds.select (addr); 
  ds.write (0xBE); // Read Scratchpad

  
  for (i = 0; i < 9; i++) { // we need 9 bytes
  data[i] = ds.read ();
  }
  

  // convert the data to actual temperature

  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
  raw = raw << 3; // 9 bit resolution default
  if (data[7] == 0x10) {
  // count remain gives full 12 bit resolution
  raw = (raw & 0xFFF0) + 12 - data[6];
  }
  } else {
  byte cfg = (data[4] & 0x60);
  if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms
  else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
  else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
  // default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  lcd.clear();
  lcd.setCursor(10,0);
  lcd.print (celsius);
  
 
 
  
  //Вывод времени на дисплей
   RTC.getTime();
   
   
   lcd.setCursor(0,0);
   if (RTC.hour < 10) // correct hour if necessary
   {
     lcd.print("0");
     lcd.print(RTC.hour, DEC);
   } 
   else
   {
     lcd.print(RTC.hour, DEC);
   }
   lcd.print(":");
   if (RTC.minute < 10) // correct minute if necessary
   {
     lcd.print("0");
     lcd.print(RTC.minute, DEC);
   }
   else
   {
     lcd.print(RTC.minute, DEC);
   }
   lcd.print(":");
   if (RTC.second < 10) // correct second if necessary
   {
     lcd.print("0");
     lcd.print(RTC.second, DEC);
   }
   else
   {
     lcd.print(RTC.second, DEC);
   }
   lcd.setCursor(0,1);
   if (RTC.day < 10) // correct date if necessary
   {
     lcd.print("0");
     lcd.print(RTC.day, DEC);
   }
   else
   {
     lcd.print(RTC.day, DEC);
   }
   lcd.print("-");
   if (RTC.month < 10) // correct month if necessary
   {
     lcd.print("0");
     lcd.print(RTC.month, DEC);
   }
   else
   {
     lcd.print(RTC.month, DEC);
   }
   lcd.print("-");
   lcd.print(RTC.year, DEC); // Year need not to be changed;
  lcd.print("  ");
   lcd.print(value/5);
   
 // Сверка времени и управление освещением
  
  
  if (RTC.hour == 9 && RTC.minute == 1 && RTC.second == 0)//кормление
   {
     digitalWrite(feedpin, LOW);
     delay (5000);
     digitalWrite(feedpin, HIGH);
   }
if (RTC.hour >= 10 && RTC.hour < 20)// включение компрессора
   {
     digitalWrite(comppin, LOW);
   }
   else
   {
     digitalWrite(comppin, HIGH);
   }
if (RTC.hour >= 9 && RTC.hour < 21)//включение освещения
   {
     analogWrite(lightpin, value);
   }
   else
   {
     analogWrite(lightpin, 0);
   }
 // Проверка температуры и запуск охлаждения или обогрева
  
  if (celsius >= 27.1) digitalWrite(fanpin, LOW);
    else if (celsius <= 26.9)digitalWrite(fanpin, HIGH);
  
  if (celsius <= 25.9) digitalWrite(hotpin, LOW);
    else if (celsius >= 26.1) digitalWrite(hotpin, HIGH);
  
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

serega.gram, в данный момент, вы впустую тратите время. Чем тратить его без пользы, пытаясь впихать невпихуемое, прочитайте здесь .
Далее, начните препарировать ваш код. Для начала выведите через Serial.print стандартный "HELLO", затем тоже самое на LCD, в позицию которая вам нравится, потом туда же считанное значение кнопки.
После этого можно будет двигаться дальше. Поверьте, это не так сложно, как кажется. Основной геммор у вас будет с меню (работа нудная и кропотливая), но имея предыдущий опыт отладки вполне решаемая.
Если хотите кавалерийским наскоком, то лучше в "ищу исполнителя".

serega.gram
Offline
Зарегистрирован: 15.04.2015

всё ясно. последний вопрос, последний скетч что я выложил 19.04 вы не можете проверить на ошибку. потому что он компилируеться загружаеться но на дисплей ни чего выводиться

bwn
Offline
Зарегистрирован: 25.08.2014

Если не выводится вообще ничего, крутим подстроечник до появления прямоугольников или проверяем соответствие ног строке 12.

serega.gram
Offline
Зарегистрирован: 15.04.2015

по словам автора скетч рабочий, и соответствие ног совпадает. потому что любой другой скетч заливаю с такой распиновкой и всё работает. у меня подозрение что в нём что то не дописано.

bwn
Offline
Зарегистрирован: 25.08.2014

Глазами ничего крамольного не видно, будет время, попробую загрузить.

serega.gram
Offline
Зарегистрирован: 15.04.2015

спасибо

bwn
Offline
Зарегистрирован: 25.08.2014

Я вас не обрадую, у меня отказывается компилится. Ругается на OneWire. Возможно разные с вами библиотеки((((

serega.gram
Offline
Зарегистрирован: 15.04.2015

жаль. у меня были большие надежды на этот скетч

bwn
Offline
Зарегистрирован: 25.08.2014

Покопаться самому совсем нет желания?

serega.gram
Offline
Зарегистрирован: 15.04.2015

да я даже незнаю с чего начать с моими знаниями . соотношение подключения ног экрана совпадает. меня смущают другие выходы подключения в скетчи

serega.gram
Offline
Зарегистрирован: 15.04.2015

здраствуйте. в долгих поисках, нашёл подходящий мне скетч. но есть один нюанс почему то не срабатывает пин термостата и их там два выхода . я хочу один из них использовать для охлаждения. изначально они идут 40 . 41 я переписываю на 13 температура опускаеться и вроде должно сработать на включение а не хочет. а так меня всё устраивает плавное включение -затухание. Сможете помочь? 


#include <Wire.h>//Подключаем библиотеку для использования I2C интерфейса с модулем RTC 
#include "RTClib.h"//Подключаем библиотеку для использования модуля часов реального времени RTC

#include <OneWire.h>
#include <DallasTemperature.h>

#include "LiquidCrystal.h" // библиотека экрана
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

OneWire  ds(2);  // Подключаем датчик к 53 цифровому пину

int lcd_key     = 0;
int adc_key_in  = 0;
int reg=0;// вводим флаг для автоматического (при значении-0) или ручного регулирования -1

#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// read the buttons
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor 
 // my buttons when read are centered at these valies: 0, 142, 328, 504, 741
 // we add approx 50 to those values and check to see if we are close
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result

 if (adc_key_in < 0)   return btnRIGHT;  
 if (adc_key_in < 99)  return btnUP; 
 if (adc_key_in < 255)  return btnDOWN; 
 if (adc_key_in < 409)  return btnLEFT; 
 if (adc_key_in < 639)  return btnSELECT;  
 return btnNONE;  // when all others fail, return this...
}


#define PWM_LW_MIN 0 //Если необходим ток покоя на LED - изменить эту константу
#define PWM_LW_MAX 128//Если необходимо ограничить максимальную яркость - уменьшить значение
#define PWM_LW_PIN 11 //Пин порта, где будет ШИМ LW

#define PWM_LR_MIN 0 //Если необходим ток покоя на LED - изменить эту константу
#define PWM_LR_MAX 200//Если необходимо ограничить максимальную яркость - уменьшить значение
#define PWM_LR_PIN 3 //Пин порта, где будет ШИМ LR

#define PWM_LB_MIN 0 //Если необходим ток покоя на LED - изменить эту константу
#define PWM_LB_MAX 235 //Если необходимо ограничить максимальную яркость - уменьшить значение
#define PWM_LB_PIN 12 //Пин порта, где будет ШИМ LB

#define mn 60UL  //Дополнительные константы для удобства
#define hr 3600UL //Отражают соответствующие количества секунд 
#define d 86400UL

// Переменные для плавного ручного регулирования света
long ti=0; // время последнего изменения яркости
int tp=100;// период изменения ярокости на одно значение в миллисекундах
unsigned long LUD=0;// флаг изменения яркости: 0 -не менять, 1 увеличить, 2 уменьшить

int Relay_Off = HIGH;
int Relay_On = LOW;

RTC_DS1307 RTC;          

long sunrise_start = 17*hr+00*mn; //Начало восхода в 9 - 45 
long sunrise_duration = 3*mn;  //Длительность восхода 30 минут     
long sunset_start = 22*hr+00*mn; //начало заката в 21-15
long sunset_duration = 3*mn; //Длительность заката 30 минут 
long moonrise_start = 22*hr+00*mn ;//Начало луны в 9 - 45
long moonrise_duration = 3*mn;//Длительность восхода
long moonset_start = 23*hr+00*mn;//Конец луны в 11
long moonset_duration = 3*mn; //Длительность заката луны
//********************************************************************************************
void setup(){

Serial.begin(9600);
     lcd.begin(16, 2); // запускаем библиотеку экрана
  pinMode(40, OUTPUT);  // Включаем кипятильник
  pinMode(41, OUTPUT);
  digitalWrite(40, Relay_On);  
  digitalWrite(41, Relay_On);
  Wire.begin(); //Инициируем I2C интерфейс
  RTC.begin();  //Инициирум RTC модуль
  analogWrite(PWM_LW_PIN, PWM_LW_MIN); //Пишем в порт минимальное значение 
  analogWrite(PWM_LR_PIN, PWM_LR_MIN); 
  analogWrite(PWM_LB_PIN, PWM_LB_MIN);
  if (! RTC.isrunning()) {
           Serial.println("RTC is NOT running!");
           RTC.adjust(DateTime(2014, 7, 12, 22, 48, 1));
           }//RTC.adjust(DateTime(__DATE__, __TIME__));
}   // КОНЕЦ ИНИЦИАЛИЗАЦИИ

//********************************************************************************************
void loop() // ПРОГРАММЫй безусловный ЦИКЛ 
{
  analogWrite(10, 100);
  lcd.setCursor(0, 1);
    long pwm_LW;
   long pwm_LR;
  long pwm_LB; 
    DateTime myTime = RTC.now(); //Читаем данные времени из RTC при каждом выполнении цикла
    long Day_time = myTime.unixtime() % 86400; //сохраняем в переменную - время в формате UNIX
 lcd.setCursor(11,0);
 if(myTime.hour()<10)lcd.print(0);
 lcd.print(myTime.hour(),DEC);
 lcd.print(":"); 
 if(myTime.minute()<10)lcd.print(0);
 lcd.print(myTime.minute(),DEC);

if (reg==0){
//*********************************************************************************************
//           обработка интервала до восхода и после заката
//*********************************************************************************************
    if ((Day_time<sunrise_start) ||//Если с начала суток меньше чем начало восхода 
        (Day_time>=sunset_start+sunset_duration)) { //Или больше чем начало заката + длительность
                  pwm_LW = PWM_LW_MIN; //Величина для записи в порт равна минимуму  
                  pwm_LR = PWM_LR_MIN;

//*********************************************************************************************
//           обработка интервала восхода 
//*********************************************************************************************
    }else if ((Day_time>=sunrise_start) && //Если с начала суток больше чем начало восхода
              (Day_time<sunrise_start+sunrise_duration)){ //И меньше чем начало восхода + длительность 

                  pwm_LW =  ((Day_time - sunrise_start)*(PWM_LW_MAX-PWM_LW_MIN)) / sunrise_duration;   //Вычисляем для рассвета величину для записи в порт ШИМ
                  pwm_LR =  ((Day_time - sunrise_start)*(PWM_LR_MAX-PWM_LR_MIN)) / sunrise_duration;

//*********************************************************************************************
//           обработка интервала заката 
//*********************************************************************************************
    }else if ((Day_time>=sunset_start) && //Если  начала суток больше чем начало заката и меньше чем  
              (Day_time<sunset_start+sunset_duration)){//начало заката плюс длительность

                  pwm_LW = ((sunset_start+sunset_duration - Day_time)*(PWM_LW_MAX-PWM_LW_MIN)) / sunrise_duration;    //Вычисляем для заката величину для записи в порт ШИМ
                  pwm_LR = ((sunset_start+sunset_duration - Day_time)*(PWM_LR_MAX-PWM_LR_MIN)) / sunrise_duration;
 
//********************************************************************************************
//           обработка интервала от конца рассвета и до начала заката,
//           когда свет должен быть включен на максимальную яркость 
//********************************************************************************************
    }else {
                  pwm_LW = PWM_LW_MAX; //Устанавливаем максимальную величину для записи в порт ШИМ 
                  pwm_LR = PWM_LR_MAX;
    }
    
    analogWrite(PWM_LW_PIN, pwm_LW);//Пишем в порт вычисленное значение      
    analogWrite(PWM_LR_PIN, pwm_LR);    
   
  //           обработка интервала до восхода луны и после заката
//*********************************************************************************************
    if ((Day_time<moonrise_start) || //Если с начала суток меньше чем начало восхода 
        (Day_time>=moonset_start+moonset_duration)) {//Или больше чем начало заката + длительность
                  pwm_LB = PWM_LB_MIN; //Величина для записи в порт равна минимуму  

//*********************************************************************************************
//           обработка интервала восхода луны
//*********************************************************************************************
    }else if ((Day_time>=moonrise_start) &&//Если с начала суток больше чем начало восхода
              (Day_time<moonrise_start+moonrise_duration)){ //И меньше чем начало восхода + длительность 

                  pwm_LB =  ((Day_time - moonrise_start)*(PWM_LB_MAX-PWM_LB_MIN)) / moonrise_duration; //Вычисляем для рассвета величину для записи в порт ШИМ

//*********************************************************************************************
//           обработка интервала заката луны
//*********************************************************************************************
    }else if ((Day_time>=moonset_start) &&  //Если  начала суток больше чем начало заката и меньше чем  
              (Day_time<moonset_start+moonset_duration)){//начало заката плюс длительность

                  pwm_LB = ((moonset_start+moonset_duration - Day_time)*(PWM_LB_MAX-PWM_LB_MIN)) / moonrise_duration;    //Вычисляем для заката величину для записи в порт ШИМ
 
//********************************************************************************************
//           обработка интервала от конца рассвета и до начала заката луны,
//           когда свет должен быть включен на максимальную яркость 
//********************************************************************************************
    }else {
                  pwm_LB = PWM_LB_MAX;  //Устанавливаем максимальную величину для записи в порт ШИМ 
    }
    
    analogWrite(PWM_LB_PIN, pwm_LB); //Пишем в порт вычисленное значение 
  }
  
byte i;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  // Ищем алрес датчика
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }

  // Проверяем не было ли помех при передаче
  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // Определяем серию датчика
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();            
  ds.select(addr);       // Выбираем адрес
  ds.write(0x44, 1);     // Производим замер, в режиме паразитного питания
  delay(750);    
  
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Считываем оперативную память датчика

  for ( i = 0; i < 9; i++) {           
    data[i] = ds.read();  // Заполняем массив считанными данными
  }

  // Данные о температуре содержатся в первых двух байтах, переведем их в одно значение и преобразуем в шестнадцатиразрядное число
  unsigned int raw = (data[1] << 8) | data[0];
  // Переводим температуру в шкалы по Цельсию и Фаренгейту  
  if (type_s) 
  {
    raw = raw << 3; 
  }
  if (data[7] == 0x10) 
  {
    raw = (raw & 0xFFF0) + 12 - data[6];
  } else {
    byte cfg =  (data[4] & 0x60);
    if (cfg == 0x00) 
      raw = raw << 3; 
    else if  (cfg == 0x20) 
      raw = raw << 2; 
    else if  (cfg == 0x40) \
      raw = raw << 1;
  }  
  
  // Вывод текущего значения температуры на дисплей
  celsius = (float)raw / 16.0;
  lcd.setCursor(0, 0);
  lcd.print("T=");
  lcd.setCursor(2, 0);
  lcd.print(celsius);
  
  delay (10);
  
  celsius =  (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("Temp = ");
  Serial.print(celsius);
  Serial.print(" C, ");
  Serial.print(fahrenheit);
  Serial.println(" F");

  if (reg==0){ // Если регулирование автоматическое -регулируем по температуре
  lcd.setCursor(15, 1);
  lcd.print("A");
  
  // Если температура достигает 28,3 (с погрешностью), отключаем кипятильник Н1
  if (celsius > 28.3)
  {
  digitalWrite(40, Relay_Off); 
  lcd.setCursor(0, 1);
  lcd.print("H1-Off");   
  }
  
// Если температура достигает 28,5 (с погрешностью), отключаем кипятильник Н2
  if (celsius > 28.5)
  {
     digitalWrite(41, Relay_Off); 
  lcd.setCursor(7, 1);
  lcd.print("H2-Off");
  }
  // Если температура падает до 28 (с погрешностью), включаем оба кипятильника
  if (celsius < 28.0)
  {
     digitalWrite(40, Relay_On); 
  lcd.setCursor(0, 1);
  lcd.print("H1-On ");
     digitalWrite(41, Relay_On); 
  lcd.setCursor(7, 1);
  lcd.print("H2-On ");
  }
 }
lcd_key = read_LCD_buttons();  // read the buttons

switch (lcd_key)               // depending on which button was pushed, we perform an action
 {
   case btnRIGHT:
     {
     digitalWrite(41, Relay_Off); 
     lcd.setCursor(7, 1);
     lcd.print("H2-Off");
      break;
     }
   case btnLEFT:
    {
      digitalWrite(41, Relay_On); 
     lcd.setCursor(7, 1);
     lcd.print("H2-On ");
      break;
     }
   case btnUP:
    {
        LUD=1;
        ti=millis();
     break;
     }
   case btnDOWN:
    {
        LUD=2;
        ti=millis();
     break;
     }
     case btnSELECT:
     { 
     if(reg==1)
   {reg=0;
   lcd.setCursor(15, 1);
  lcd.print("A");}
   else 
   {reg=1;
   lcd.setCursor(15, 1);
  lcd.print("M");}
     break;
     }
     case btnNONE: 
     {  
     break; 
     } 
   }

   // Подпрограмма плавного включения и гашения ламп в ручном режиме

   if (reg==1)// если режим ручной
   {if(LUD==1)// если плавное включение света
       {
           if(millis()-ti>tp)
           {int valW = analogRead(PWM_LW_PIN);
            int valR = analogRead(PWM_LR_PIN);
            if (valW<PWM_LW_MAX) {analogWrite(PWM_LW_PIN, valW+1); };
            if (valR<PWM_LR_MAX) {analogWrite(PWM_LR_PIN, valR+1); };
            ti=millis();
            if(valW+1>=PWM_LW_MAX && valR+1>=PWM_LR_MAX){LUD=0;}; 
           };
       };
    if(LUD==2)// если плавное включение света
       {
           if(millis()-ti>tp)
           {int valW = analogRead(PWM_LW_PIN);
            int valR = analogRead(PWM_LR_PIN);
            if (valW>PWM_LW_MIN) {analogWrite(PWM_LW_PIN, valW-1); };
            if (valR>PWM_LR_MIN) {analogWrite(PWM_LR_PIN, valR-1); };
            ti=millis();
            if(valW-1<=PWM_LW_MIN && valR-1<=PWM_LR_MIN){LUD=0;}; 
           };
       };
    };
  
} 
//------------Конец ЦИКЛА---

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

serega.gram пишет:

да я даже незнаю с чего начать с моими знаниями . соотношение подключения ног экрана совпадает. меня смущают другие выходы подключения в скетчи

надо начать с создания новой темы... рекомендации на сайте есть... и про вставку кода в сообщение тоже есть...

serega.gram
Offline
Зарегистрирован: 15.04.2015

всё выяснил всё работает. это я тупанул

serega.gram
Offline
Зарегистрирован: 15.04.2015
/*
&nbsp;
&nbsp;Aquarium controler
&nbsp;
&nbsp;(C) 5/2014 Flavius Bindea

=============================================== 
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
===============================================

*/

#include <Wire.h> // include the I2C library
#include "RTClib.h" // From: https://github.com/adafruit/RTClib.git 573581794b73dc70bccc659df9d54a9f599f4260
#include <EEPROM.h> // Fro read and write EEPROM

// include the library code:
#include <LiquidCrystal.h>

// used for RTC
const int dayspermonth[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
RTC_DS1307 RTC;
DateTime now;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(13, 12, 5, 4, 3, 2);

// 126: -> 127: <-
byte up[8] = {
&nbsp; B00100,
&nbsp; B01110,
&nbsp; B10101,
&nbsp; B00100,
&nbsp; B00100,
&nbsp; B00100,
&nbsp; B00100,
};

byte down[8] = {
&nbsp; B00100,
&nbsp; B00100,
&nbsp; B00100,
&nbsp; B00100,
&nbsp; B10101,
&nbsp; B01110,
&nbsp; B00100,
};

// For Temperature sensor TMP36 on A0
// Change values depending on your real measurements
#define aref_voltage 4.91 // real voltage
#define amplifier 3.58&nbsp;&nbsp;&nbsp; // 3.27 -> amplifier = (R8+R10)/R8 = (220+500)/220, exact=(216+558)/216=3.58

const int sensorPin = A0;
const float baselineTemp = 20.0;

float temperatureC;

// For Averaging
// Define the number of samples to keep track of.&nbsp; The higher the number,
// the more the readings will be smoothed, but the slower the output will
// respond to the input.&nbsp; Using a constant rather than a normal variable lets
// use this value to determine the size of the readings array.
#define numReadings 10
int readings[numReadings];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // the readings from the analog input
int index = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // the index of the current reading
int total = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // the running total
int average = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // the average
int full = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // boolean in order to know if we have enoungh measurements

// For buttons
const int buttonsPin = A1;
int bstate = 1024, blast = 1024;&nbsp; // button state and button last state

// change value depending on your measurements
const int button1max = 75;&nbsp;&nbsp;&nbsp; // reading should be 0, 75 threshold
const int button2min = 76;&nbsp;&nbsp; // reading should be 151, from 76 to 250
const int button2max = 250;
const int button3min = 251;&nbsp;&nbsp; // reading should be 347, from 251 to 430
const int button3max = 430;
const int button4min = 431;&nbsp;&nbsp; // reading should be 515, from 431 to 606
const int button4max = 606;
const int button5min = 607;&nbsp;&nbsp; // reading should be 700, from 607 to 850
const int button5max = 850;
const int buttonNONE = 900;&nbsp;&nbsp; // reading should be 1023

// button types
#define BT_NONE 0
#define BT_SET 1
#define BT_LEFT 2
#define BT_RIGHT 3
#define BT_UP 4
#define BT_DOWN 5

// For looping display by interval
unsigned long previousDisplayMillis = 0; 
unsigned long displayInterval = 1000;
// For looping calculation by interval
unsigned long previousCalculationMillis = 0; 
unsigned long calculationInterval = 250;

// screen size
const byte cols = 16, lines = 2;

// menu of status
const int menumin = 0;
const int menumax = 5;

char* menu_entry[] = {
&nbsp; "1. Set Date/Time",
&nbsp; "2. Light 1 setup",
&nbsp; "3. Light 2 setup",
&nbsp; "4. Switch 1 set ",
&nbsp; "5. Switch 2 set ",
&nbsp; "6. Menu entry 6 "
};

// status of programm
#define ST_DISPLAY 0
#define ST_MENU 1
int status = ST_DISPLAY;

/*
&nbsp;* function prototypes
&nbsp;*/
void set_function(byte lnb, byte wpower=1);

/*
&nbsp;* Define the devices
&nbsp;*/
#define Light_1 11
#define Light_2 10
#define Switch_1 9
#define Switch_2 8
#define Status_Led 7

struct AQTIME {
&nbsp; byte h1;
&nbsp; byte m1;
&nbsp; byte h2;
&nbsp; byte m2;
&nbsp; byte power;
};

// number of setups in memory
#define NBSETS 4
AQTIME ti[NBSETS];
byte out[NBSETS];

// statuses of outputs
#define OFF 0
#define AUTO 1
#define ON 2
#define MAX 3
byte out_m[NBSETS];

// for nice transition
const unsigned long transitionDuration = 10000;
unsigned int transitionSteps;
byte asked_l[NBSETS]; // new asked level
byte last_l[NBSETS];&nbsp; // last asked level
unsigned int current_l[NBSETS]; // current level multiplied by 256 in order to avoid floating calculations
int incr_l[NBSETS];&nbsp;&nbsp; // step increment level multiplied by 256 in order to avoid floating calcultations

#define LightSet 0
#define SwitchSet 2

// EEPROM signature for aquarium: they are stored in 0 and 1
const byte AQ_SIG1 = 45, AQ_SIG2 = 899;

// Initial setup
void setup() 
{
&nbsp; Serial.begin(57600);
&nbsp; Serial.println("Welcome to Aquarium Controler");

&nbsp; // Configures RTC
&nbsp; Wire.begin(); // initalise I2C interface&nbsp; 
&nbsp; 
&nbsp; if (! RTC.isrunning()) {
&nbsp;&nbsp;&nbsp; Serial.println("RTC is NOT running!");
&nbsp;&nbsp;&nbsp; // following line sets the RTC to the date & time this sketch was compiled
&nbsp;&nbsp;&nbsp; RTC.adjust(DateTime(__DATE__, __TIME__));
&nbsp; }

&nbsp; // If you want to set the aref to something other than 5v
&nbsp; analogReference(EXTERNAL);

&nbsp; // Configures display
&nbsp; // set up the number of columns and rows on the LCD 
&nbsp; lcd.createChar(1, up);
&nbsp; lcd.createChar(2, down);

&nbsp; lcd.begin(cols, lines);
&nbsp; 
&nbsp; // Print a message to the LCD.
&nbsp; lcd.print("Hello you!!!");
&nbsp; // set the cursor to column 0, line 1
&nbsp; // line 1 is the second row, since counting begins with 0
&nbsp; lcd.setCursor(0, 1);
&nbsp; // print to the second line
&nbsp; lcd.print("RTC DS1307");
&nbsp; 
&nbsp; // trys to read EEPROM
&nbsp; if(AQ_SIG1 != EEPROM.read(0) || AQ_SIG2 != EEPROM.read(1)) {
&nbsp;&nbsp;&nbsp; lcd.print(" NOT SET");
&nbsp;&nbsp;&nbsp; EEPROM.write(0, AQ_SIG1);
&nbsp;&nbsp;&nbsp; EEPROM.write(1, AQ_SIG2);
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; for(int i = 2; i < 2+NBSETS*5; i++) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EEPROM.write(i, 0);
&nbsp;&nbsp;&nbsp; }
&nbsp; }
&nbsp; else {
&nbsp;&nbsp;&nbsp; // reads the EEPROM setup
&nbsp;&nbsp;&nbsp; read_eeprom(0);
&nbsp;&nbsp;&nbsp; read_eeprom(1);
&nbsp;&nbsp;&nbsp; read_eeprom(2);
&nbsp;&nbsp;&nbsp; read_eeprom(3);
&nbsp; }
&nbsp; 
&nbsp; // setout leds
&nbsp; pinMode(Switch_1, OUTPUT);
&nbsp; pinMode(Switch_2, OUTPUT);
&nbsp; pinMode(Light_1, OUTPUT);
&nbsp; pinMode(Light_2, OUTPUT);
&nbsp; pinMode(Status_Led, OUTPUT);
&nbsp; // Set initial state
&nbsp; digitalWrite(Switch_1, LOW);
&nbsp; digitalWrite(Switch_2, LOW);
&nbsp; analogWrite(Light_1, 0); // Turn off light 1
&nbsp; analogWrite(Light_2, 0); // Turn off light 2
&nbsp; digitalWrite(Status_Led, HIGH);
&nbsp; out[0] = Light_1;
&nbsp; out[1] = Light_2;
&nbsp; out[2] = Switch_1;
&nbsp; out[3] = Switch_2;
&nbsp; for(int i = 0; i < NBSETS; i++) {
&nbsp;&nbsp;&nbsp; out_m[i] = AUTO;
&nbsp;&nbsp;&nbsp; current_l[NBSETS] = asked_l[NBSETS] = last_l[NBSETS] = 0;&nbsp; // last asked level and last level
&nbsp; }&nbsp;&nbsp;&nbsp; 

&nbsp; // smooth transition
&nbsp; transitionSteps = transitionDuration / calculationInterval;
&nbsp; 
&nbsp; delay(1000);
}

/*
** Main loop
*/
void loop() 
{
&nbsp; int pressed_bt;

//&nbsp; Serial.println("loop");
&nbsp; 
&nbsp; // For interval determination
&nbsp; unsigned long currentMillis = millis();

&nbsp; if(currentMillis - previousCalculationMillis > calculationInterval) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // save lasted calculation millis
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; previousCalculationMillis = currentMillis;&nbsp; 
&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // does interval calculations
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; calculations();
&nbsp; }
&nbsp; if(status == ST_DISPLAY) {
&nbsp;&nbsp;&nbsp; // only once an interval
&nbsp;&nbsp;&nbsp; if(currentMillis - previousDisplayMillis > displayInterval) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.println("display interval");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // save lasted display millis
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; previousDisplayMillis = currentMillis;&nbsp; 
&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // display the data on the screen
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; display_data();
&nbsp;&nbsp;&nbsp; } 
&nbsp; }

&nbsp; pressed_bt = read_button();

&nbsp; switch(pressed_bt) {
&nbsp;&nbsp;&nbsp; case BT_SET:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chg_status();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do_menu();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp; case BT_LEFT:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch_out(0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp; case BT_RIGHT:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch_out(1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp; case BT_UP:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch_out(2);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp; case BT_DOWN:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch_out(3);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp; // small delay
&nbsp;&nbsp; delay(50);
}

// switch the menu status
void chg_status()
{
&nbsp; if(status == ST_DISPLAY) {
&nbsp;&nbsp;&nbsp; lcd.blink();
&nbsp;&nbsp;&nbsp; status = ST_MENU;
&nbsp; }
&nbsp; else {
&nbsp;&nbsp;&nbsp; lcd.noBlink();
&nbsp;&nbsp;&nbsp; status = ST_DISPLAY;
&nbsp; }
}

// switch out put mode
void switch_out(byte n)
{
&nbsp; switch(out_m[n]) {
&nbsp;&nbsp;&nbsp; case OFF:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out_m[n] = AUTO;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp; case AUTO:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out_m[n] = ON;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp; case ON:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out_m[n] = MAX;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp; case MAX:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out_m[n] = OFF;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp; }
&nbsp; display_out(n);
}

/*
** return button status if it has changed
*/
int read_button()
{
&nbsp; int button;
&nbsp; /*
&nbsp; // check to see if you just pressed the button
&nbsp; // (i.e. the input went from LOW to HIGH),&nbsp; and you've waited
&nbsp; // long enough since the last press to ignore any noise:&nbsp; 

&nbsp; // If the switch changed, due to noise or pressing:
&nbsp; if (reading != lastButtonState) {
&nbsp;&nbsp;&nbsp; // reset the debouncing timer
&nbsp;&nbsp;&nbsp; lastDebounceTime = millis();
&nbsp; }
&nbsp;
&nbsp; if ((millis() - lastDebounceTime) > debounceDelay) {
&nbsp;&nbsp;&nbsp; // whatever the reading is at, it's been there for longer
&nbsp;&nbsp;&nbsp; // than the debounce delay, so take it as the actual current state:

&nbsp;&nbsp;&nbsp; // if the button state has changed
&nbsp;&nbsp;&nbsp; */
&nbsp; // read the buttons
&nbsp; button = analogRead(buttonsPin);

&nbsp; blast = bstate;

&nbsp; if (button < button1max)
&nbsp;&nbsp;&nbsp; bstate = 1;
&nbsp; else if (button >= button2min && button <= button2max)
&nbsp;&nbsp;&nbsp; bstate = 2;
&nbsp; else if (button >= button3min && button <= button3max)
&nbsp;&nbsp;&nbsp; bstate = 3;
&nbsp; else if (button >= button4min && button <= button4max)
&nbsp;&nbsp;&nbsp; bstate = 4;
&nbsp; else if (button >= button5min && button <= button5max)
&nbsp;&nbsp;&nbsp; bstate = 5;
&nbsp; else if (button >= buttonNONE)
&nbsp;&nbsp;&nbsp; bstate = 0;
&nbsp; else
&nbsp;&nbsp;&nbsp; bstate = 99; // we should never arrive here

//&nbsp; Serial.print("VALUE: "); Serial.println(button);

&nbsp; if(bstate == 99) {
&nbsp;&nbsp;&nbsp; Serial.print("ERROR: "); Serial.println(button);
&nbsp; }
&nbsp; 
&nbsp; if (blast != bstate) {
&nbsp;&nbsp;&nbsp; // state has changed
&nbsp;&nbsp;&nbsp; if(bstate >=1 && bstate <= 5) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.print("BUTTON: "); Serial.println(bstate);&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return(bstate);
&nbsp;&nbsp;&nbsp; }
&nbsp; }
&nbsp; return(0);
}

// read blocking
int read_button_blocking()
{
&nbsp; int i;

&nbsp; Serial.println("read button blocking");

&nbsp; while((i = read_button()) == 0)
&nbsp;&nbsp;&nbsp; delay(50);
&nbsp;&nbsp;&nbsp; 
&nbsp; return i;
}

/*
** does interval calculations
*/
void calculations()
{
&nbsp; int h, m;
//&nbsp; Serial.println("calculations");

&nbsp; // getting the voltage reading from the temperature sensor
&nbsp; // subtract the last reading:
&nbsp; total= total - readings[index];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp; // read from the sensor:&nbsp; 
&nbsp; delay(100);
&nbsp; readings[index] = analogRead(sensorPin);
//&nbsp; delay(100);
&nbsp; //Serial.print(readings[index]); Serial.println(" reading");
&nbsp; // add the reading to the total:
&nbsp; total= total + readings[index];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp; // advance to the next position in the array:&nbsp; 
&nbsp; index = index + 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp; if (full == 0 && index == numReadings)
&nbsp;&nbsp;&nbsp;&nbsp; full = 1;
&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp; // if we're at the end of the array...
&nbsp; if (index >= numReadings)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp; // ...wrap around to the beginning:
&nbsp;&nbsp;&nbsp;&nbsp; index = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp; if(full) {
&nbsp;&nbsp;&nbsp; // calculate the average:
&nbsp;&nbsp;&nbsp; average = total / numReadings;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; //Serial.print(average); Serial.println(" average");
&nbsp; 
&nbsp;&nbsp;&nbsp; // converting that reading to voltage
&nbsp;&nbsp;&nbsp; float voltage = average * aref_voltage/amplifier;
&nbsp;&nbsp;&nbsp; voltage /= 1024.0;
&nbsp;&nbsp;&nbsp; // print out the voltage
&nbsp;&nbsp;&nbsp; //Serial.print(voltage, 4); Serial.println(" volts");
&nbsp;&nbsp;&nbsp; // now print out the temperature
&nbsp;&nbsp;&nbsp; temperatureC = (voltage - 0.5) * 100 ; //converting from 10 mv per degree wit 500 mV offset
&nbsp;&nbsp;&nbsp; //Serial.print(temperatureC); Serial.println(" degrees C");
&nbsp; }
&nbsp; else {
&nbsp;&nbsp;&nbsp; //Serial.print(index); Serial.println(" averaging");
&nbsp; }&nbsp; 

&nbsp; // read the date&nbsp; 
&nbsp; now = RTC.now();
&nbsp; h = now.hour();
&nbsp; m = now.minute();
&nbsp; 
&nbsp; // setting the status of the outputs
&nbsp; for(int li = 0; li < 4; li++) {
&nbsp;&nbsp;&nbsp; Serial.print("Calculation for ");
&nbsp;&nbsp;&nbsp; Serial.println(li);
//&nbsp;&nbsp;&nbsp; Serial.print("Nb of steps:");
//&nbsp;&nbsp;&nbsp; Serial.println(transitionSteps);

&nbsp;&nbsp;&nbsp; byte out_s;
&nbsp;&nbsp;&nbsp; if(out_m[li] == OFF)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out_s = OFF;
&nbsp;&nbsp;&nbsp; else if(out_m[li] == ON)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out_s = ON;
&nbsp;&nbsp;&nbsp; else if(out_m[li] == MAX)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out_s = MAX;
&nbsp;&nbsp;&nbsp; else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // checking if we are in the ON time period
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte order = ((ti[li].h2 > ti[li].h1) || (ti[li].h1 == ti[li].h2 && ti[li].m2 >= ti[li].m1)) ? 1 : 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( order && (h > ti[li].h1 || (h == ti[li].h1 && m >= ti[li].m1)) && (h < ti[li].h2 || (h == ti[li].h2 && m <= ti[li].m2))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || ((h > ti[li].h2 || (h == ti[li].h2 && m >= ti[li].m2)) && (h < ti[li].h1 || (h == ti[li].h1 && m <= ti[li].m1))) )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out_s = ON;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out_s = OFF;
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; if(li < 2) {
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.print("Status = ");
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.println(out_s);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(out_s) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case OFF:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; asked_l[li] = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case ON:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; asked_l[li] = ti[li].power*255/99;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case MAX:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; asked_l[li] = 255;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.print("Asked Level = ");
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.print(asked_l[li]);
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.print(", Last Level = ");
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.print(last_l[li]);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(asked_l[li] != last_l[li]) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incr_l[li] = ((long)asked_l[li]*256 - current_l[li])/transitionSteps;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.print("Set Increment To= ");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.println(incr_l[li]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; last_l[li] = asked_l[li];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.print(", Increment = ");
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.print(incr_l[li]);
&nbsp;&nbsp;&nbsp; 
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.print(", Current Before = ");
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.println(current_l[li]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(current_l[li] != asked_l[li]) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; current_l[li] += incr_l[li];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(abs(current_l[li] - asked_l[li]*256) < abs(incr_l[li])) {
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.println("Last--------------------------------");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; current_l[li] = (unsigned)asked_l[li]*256;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incr_l[li] = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.print(", Current After = ");
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.println(current_l[li]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; analogWrite(out[li], current_l[li]/256);
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(out_s == OFF)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digitalWrite(out[li], LOW);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digitalWrite(out[li], HIGH);
&nbsp;&nbsp;&nbsp; }
&nbsp; }
}

// does the menu
void do_menu()
{
&nbsp; int pressed_bt = -1;
&nbsp; int menuline = 0;

&nbsp; Serial.println("do menu---------------------------------");

&nbsp; start_menu();

&nbsp; do {
&nbsp;&nbsp;&nbsp; Serial.print("not set button");
&nbsp;&nbsp;&nbsp; Serial.print("button = ");
&nbsp;&nbsp;&nbsp; Serial.print(pressed_bt);
&nbsp;&nbsp;&nbsp; Serial.print(",&nbsp; menuline = ");
&nbsp;&nbsp;&nbsp; Serial.println(menuline);

&nbsp;&nbsp;&nbsp; switch(pressed_bt) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case BT_LEFT:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case BT_RIGHT:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do_menu_entry(menuline);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp; case BT_UP:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; menuline--;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp; case BT_DOWN:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; menuline++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp; if(menuline < menumin)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; menuline = menumin;
&nbsp;&nbsp;&nbsp;&nbsp; else if(menuline > menumax)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; menuline = menumax;

&nbsp;&nbsp;&nbsp; lcd.setCursor(0, 1);
&nbsp;&nbsp;&nbsp; lcd.write(menu_entry[menuline]);
&nbsp;&nbsp;&nbsp; lcd.setCursor(15, 1);
&nbsp; } while((pressed_bt = read_button_blocking()) != BT_SET);

&nbsp; Serial.println("SET button pressed");
&nbsp; chg_status();
}

void start_menu()
{
&nbsp; lcd.clear();
&nbsp; lcd.setCursor(0, 0);
&nbsp; lcd.write("Menu: use ");
&nbsp; lcd.write(1);
&nbsp; lcd.write(2);
&nbsp; lcd.write(126);
&nbsp; lcd.write("SET");
}

void do_menu_entry(int en)
{
&nbsp; Serial.print("Do menu entry:");
&nbsp; Serial.println(en);

&nbsp; switch(en) {
&nbsp;&nbsp;&nbsp;&nbsp; case 0:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set_time();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp; case 1:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set_function(1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp; case 2:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set_function(2);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp; case 3:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set_function(3, 0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp; case 4:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set_function(4, 0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp; }
}

/*
** Menu entry to setup the time
*/
void set_time()
{
&nbsp; int pressed_bt = -1;
&nbsp; int pos = 0, v;
&nbsp; char val[16];
&nbsp; int day, month, year, hour, min;
&nbsp; int i;
&nbsp; int ok = 0;

&nbsp; Serial.println("do set time---------------------------------");
&nbsp; /*
&nbsp; ** 0123456789012345
&nbsp; ** 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1
&nbsp; ** DD/MM/YYYY HH:MM
&nbsp; */
&nbsp; 
&nbsp; now = RTC.now();
&nbsp; val[0] = now.day()/10+'0';
&nbsp; val[1] = now.day()%10+'0';
&nbsp; val[2] = '/';
&nbsp; val[3] = now.month()/10+'0';
&nbsp; val[4] = now.month()%10+'0';
&nbsp; val[5] = '/';
&nbsp; year = now.year();
&nbsp; val[6] = '2';
&nbsp; val[7] = '0';
&nbsp; year = year-2000;
&nbsp; val[8] = year/10+'0';
&nbsp; val[9] = year%10+'0';
&nbsp; val[10] = ' ';
&nbsp; val[11] = now.hour()/10+'0';
&nbsp; val[12] = now.hour()%10+'0';
&nbsp; val[13] = ':';
&nbsp; val[14]= now.minute()/10+'0';
&nbsp; val[15]= now.minute()%10+'0';

&nbsp; lcd.clear();
&nbsp; lcd.setCursor(0, 0);
&nbsp; lcd.write("Time: use");
&nbsp; lcd.write(1);
&nbsp; lcd.write(2);
&nbsp; lcd.write(127);
&nbsp; lcd.write(126);
&nbsp; lcd.write("SET");

&nbsp; lcd.setCursor(0, 1);
&nbsp; for(i = 0; i < 16; i++)
&nbsp;&nbsp;&nbsp; lcd.print(val[i]);

&nbsp; do {
&nbsp;&nbsp;&nbsp; do {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.println("not set button");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(pressed_bt) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case BT_LEFT:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(pos) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 3:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 4:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 3;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 8:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 4;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 9:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 8;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 11:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 9;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 12:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 11;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 14:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 12;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 15:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 14;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case BT_RIGHT:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(pos) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 3;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 3:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 4;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 4:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 8;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 8:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 9;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 9:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 11;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 11:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 12;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 12:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 14;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 14:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 15;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case BT_UP:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; val[pos]++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case BT_DOWN:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; val[pos]--;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(val[pos] < '0')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; val[pos] = '0';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (val[pos] > '9')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; val[pos] = '9'; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcd.setCursor(pos, 1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcd.print(val[pos]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcd.setCursor(pos, 1);
&nbsp;&nbsp;&nbsp; } while((pressed_bt = read_button_blocking()) != BT_SET);
&nbsp;&nbsp;&nbsp; day = (val[0] - '0')*10+val[1]-'0';
&nbsp;&nbsp;&nbsp; month = (val[3]-'0')*10+val[4]-'0';
&nbsp;&nbsp;&nbsp; year = (val[8]-'0')*10+val[9]-'0';
&nbsp;&nbsp;&nbsp; hour = (val[11]-'0')*10+val[12]-'0';
&nbsp;&nbsp;&nbsp; min = (val[14]-'0')*10+val[15]-'0';
&nbsp;&nbsp;&nbsp; Serial.print("day:");
&nbsp;&nbsp;&nbsp; Serial.println(day);
&nbsp;&nbsp;&nbsp; Serial.print("month:");
&nbsp;&nbsp;&nbsp; Serial.println(month);
&nbsp;&nbsp;&nbsp; Serial.print("year:");
&nbsp;&nbsp;&nbsp; Serial.println(year);
&nbsp;&nbsp;&nbsp; Serial.print("hour:");
&nbsp;&nbsp;&nbsp; Serial.println(hour);
&nbsp;&nbsp;&nbsp; Serial.print("min:");
&nbsp;&nbsp;&nbsp; Serial.println(min);

&nbsp;&nbsp;&nbsp; if(min >= 0 && min < 60
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; && hour >= 0 && hour < 24
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; && month >= 1 && month <= 12
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; && year >= 0 && year <= 99 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; && day >= 0 && day <= dayspermonth[month-1])
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok = 1;
&nbsp; } while(!ok);&nbsp; 
&nbsp; RTC.adjust(DateTime(year, month, day, hour, min, 0));
}

/*
** setting a entry in the menu
*/
void set_function(byte lnb, byte wpower)
{
&nbsp; int place, eelocate;
&nbsp; int pressed_bt = -1;
&nbsp; int pos = 0, v;
&nbsp; char val[16];
&nbsp; byte h1, m1, h2, m2, power;
&nbsp; int i;
&nbsp; int ok = 0;
&nbsp; place = lnb - 1;
&nbsp; eelocate = 2+place*5;

&nbsp; Serial.print("do set light---------------- Number: ");
&nbsp; Serial.print(lnb);
&nbsp; Serial.print(" --- with power: ");
&nbsp; Serial.print(wpower);
&nbsp; Serial.println("---");
&nbsp; 
&nbsp; // make sure we are up tu date from EEPROM
&nbsp; read_eeprom(place);
&nbsp; h1 = ti[place].h1;&nbsp;&nbsp; 
&nbsp; m1 = ti[place].m2;&nbsp;&nbsp; 
&nbsp; h2 = ti[place].h2;&nbsp;&nbsp; 
&nbsp; m2 = ti[place].m2;&nbsp;&nbsp; 
&nbsp; power = ti[place].power;&nbsp;&nbsp; 

&nbsp; /*
&nbsp; ** 0123456789012345
&nbsp; ** 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1
&nbsp; ** HH:MM HH:MM XX
&nbsp; */
&nbsp; 
&nbsp; val[0] = h1/10+'0';
&nbsp; val[1] = h1%10+'0';
&nbsp; val[2] = ':';
&nbsp; val[3] = m1/10+'0';
&nbsp; val[4] = m1%10+'0';
&nbsp; val[5] = ' ';
&nbsp; val[6] = h2/10+'0';
&nbsp; val[7] = h2%10+'0';
&nbsp; val[8] = ':';
&nbsp; val[9] = m2/10+'0';
&nbsp; val[10] = m2%10+'0';
&nbsp; val[11] = ' ';
&nbsp; val[12] = (wpower) ? power/10+'0' : ' ';
&nbsp; val[13] = (wpower) ? power%10+'0' : ' ';
&nbsp; val[14] = ' ';
&nbsp; val[15] = ' ';
&nbsp; 
&nbsp; lcd.clear();
&nbsp; lcd.setCursor(0, 0);
&nbsp; lcd.write("Start Stop");
&nbsp; if(wpower)
&nbsp;&nbsp;&nbsp; lcd.write(" POW");

&nbsp; lcd.setCursor(0, 1);
&nbsp; for(i = 0; i < 16; i++)
&nbsp;&nbsp;&nbsp; lcd.print(val[i]);

&nbsp; do {
&nbsp;&nbsp;&nbsp; do {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.println("not set button");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(pressed_bt) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case BT_LEFT:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(pos) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 3:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 4:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 3;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 6:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 4;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 7:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 6;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 9:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 7;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 10:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 9;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 12:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 10;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 13:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 12;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case BT_RIGHT:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(pos) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 3;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 3:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 4;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 4:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 6;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 6:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 7;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 7:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 9;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 9:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = 10;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 10:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = (wpower) ? 12 : 10;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 12:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = (wpower) ? 13 : 10;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case BT_UP:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; val[pos]++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case BT_DOWN:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; val[pos]--;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(val[pos] < '0')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; val[pos] = '0';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (val[pos] > '9')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; val[pos] = '9'; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcd.setCursor(pos, 1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcd.print(val[pos]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcd.setCursor(pos, 1);
&nbsp;&nbsp;&nbsp; } while((pressed_bt = read_button_blocking()) != BT_SET);
&nbsp;&nbsp;&nbsp; h1 = (val[0]-'0')*10+val[1]-'0';
&nbsp;&nbsp;&nbsp; m1 = (val[3]-'0')*10+val[4]-'0';
&nbsp;&nbsp;&nbsp; h2 = (val[6]-'0')*10+val[7]-'0';
&nbsp;&nbsp;&nbsp; m2 = (val[9]-'0')*10+val[10]-'0';
&nbsp;&nbsp;&nbsp; power = (wpower) ? (val[12]-'0')*10+val[13]-'0' : 0;

&nbsp;&nbsp;&nbsp; if(h1 >= 0 && h1 < 24
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; && m1 >= 0 && m1 < 60
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; && h2 >= 0 && h2 < 24
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; && m2 >= 0 && m2 < 60
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; && power >= 0 && power <= 99)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok = 1;
&nbsp; } while(!ok);&nbsp; 
&nbsp; ti[place].h1 = h1;&nbsp;&nbsp; 
&nbsp; ti[place].m1 = m1;&nbsp;&nbsp; 
&nbsp; ti[place].h2 = h2;&nbsp;&nbsp; 
&nbsp; ti[place].m2 = m2;&nbsp;&nbsp; 
&nbsp; ti[place].power = power;&nbsp;&nbsp; 

&nbsp; EEPROM.write(eelocate++, h1); // H1&nbsp; 
&nbsp; EEPROM.write(eelocate++, m1); // M1&nbsp; 
&nbsp; EEPROM.write(eelocate++, h2); // H2&nbsp; 
&nbsp; EEPROM.write(eelocate++, m2); // M2&nbsp; 
&nbsp; EEPROM.write(eelocate, power); // P1&nbsp; 
}

// reads data from EEPROM
void read_eeprom(byte place)
{
&nbsp; int eelocate;
&nbsp; eelocate = 2+place*5;
&nbsp; ti[place].h1 = EEPROM.read(eelocate++);&nbsp;&nbsp; 
&nbsp; ti[place].m1 = EEPROM.read(eelocate++);&nbsp;&nbsp; 
&nbsp; ti[place].h2 = EEPROM.read(eelocate++);&nbsp;&nbsp; 
&nbsp; ti[place].m2 = EEPROM.read(eelocate++);&nbsp;&nbsp; 
&nbsp; ti[place].power = EEPROM.read(eelocate);&nbsp;&nbsp; 

}

// this displays the data on the screen: this function has to be rewritten and the call also. Do not need to redisplay everithing each second
void display_data()
{
&nbsp; // Prints RTC Time on RTC
&nbsp; now = RTC.now();
&nbsp; 
//&nbsp; Serial.println("display data");

&nbsp; // clean up the screen before printing
&nbsp; lcd.clear();
&nbsp; // set the cursor to column 0, line 0&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp; lcd.setCursor(0, 0);

&nbsp; // print date
&nbsp; print2dec(now.day());
&nbsp; lcd.print('/');
&nbsp; print2dec(now.month());
&nbsp; lcd.print('/');
&nbsp; lcd.print(now.year());

&nbsp; // move the cursor to the second line
&nbsp; lcd.setCursor(0, 1);
&nbsp; // Print time
&nbsp; print2dec(now.hour());
&nbsp; lcd.print(':');
&nbsp; print2dec(now.minute());
&nbsp; lcd.print(':');
&nbsp; print2dec(now.second());

&nbsp; lcd.print(' ');
&nbsp; // Prints statuses
&nbsp; for(byte i = 0; i < NBSETS; i++) {
&nbsp;&nbsp;&nbsp; display_out(i);
&nbsp; }
&nbsp; 
&nbsp; // displays temperature
&nbsp; lcd.setCursor(12,0);

&nbsp; // Now prints on LCD
&nbsp; if(full) {
&nbsp;&nbsp;&nbsp; lcd.print((int)temperatureC);
&nbsp;&nbsp;&nbsp; lcd.print('.');
&nbsp;&nbsp;&nbsp; lcd.print((int)((temperatureC+0.05-(int)temperatureC)*10.0));
&nbsp; }
&nbsp; else {
&nbsp;&nbsp;&nbsp; lcd.print(index); lcd.print("Avr");
&nbsp; }

}

void display_out(byte i)
{
&nbsp; lcd.setCursor(10+i, 1);
&nbsp; switch(out_m[i]) {
&nbsp;&nbsp;&nbsp; case OFF:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcd.print('0');
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp; case AUTO:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcd.print('A');
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp; case ON:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcd.print('1');
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp; case MAX:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcd.print('M');
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}

void print2dec(int nb) { //this adds a 0 before single digit numbers
&nbsp; if (nb >= 0 && nb < 10) {
&nbsp;&nbsp;&nbsp; lcd.write('0');
&nbsp; }
&nbsp; lcd.print(nb);
}

и снова здраствуйте. не поможете прописать библиотеку LiquidCrystal_I2C. практически везде получалось а тут не могу. в том виде код работает а c i2c не хочет

 

serega.gram
Offline
Зарегистрирован: 15.04.2015

Здравствуйте не подскажите как правильно прописать под i2c. С обычной распиновкой код работает. Обычно получалось подменит строки.

itjunky
Offline
Зарегистрирован: 15.09.2014

 

0400 &nbsp; if(bstate == 99) {
0401 &nbsp;&nbsp;&nbsp; Serial.print("ERROR: "); Serial.println(button);
0402 &nbsp; }
0403 &nbsp;
0404 &nbsp; if (blast != bstate) {
0405 &nbsp;&nbsp;&nbsp; // state has changed
0406 &nbsp;&nbsp;&nbsp; if(bstate >=1 && bstate <= 5) {
0407 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.print("BUTTON: "); Serial.println(bstate);&nbsp;
0408 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return(bstate);
0409 &nbsp;&nbsp;&nbsp; }
0410 &nbsp; }
0411 &nbsp; return(0);
0412 }

 

А как читать такой код с бесконечными &nbsp ?

Может Вы его лучше скопируете из текстового редактора или ардуино IDE?

 

Да и вообще потратили уже целый месяц на поиск, за это время даже человек никогда не видивший кода сможет написать программку, которая моргает диодами и даже сделает их плавное затухание. И всё это не дёрганьем непонятного кода из разных мест, а вдумчивым чтением документации или одной из множества статей по тому как программировать ардуино. Освоив базу уже легко смогли бы написать необходимый код в нсчастных 100-200 строк.

И я думаю, Вам уже стоит понять, что люди тут потратили кучу времени на то что бы понять как это всё работает. И что Вы думаете, Вам вот так за бесплатно просто кто-то отдаст ещё несколько часов своей жизни на то что бы изучить Ваш не малый код и понять что имено Вам в нём нужно поменять? Это наивно.

Если не хотите думать, платите тем, кто готов думать. Если хотите всё и на халяву, то так не будет.

serega.gram
Offline
Зарегистрирован: 15.04.2015

#include <Wire.h> // include the I2C library
#include "RTClib.h"// 
#include <OneWire.h>
#include <EEPROM.h> // Fro read and write EEPROM
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
// include the library code:

// used for RTC
const int dayspermonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
RTC_DS1307 RTC;
DateTime now;

// 126: -> 127: <-
byte up[8] = {
&nbsp; B00100,
&nbsp; B01110,
&nbsp; B10101,
&nbsp; B00100,
&nbsp; B00100,
&nbsp; B00100,
&nbsp; B00100,
};

byte down[8] = {
&nbsp; B00100,
&nbsp; B00100,
&nbsp; B00100,
&nbsp; B00100,
&nbsp; B10101,
&nbsp; B01110,
&nbsp; B00100,
};

// For Temperature sensor TMP36 on A0
// Change values depending on your real measurements
#define aref_voltage 4.91 // real voltage
#define amplifier 3.58&nbsp;&nbsp;&nbsp; // 3.27 -> amplifier = (R8+R10)/R8 = (220+500)/220, exact=(216+558)/216=3.58

const int sensorPin = A0;
const float baselineTemp = 20.0;

float temperatureC;

// For Averaging
// Define the number of samples to keep track of.&nbsp; The higher the number,
// the more the readings will be smoothed, but the slower the output will
// respond to the input.&nbsp; Using a constant rather than a normal variable lets
// use this value to determine the size of the readings array.
#define numReadings 10
int readings[numReadings];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // the readings from the analog input
int index = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // the index of the current reading
int total = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // the running total
int average = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // the average
int full = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // boolean in order to know if we have enoungh measurements

// For buttons
const int buttonsPin = A1;
int bstate = 1024, blast = 1024;&nbsp; // button state and button last state

// change value depending on your measurements
const int button1max = 75;&nbsp;&nbsp;&nbsp; // reading should be 0, 75 threshold
const int button2min = 76;&nbsp;&nbsp; // reading should be 151, from 76 to 250
const int button2max = 250;
const int button3min = 251;&nbsp;&nbsp; // reading should be 347, from 251 to 430
const int button3max = 430;
const int button4min = 431;&nbsp;&nbsp; // reading should be 515, from 431 to 606
const int button4max = 606;
const int button5min = 607;&nbsp;&nbsp; // reading should be 700, from 607 to 850
const int button5max = 850;
const int buttonNONE = 900;&nbsp;&nbsp; // reading should be 1023

// button types
#define BT_NONE 0
#define BT_SET 1
#define BT_LEFT 2
#define BT_RIGHT 3
#define BT_UP 4
#define BT_DOWN 5

// For looping display by interval
unsigned long previousDisplayMillis = 0;
unsigned long displayInterval = 1000;
// For looping calculation by interval
unsigned long previousCalculationMillis = 0;
unsigned long calculationInterval = 250;

// screen size
const byte cols = 16, lines = 2;

// menu of status
const int menumin = 0;
const int menumax = 5;

char* menu_entry[] = {
&nbsp; "1. Set Date/Time",
&nbsp; "2. Light 1 setup",
&nbsp; "3. Light 2 setup",
&nbsp; "4. Switch 1 set ",
&nbsp; "5. Switch 2 set ",
&nbsp; "6. Menu entry 6 "
};

// status of programm
#define ST_DISPLAY 0
#define ST_MENU 1
int status = ST_DISPLAY;

/*
&nbsp;* function prototypes
&nbsp;*/
void set_function(byte lnb, byte wpower = 1);

/*
&nbsp;* Define the devices
&nbsp;*/
#define Light_1 11
#define Light_2 10
#define Switch_1 9
#define Switch_2 8
#define Status_Led 7

struct AQTIME {
&nbsp; byte h1;
&nbsp; byte m1;
&nbsp; byte h2;
&nbsp; byte m2;
&nbsp; byte power;
};

// number of setups in memory
#define NBSETS 4
AQTIME ti[NBSETS];
byte out[NBSETS];

// statuses of outputs
#define OFF 0
#define AUTO 1
#define ON 2
#define MAX 3
byte out_m[NBSETS];

// for nice transition
const unsigned long transitionDuration = 10000;
unsigned int transitionSteps;
byte asked_l[NBSETS]; // new asked level
byte last_l[NBSETS];&nbsp; // last asked level
unsigned int current_l[NBSETS]; // current level multiplied by 256 in order to avoid floating calculations
int incr_l[NBSETS];&nbsp;&nbsp; // step increment level multiplied by 256 in order to avoid floating calcultations

#define LightSet 0
#define SwitchSet 2

// EEPROM signature for aquarium: they are stored in 0 and 1
const byte AQ_SIG1 = 45, AQ_SIG2 = 899;

// Initial setup
void setup(){

&nbsp; Serial.begin(57600);
&nbsp; lcd.init();  //Инициализируем ЖК дисплей
&nbsp; lcd.setBacklight(1); //Включаем на ЖК дисплее подсветку

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

itjunky
Offline
Зарегистрирован: 15.09.2014

Из того что было в предыдущих постах, выходило, что Вы именно хотите, что бы кто-то всё сделал за Вас.

Возможно надо яснее излагать мысли. Но впечатление именно такое, что всё и на халяву, дай дай...

Если это не так, то стоит задать вопрос по новой. И желательно что бы код был спрятан в нужные тэга, а пробелы были пробелами, иначе никто это читать не будет.