Всем доброго времени суток. Подскажите опытные люди в ардуино кодинге.Набросал скетч (сырец) управления бойлером.Есть небольшая проблема.При истечении времени выполнения цикла error промаргивает OUT1.Подскажите где можно поправить чтобы убрать этот косяк?
#include <EEPROM.h>
#include <OneWire.h>
#include <LiquidCrystal.h>
#define OUT1 9 // выход 9 для реле
//int OUT1 = 9;
//#define OUT2 8 // выходы для реле
//#define OUT3 2 // nasos
//int water = 0; //pin A1 уровень //
//int val = 0;
//int analogPin = 1;
//int analogPin = 2;
//int vas = 0;
int var =0;
int vap = 1;
byte tempOUT1;//nasosOUT2
byte gister = 0;
LiquidCrystal lcd(12, 11, 4, 5, 6, 7);
OneWire ds(3); // 11 вход датчика 18b20
byte gradus[8] = {//lcd.write(1);
0b00110,
0b01001,
0b01001,
0b00110,
0b00000,
0b00000,
0b00000,
0b00000
};
byte delta_t[8] = {//lcd.write(2);
0b00000,
0b00000,
0b00000,
0b00100,
0b01010,
0b10001,
0b11111,
0b00000,
};
void error1(){ // останавливает работу программы и сигнализирует ошибку НЕТ ВОДЫ
digitalWrite(OUT1,LOW);
int wan = 0;
wan = 0;
while(wan < 20){
// выполнить что-то, повторив 20 раз
wan++;
// крутим цикл
digitalWrite(10, !digitalRead(10));
delay(500);
}
}
void erorr2(){ // останавливает работу программы и сигнализирует ошибку НЕТ ДАТЧИКА
digitalWrite(OUT1, LOW); // выключаем реле
digitalWrite (2,LOW);
//digitalWrite(OUT2, LOW);
//digitalWrite(OUT3,LOW);
int wad = 0;
wad = 0;
while(wad < 20){ // крутим цикл
wad++;
digitalWrite(13, !digitalRead(13));
delay(500);
}
}
////
byte key(){ //// для кнопок ЛСДшилда
int val = analogRead(0);
if (val < 50) return 5;
else if (val < 341) return 3;
else if (val < 511) return 4;
else if (val < 614) return 2;
else if (val < 683) return 1;
else return 0;
}
void setMenu(){ // установка температуры
byte pos;
digitalWrite(OUT1, LOW); // выключаем реле
//digitalWrite(OUT2, LOW);
//digitalWrite(OUT3, LOW);
lcd.clear();
lcd.setCursor(0, 0); // что нужно отрисовать один раз
lcd.print("OUT1: ");
lcd.setCursor(0, 1);
lcd.print("DELt: ");
lcd.blink();
while(1){ // крутим бесконечный цикл
byte KEY = key(); // читаем состояние кнопок
lcd.setCursor(6, 0); // выводим на экран
lcd.print(tempOUT1);
lcd.write(1);
lcd.print("C ");
lcd.setCursor(6, 1);
lcd.print(gister);
lcd.write(2);///////////////////////////////////////?
lcd.print("C ");
////// обработка кнопок
if (pos == 0){ // если в первой позиции
lcd.setCursor(5, 0); // устанавливаем курсор
if (KEY == 2) { // если нажата кнопка
tempOUT1--; // изменяем значение
EEPROM.write(1, tempOUT1); // сохраняем в еепром
}
else if (KEY == 5){
tempOUT1++;
EEPROM.write(1, tempOUT1);
}
}
if (pos == 1){
lcd.setCursor(5, 1);
if (KEY == 2) {
gister--;
EEPROM.write(2, gister);
}
else if (KEY == 5){
gister++;
EEPROM.write(2, gister);
}
}
if (KEY == 3) pos--; // крутим позицию
else if (KEY == 4) pos++;
if (pos > 1) pos = 0;
delay(200);
}
}
//int val = 0; // переменная для хранения считываемого значения
//void urov (){
// int analogPin = 1
//int val = getUroven()
float getTemp(){ // возвращает температуру с датчика
byte data[12]; // и останавливает программу на секунду
byte addr[8];
if (!ds.search(addr)) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("No sensor.");
erorr2();
}
ds.reset_search();
if (OneWire::crc8(addr, 7) != addr[7]) {
lcd.clear();
lcd.print("Sensor CRC err");
erorr2();
}
ds.reset();
ds.select(addr);
ds.write(0x44);
delay(1000);
ds.reset();
ds.select(addr);
ds.write(0xBE);
for (int i = 0; i < 9; i++) data[i] = ds.read();
int raw = (data[1] << 8) | data[0]; // Переводим в температуру
if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];
return raw / 16.0;
}
void setup() {
lcd.createChar(1, gradus);
lcd.createChar(2, delta_t);
lcd.begin(16, 2);
lcd.clear();
pinMode(10, OUTPUT);
pinMode(13, OUTPUT);
pinMode(OUT1, OUTPUT);
pinMode(2,OUTPUT);//boolean доработать
tempOUT1 = EEPROM.read(1); // читаем настройки
gister = EEPROM.read(2); // из еепром
}
void loop() {
var = analogRead(1); // считываем значение
if(var==0)
{
digitalWrite(OUT1,LOW);
digitalWrite (2,HIGH);
//delay(1000);
lcd.clear();
lcd.setCursor(0, 1); //вторая строка
//lcd.println(var);
lcd.print("No water");
error1();
//delay(100);
}
if(var == 1023){
digitalWrite (2,LOW);
}
vap = analogRead(2);
if(vap < 190)
{
digitalWrite(OUT1,LOW);
digitalWrite (2,HIGH);
lcd.clear();
lcd.setCursor(0, 8);
lcd.println(vap);
lcd.print(" Pmin");
error1();
//delay(100);
}
if(vap == 1023)
{
digitalWrite (2,LOW);
}
if (key() == 1) setMenu(); // если нажата селект, уходим в меню
//else if (key() == 4) analogWrite(10, 20); // если вниз, глушим
//else if (key() == 3) digitalWrite(10, HIGH);
float temperature = getTemp(); // читаем температуру
if ((var < tempOUT1)&&(vap < tempOUT1)){
digitalWrite(OUT1, LOW);}
if (temperature < (tempOUT1 - gister)){
digitalWrite(OUT1,HIGH);}
if(temperature > (tempOUT1 - gister)){
digitalWrite(OUT1,LOW);}
lcd.clear();
lcd.setCursor(0, 0); /// вывод инфы на экран
lcd.print("1:");
lcd.print(tempOUT1);
lcd.write(1);
if (digitalRead(OUT1)) lcd.print(" ON "); // показываем состояние выхода
else lcd.print(" OFF");
lcd.setCursor(0, 1);
//lcd.print("2");
lcd.write(2);
lcd.print(gister);
lcd.write(1);
lcd.print(vap);
// if (digitalRead(OUT2)) lcd.print(" ON ");
// else lcd.print(" OFF");
lcd.setCursor(9, 0); // показываем температуру с датчика
//lcd.print("|");
lcd.print(temperature, 1);
lcd.write(1);
//lcd.print("C");
//lcd.setCursor(9, 1);
// lcd.print("|");
}
Раздел: Arduino и Raspberry Pi
#include <EEPROM.h>
#include <OneWire.h>
#include <LiquidCrystal.h>
#define OUT1 9 // выход 9 для реле
//int OUT1 = 9;
//#define OUT2 8 // выходы для реле
//#define OUT3 2 // nasos
//int water = 0; //pin A1 уровень //
//int val = 0;
//int analogPin = 1;
//int analogPin = 2;
//int vas = 0;
int var =0;
int vap = 1;
byte tempOUT1;//nasosOUT2
byte gister = 0;
LiquidCrystal lcd(12, 11, 4, 5, 6, 7);
OneWire ds(3); // 11 вход датчика 18b20
byte gradus[8] = {//lcd.write(1);
0b00110,
0b01001,
0b01001,
0b00110,
0b00000,
0b00000,
0b00000,
0b00000
};
byte delta_t[8] = {//lcd.write(2);
0b00000,
0b00000,
0b00000,
0b00100,
0b01010,
0b10001,
0b11111,
0b00000,
};
void error1(){ // останавливает работу программы и сигнализирует ошибку НЕТ ВОДЫ
digitalWrite(OUT1,LOW);
int wan = 0;
wan = 0;
while(wan < 20){
// выполнить что-то, повторив 20 раз
wan++;
// крутим цикл
digitalWrite(10, !digitalRead(10));
delay(500);
}
}
void erorr2(){ // останавливает работу программы и сигнализирует ошибку НЕТ ДАТЧИКА
digitalWrite(OUT1, LOW); // выключаем реле
digitalWrite (2,LOW);
//digitalWrite(OUT2, LOW);
//digitalWrite(OUT3,LOW);
int wad = 0;
wad = 0;
while(wad < 20){ // крутим цикл
wad++;
digitalWrite(13, !digitalRead(13));
delay(500);
}
}
////
byte key(){ //// для кнопок ЛСДшилда
int val = analogRead(0);
if (val < 50) return 5;
else if (val < 341) return 3;
else if (val < 511) return 4;
else if (val < 614) return 2;
else if (val < 683) return 1;
else return 0;
}
void setMenu(){ // установка температуры
byte pos;
digitalWrite(OUT1, LOW); // выключаем реле
//digitalWrite(OUT2, LOW);
//digitalWrite(OUT3, LOW);
lcd.clear();
lcd.setCursor(0, 0); // что нужно отрисовать один раз
lcd.print("OUT1: ");
lcd.setCursor(0, 1);
lcd.print("DELt: ");
lcd.blink();
while(1){ // крутим бесконечный цикл
byte KEY = key(); // читаем состояние кнопок
lcd.setCursor(6, 0); // выводим на экран
lcd.print(tempOUT1);
lcd.write(1);
lcd.print("C ");
lcd.setCursor(6, 1);
lcd.print(gister);
lcd.write(2);///////////////////////////////////////?
lcd.print("C ");
////// обработка кнопок
if (pos == 0){ // если в первой позиции
lcd.setCursor(5, 0); // устанавливаем курсор
if (KEY == 2) { // если нажата кнопка
tempOUT1--; // изменяем значение
EEPROM.write(1, tempOUT1); // сохраняем в еепром
}
else if (KEY == 5){
tempOUT1++;
EEPROM.write(1, tempOUT1);
}
}
if (pos == 1){
lcd.setCursor(5, 1);
if (KEY == 2) {
gister--;
EEPROM.write(2, gister);
}
else if (KEY == 5){
gister++;
EEPROM.write(2, gister);
}
}
if (KEY == 3) pos--; // крутим позицию
else if (KEY == 4) pos++;
if (pos > 1) pos = 0;
delay(200);
}
}
//int val = 0; // переменная для хранения считываемого значения
//void urov (){
// int analogPin = 1
//int val = getUroven()
float getTemp(){ // возвращает температуру с датчика
byte data[12]; // и останавливает программу на секунду
byte addr[8];
if (!ds.search(addr)) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("No sensor.");
erorr2();
}
ds.reset_search();
if (OneWire::crc8(addr, 7) != addr[7]) {
lcd.clear();
lcd.print("Sensor CRC err");
erorr2();
}
ds.reset();
ds.select(addr);
ds.write(0x44);
delay(1000);
ds.reset();
ds.select(addr);
ds.write(0xBE);
for (int i = 0; i < 9; i++) data[i] = ds.read();
int raw = (data[1] << 8) | data[0]; // Переводим в температуру
if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];
return raw / 16.0;
}
void setup() {
lcd.createChar(1, gradus);
lcd.createChar(2, delta_t);
lcd.begin(16, 2);
lcd.clear();
pinMode(10, OUTPUT);
pinMode(13, OUTPUT);
pinMode(OUT1, OUTPUT);
pinMode(2,OUTPUT);//boolean доработать
tempOUT1 = EEPROM.read(1); // читаем настройки
gister = EEPROM.read(2); // из еепром
}
void loop() {
var = analogRead(1); // считываем значение
if(var==0)
{
digitalWrite(OUT1,LOW);
digitalWrite (2,HIGH);
//delay(1000);
lcd.clear();
lcd.setCursor(0, 1); //вторая строка
//lcd.println(var);
lcd.print("No water");
error1();
//delay(100);
}
if(var == 1023){
digitalWrite (2,LOW);
}
vap = analogRead(2);
if(vap < 190)
{
digitalWrite(OUT1,LOW);
digitalWrite (2,HIGH);
lcd.clear();
lcd.setCursor(0, 8);
lcd.println(vap);
lcd.print(" Pmin");
error1();
//delay(100);
}
if(vap == 1023)
{
digitalWrite (2,LOW);
}
if (key() == 1) setMenu(); // если нажата селект, уходим в меню
//else if (key() == 4) analogWrite(10, 20); // если вниз, глушим
//else if (key() == 3) digitalWrite(10, HIGH);
float temperature = getTemp(); // читаем температуру
if ((var < tempOUT1)&&(vap < tempOUT1)){
digitalWrite(OUT1, LOW);}
if (temperature < (tempOUT1 - gister)){
digitalWrite(OUT1,HIGH);}
if(temperature > (tempOUT1 - gister)){
digitalWrite(OUT1,LOW);}
lcd.clear();
lcd.setCursor(0, 0); /// вывод инфы на экран
lcd.print("1:");
lcd.print(tempOUT1);
lcd.write(1);
if (digitalRead(OUT1)) lcd.print(" ON "); // показываем состояние выхода
else lcd.print(" OFF");
lcd.setCursor(0, 1);
//lcd.print("2");
lcd.write(2);
lcd.print(gister);
lcd.write(1);
lcd.print(vap);
// if (digitalRead(OUT2)) lcd.print(" ON ");
// else lcd.print(" OFF");
lcd.setCursor(9, 0); // показываем температуру с датчика
//lcd.print("|");
lcd.print(temperature, 1);
lcd.write(1);
//lcd.print("C");
//lcd.setCursor(9, 1);
// lcd.print("|");
}
Раздел: Arduino и Raspberry Pi