термостат и таймер

alex72
alex72 аватар
Offline
Зарегистрирован: 08.03.2018

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

#include <EEPROM.h>

#include <OneWire.h>
#include <LiquidCrystal.h>              // Подключаем библиотеку LiquidCrystal_I2C 
#include <DallasTemperature.h>              // Подключаем библиотеку DallasTempature
#define DS18B20 15                          // Указываем, к какому выводу подключена DQ

byte simvol[8]   = {B11100,B10100,B11100,B00000,B00000,B00000,B00000,B00000,}; // Символ градуса

OneWire oneWire(DS18B20);                   
DallasTemperature sensors(&oneWire);
LiquidCrystal lcd(8,9,4,5,6,7);
int led = 13; // LED подсоединен к выводу 13
int x; //шина кнопок                
unsigned long currentTime; //текущее время
unsigned long loopTime; //время окончания
unsigned long LimitTime = 0; //таймер
boolean running = false; //Флаг Запуска отсчета

byte qty; // количество градусников на шине 
    int temp;
    int tempMin = 35; // температура начала вращения вентилятора
    int tempMax = 48; // максимальная температура, когда вентилятор вращается на 100%
    int OUT = 12; 
    int sensor=A2; 
    int dig_out;
    float millivolt; 
   
   

       
 
   
  void setup()
{      
  pinMode(OUT, OUTPUT);
  pinMode(led, OUTPUT);      // устанавливаем вывод 12 как выход
  pinMode(A2,INPUT); // sets A2 as input
  lcd.begin(20, 4);
  currentTime = millis();       // считываем время, прошедшее с момен
  Serial.begin(9600); 
  lcd.setCursor(1, 3);   
  sensors.begin();                           // Запуск библиотеки, по умолчанию 9 бит      
  lcd.setCursor(2,0);                        // Устанавливаем курсор на 1 строку, ячейка 2
  lcd.print(" t =");                         // Выводим текст
               
}
void loop()
{
  if (running == true) {    //Выбран режим отсчета 

  //отсчет времени
  currentTime = millis();
  
  loopTime = currentTime + LimitTime; //когда закончить
  while(currentTime < loopTime){              // сравниваем текущее время с вр окончания
    digitalWrite(led, HIGH);     // включаем LED
    digitalWrite(OUT, LOW);
   //Проверяем кнопку "Прервать"
   x = analogRead (0); //считываем шину кнопок
   delay(200); //защита от дребезга
   if (x < 60) { 
   //"прервать" кнопка "Right " 
   lcd.begin(20, 4);
   lcd.setCursor(24, 1);
   lcd.print("ERROR"); //выводим прервано
   //устанавливаем начальные значения
   running = false; 
   LimitTime = 0;
   delay(3000); //пауза
   lcd.begin(20, 4);
   goto bailout; //переход на опрос клавиатуры
   } 
   lcd.begin(20, 4);
   lcd.createChar(1, simvol);                  // Создаем символ под номером 1
  sensors.requestTemperatures();              // Считываем показания температуры 
  lcd.setCursor(8,0);     // Устанавливаем курсор на 1 строку, ячейка 7 
  temp = sensors.getTempCByIndex(0);
  lcd.print(temp);      // Выводим показания температуры
  lcd.setCursor(12,0);                        // Устанавливаем курсор на 1 строку, ячейка 12  
  lcd.print("\1");                            // Выводим символ градуса
  lcd.setCursor(13,0);                        // Устанавливаем курсор на 1 строку, ячейка 13 
  lcd.print("C");  
   dig_out=analogRead(A2);
  millivolt=(dig_out*0.250); 
  lcd.setCursor(26, 0); // выводим с 21го символа на экране в третьей строке.
  lcd.print(millivolt); // prints the input voltage
  lcd.print("  ");
  lcd.print(" Bar"); 
    delay(100);                         // Выводим текст 
   lcd.setCursor(1, 1); //курсор в 0
   lcd.print("Taimer  "); //время до окончания
   lcd.setCursor(8, 1);
   lcd.print(LimitTime/60000+1);
   lcd.print(" min"); 
   LimitTime = LimitTime - (millis() - currentTime); //уменьшаем таймер для вывода на экран
   currentTime = millis(); //получаем новое время 
    delay(800);
  }
   //окончание работы таймера
    lcd.setCursor(20, 1);
    lcd.print("             ");
    lcd.setCursor(20, 1);
    lcd.print("Off:");
    running = false;
    delay (3000);
    digitalWrite(led, LOW); //отключаем диод
    digitalWrite(OUT, HIGH);
    lcd.begin(20, 4);
  
  }
 
  else {//Выбираем режим отсчета
   bailout:
   keypad ();
}
  
} 
//функция опроса клавиш: вверх вниз и выбор
 void keypad () {
 x = analogRead (0); 
  delay(200);
  digitalWrite(led, LOW);
  digitalWrite(OUT, HIGH);
  lcd.setCursor(21,1);
  lcd.print ("taim"); 
   lcd.setCursor(25,1);
  lcd.print ("    "); 
   if (x < 200) { //клавиша вверх
    
    if ((LimitTime + 60001) <= 1500001) //максимум 10 минут
    {
    LimitTime += 60000; // + 1 минута
    lcd.setCursor(26,1);
    lcd.print (LimitTime/60000); 
    }
    else {
    //если пытаемся прибавить больше 25 минут
    lcd.setCursor(28,1);
    lcd.print ("max25");
    delay (1000);
    lcd.setCursor(28,1);
    lcd.print ("               ");
    }
  } 
  else if (x < 400){ 
    //кнопка вниз
    if (LimitTime  > 60000) // минимум 1 минута
    {
    LimitTime -= 60000;
    lcd.setCursor(25,1);
    lcd.print (LimitTime/60000);
    }
    else {
    lcd.setCursor(28,1);
    lcd.print ("min1");
    delay (1000);
    lcd.setCursor(25,1);
    lcd.print ("               ");
    }
    
  } 
  
  else if (x < 800){ //кнопка выбор
    if (LimitTime !=0 ) 
    {running = true;                //Запуск отсчета
    lcd.begin(20, 4);
    lcd.setCursor(4,1);
    lcd.print ("Start    ");
   delay(1000); }
   else {//если не выбрали время
   lcd.setCursor(27,1);
   lcd.print ("00");
  
   }
 
  } 
  lcd.createChar(1, simvol);                  // Создаем символ под номером 1
  lcd.setCursor(15,0);
  lcd.print("  ");
  lcd.setCursor(17, 1);
  lcd.print(13);  
  lcd.print("  ");
  sensors.requestTemperatures();              // Считываем показания температуры 
  lcd.setCursor(8,0);     // Устанавливаем курсор на 1 строку, ячейка 7 
  temp = sensors.getTempCByIndex(0);
  lcd.print(temp);      // Выводим показания температуры
  lcd.setCursor(12,0);                        // Устанавливаем курсор на 1 строку, ячейка 12  
  lcd.print("\1");                            // Выводим символ градуса
  lcd.setCursor(13,0);                        // Устанавливаем курсор на 1 строку, ячейка 13 
  lcd.print("C");                             // Выводим текст 
    lcd.setCursor(18, 0);  // рисуем птичка выхода  
    for (int i = 0; i < qty; i++){ 
      if (digitalRead(OUT)) lcd.write(2);
      else lcd.print(" ");
    }

    for (int i = 0; i < qty; i++) lcd.print(i+1);
    dig_out=analogRead(A2);
  millivolt=(dig_out*0.250);  // converts the reading to millivolt
  lcd.setCursor(26, 0); // выводим с 21го символа на экране в третьей строке.
  lcd.print(millivolt); // prints the input voltage 
    lcd.print(" Bar");           
  lcd.print("      ");
 
 
}
  

 

bagotu
Offline
Зарегистрирован: 15.10.2016