термостат и таймер
- Войдите на сайт для отправки комментариев
Сб, 10/03/2018 - 22:00
Сделал скетч набора температуры по таймеру.Никак не могу добиться задать температуру и затем включить таймер
#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(" ");
}
тут все родили уже:
http://arduino.ru/forum/proekty/sutochnyi-termostat-dlya-gazovogo-kotla