Скетч Управления Бойлером

7-12-2014, 21:50 От: admin Посмотрели: 641
Всем доброго времени суток. Подскажите опытные люди в ардуино кодинге.Набросал скетч (сырец) управления бойлером.Есть небольшая проблема.При истечении времени выполнения цикла 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

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

Обсудить на форуме


На момент добавления Скетч Управления Бойлером все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба

Добавление комментария

Ваше имя:*
E-Mail:*
Текст:
Вопрос:
Решите уравнения x+2x=789
Ответ:*
Введите два слова, показанных на изображении:



Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Календарь новостей
«    Апрель 2024    »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
2930