Горелка на отработке для котла (прошу помощи)

Иван Дьяченков
Offline
Зарегистрирован: 18.03.2020

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

/*-----( Import needed libraries )-----*/
#include <Wire.h>  // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h> //Дисплей
#include <EEPROM.h> //ЕЕПРОМ
#include <OneWire.h> //Шина 1-wire
#include <DallasTemperature.h>//Датчики температуры
#include <TimedAction.h>//Таймеры

/*-----( Описание PIN компонентов )-----*/
/* LCD дисплей:
SDA=4
SCL=5
*/
#define BUTTON_PIN 0 //кнопки (аналоговый)
#define FLAME_PIN 2 //датчик пламени
#define OILLEVEL_PIN 3 //датчик уровня бака
#define ONE_WIRE_BUS 10 //датчики температуры
#define RELAY1_PIN 4 // реле первичного воздуха
#define RELAY2_PIN 5 // реле вторичного воздуха
#define RELAY3_PIN 6 // реле розжига
#define RELAY4_PIN 7 // реле нагрева масла
#define RELAY5_PIN 8 // реле нагрева штока
#define RELAY6_PIN 9 // реле наполнения бака
#define TEMPOIL_PIN 1 // аналоговый датчик температуры масла
#define TEMPWATER_PIN 2 // аналоговый датчик температуры воды
#define TEMPSHTOCK_PIN 3 // аналоговый датчик температуры штока

/*-----( Declare Constants )-----*/
//Номера кнопок
const int BUTTON_NONE   = 0; 
const int BUTTON_MENU   = 1;//меню
const int BUTTON_UP     = 2;//+
const int BUTTON_DOWN   = 3;//-
const int BUTTON_START  = 4;//старт
const int BUTTON_STOP   = 5;//стоп
const int BUTTON_DELAY  = 300; //задержка между нажатиями кнопок (в мс)

const int Stage1Time = 10; //задержка после включения реле первичного воздуха (в секундах)
const int Stage2Time = 10; //задержка после включения реле вторичного воздуха и реле розжига (в секундах)

const byte TempSensor = 1; //Тип температурных датчиков: 0 - OneWire, 1 - аналоговые

const float Toil_min = 30; //минимальное значение температуры масла
const float Toil_max = 120; //максимальное значение температуры масла
const float Tsht_min = 30; //минимальное значение температуры масла
const float Tsht_max = 120; //максимальное значение температуры масла
const float Tmin_min = 10; //минимальное значение минимальной температуры воды
const float Tmin_max = 90; //максимальное значение максимальной температуры воды
const float Tmax_min = 35; //минимальное значение максимальной температуры воды
const float Tmax_max = 90; //максимальное значение максимальной температуры воды

const int countMax = 3; //количество попыток розжига

/*-----( Declare Variables )-----*/
int button; //нажатая кнопка
byte offset=0; //пункт меню
byte offsetmax=8; //пунктов в меню
boolean PowerOnFlag=HIGH; //Флаг включения устройства
boolean StartFlag=LOW; //Флаг старта программы
boolean StartingStatus=LOW; //Флаг запуска процедуры старта
boolean HeatingFlag=LOW; //Флаг работы горелки
boolean ErrorFlag=LOW; //Флаг ошибки
boolean ErrorStopFlag=LOW; //Флаг аварийного стопа
boolean Flame = LOW; //флаг наличия пламени
boolean OilLevel = LOW; //датчик уровня бака
boolean OilLevelStatus = LOW; //флаг уровня бака
boolean OilLevelTimer; //таймер в меню
unsigned long OilLevelTime = 0; //время запуска реле бака
int Count = 0; //счетчик попыток розжига
float TempOil, TempWater, TempShtock; //Температуры с датчиков масла, воды, штока
boolean ChangeTempFlag=LOW; //Флаг изменения значения температур через меню
float Toil = EEPROM_float_read(0); //установленная температура масла
float Tsht = EEPROM_float_read(12); //установленная температура масла
float Tmin = EEPROM_float_read(4); //установленная минимальная температура воды
float Tmax = EEPROM_float_read(8); //установленная максимальная температура воды
long OilLevelDelay = EEPROM_float_read(10); //время наполнения бака (в секундах)

//Реле
boolean relayStatus1=HIGH;//реле первичного воздуха
boolean relayStatus2=HIGH;//реле вторичного воздуха
boolean relayStatus3=HIGH;//реле розжига
boolean relayStatus4=HIGH;//реле тэна масла
boolean relayStatus5=HIGH;//реле штока
boolean relayStatus6=HIGH;//реле наполнения бака

/*-----( Declare objects )-----*/
// Set the LCD I2C address
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// Установка OneWire общение с любыми устройствами OneWire
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
// arrays to hold device addresses
DeviceAddress TempOilAdr,TempWaterAdr,TempShtockAdr;


/*-----( идентификаторы таймеров )-----*/
TimedAction flame_timer_id   = TimedAction(500,  Flame_OnOff); //вызов функции датчика пламени
TimedAction monitor_timer_id = TimedAction(1000, monitor); //монитор параметров
TimedAction gt_timer_id = TimedAction(1000, getTemp); //вызов функции считывания температуры
TimedAction control_timer_id = TimedAction(500, control); //Управление горелкой в зависимости от температуры воды
TimedAction oilheat_timer_id = TimedAction(500, oilheat); //Управление подогревом масла
TimedAction oillevel_timer_id = TimedAction(500, OilLevelControl); //Управление уровнем бака
TimedAction shtockheat_timer_id = TimedAction(500, shtockheat); //Управление подогревом штока
TimedAction stopByError_timer_id = TimedAction(500, stopByError); //стоп горелки по ошибке
TimedAction lostFlame_timer_id = TimedAction(500, lostFlame); //потеря пламени
TimedAction stopper_timer_id = TimedAction(500, stopper); //аварийный стоп


/*-----( ----- )-----*/


/*----( SETUP: RUNS ONCE )----*/
void setup()
{
  Serial.begin(9600); 
  monitor_timer_id.disable();
  control_timer_id.disable();
//Настройка пин
  pinMode(FLAME_PIN,INPUT); //Датчик пламени
  pinMode(OILLEVEL_PIN,INPUT); //Датчик уровня бака
//пин реле
  pinMode(RELAY1_PIN,OUTPUT);
  digitalWrite(RELAY1_PIN,HIGH);
  pinMode(RELAY2_PIN,OUTPUT);
  digitalWrite(RELAY2_PIN,HIGH);
  pinMode(RELAY3_PIN,OUTPUT);
  digitalWrite(RELAY3_PIN,HIGH);
  pinMode(RELAY4_PIN,OUTPUT);
  digitalWrite(RELAY4_PIN,HIGH);
  pinMode(RELAY5_PIN,OUTPUT);
  digitalWrite(RELAY5_PIN,HIGH);
  pinMode(RELAY6_PIN,OUTPUT);
  digitalWrite(RELAY6_PIN,HIGH);
//дисплей
  lcd.begin(20,4);         // initialize the lcd for 20 chars 4 lines
//главное меню
  mainMenu();
//шина 1-wire
if (TempSensor==0)
{
  sensors.begin();
  if (!sensors.getAddress(TempOilAdr, 0)) Serial.println("Unable to find address for Device TempOilAdr"); 
  if (!sensors.getAddress(TempWaterAdr, 1)) Serial.println("Unable to find address for Device TempWaterAdr");
  if (!sensors.getAddress(TempShtockAdr, 2)) Serial.println("Unable to find address for Device TempShtockAdr");
 //set the resolution to 12 bit
  sensors.setResolution(TempOilAdr, 12);
  sensors.setResolution(TempWaterAdr, 12);
  sensors.setResolution(TempShtockAdr, 12);
  sensors.requestTemperatures();
}
/*if (TempSensor==1)
{
 analogReference(INTERNAL);
}*/
//Чтение значения таймера
if (EEPROM_float_read(16)==1) {OilLevelTimer=HIGH;} else {OilLevelTimer=LOW;}
//установка начальных значений температуры, если они не считаны из ЕЕПРОМ
  if (isnan(Toil)||Toil<Toil_min)
  {
   Toil=Toil_min;
  } 
  if (isnan(Tsht)||Tsht<Tsht_min)
  {
   Tsht=Tsht_min;
  } 
  if (isnan(Tmin)||Tmin<Tmin_min)
  {
   Tmin=Tmin_min;
  } 
  if (isnan(Tmax)||Tmax<Tmax_min)
  {
   Tmax=Tmax_max;
  } 
  if (isnan(OilLevelDelay)||OilLevelDelay<0)
  {
   OilLevelDelay=0;
  }   
}/*--(end setup )---*/


/*----( LOOP: RUNS CONSTANTLY )----*/
void loop()
{
  timerCheck();
  if (!PowerOnFlag)
  {
   button = getPressedButton();     
  }
  else
  {
   button = BUTTON_START;
   PowerOnFlag=LOW;
  }
  switch (button)
  {
    case BUTTON_MENU: // кнопка меню
       mainMenu();
       break;
    case BUTTON_UP:  //кнопка вверх
       switch (offset)
       {
        case 1: //Старт горелки
           if (!StartFlag) 
           {
            StartingStatus=HIGH;
            offset=offsetmax;
            monitor_timer_id.enable();
            monitor();
            lcd.setCursor(0, 0); 
            lcd.print("     STARTING...    ");
            control_timer_id.enable();
            control_timer_id.check();
           }       
           break; 
        case 2: //Увеличить температуру масла
           ChangeTempFlag=HIGH;
           if (Toil<Toil_max)
           {
            Toil++;
            lcd.setCursor(12, 1); 
            lcd.print(Toil);
           }
           break; 
        case 3: //Увеличить температуру штока
           ChangeTempFlag=HIGH;
           if (Tsht<Tsht_max)
           {
            Tsht++;
            lcd.setCursor(12, 1); 
            lcd.print(Tsht);
           }
           break; 
        case 4: //Увеличить минимальную температу воды
           ChangeTempFlag=HIGH;
           if (Tmin<Tmin_max)
           {
            Tmin++;
            if (Tmin>=Tmax)
            {
              Tmin--;
              lcd.setCursor(0, 0);
              lcd.print("   T min >= T max   ");              
            }
            lcd.setCursor(12, 1); 
            lcd.print(Tmin);
           }
           break; 
        case 5: //Увеличить максимальную температу воды
           ChangeTempFlag=HIGH;
           if (Tmax<Tmax_max)
           {
            Tmax++;
            if (Tmax<=Tmin)
            {
              Tmax--;
              lcd.setCursor(0, 3);
              lcd.print("   T max <= T min   ");              
            }
            lcd.setCursor(12, 1); 
            lcd.print(Tmax);
           }
           break; 
        case 6: //Таймер уровня масла
            ChangeTempFlag=HIGH;
            OilLevelTimer=!OilLevelTimer;
            lcd.setCursor(12, 1); 
            if (OilLevelTimer) {lcd.print("On ");} else {lcd.print("Off");}
           break; 
        case 7: //Увеличить время наполнения бака (в секундах)
           ChangeTempFlag=HIGH;
           if (OilLevelDelay<999)
           {
            OilLevelDelay++;
            lcd.setCursor(12, 1); 
            lcd.print(OilLevelDelay);
           }
           break; 
	   }
       break;
    case BUTTON_DOWN:
       switch (offset)
       {
        case 1: //Cтоп горелки
           if (StartFlag) 
           {
            control_timer_id.disable();
            Stopping();
            StartFlag=LOW;
           }
           lcd.setCursor(0, 0); 
           lcd.print("Programm is stopped!");
           break; 
        case 2: //температура масла
           ChangeTempFlag=HIGH;
           if (Toil>Toil_min)
           {
            Toil--;
            lcd.setCursor(12, 1); 
            lcd.print(Toil);
           }
           break; 
        case 3: //температура штока
           ChangeTempFlag=HIGH;
           if (Tsht>Tsht_min)
           {
            Tsht--;
            lcd.setCursor(12, 1); 
            lcd.print(Tsht);
           }
           break; 
        case 4: //минимальная температура воды
           ChangeTempFlag=HIGH;
           if (Tmin>Tmin_min)
           {
            Tmin--;
            if (Tmin>=Tmax)
            {
              Tmin++;
              lcd.setCursor(0, 3);
              lcd.print("   T min >= T max   ");              
            }
            lcd.setCursor(12, 1); 
            lcd.print(Tmin);
           }
           break; 
        case 5: //максимальная температура воды
           ChangeTempFlag=HIGH;
           if (Tmax>Tmax_min)
           {
            Tmax--;
            if (Tmax<=Tmin)
            {
              Tmax++;
              lcd.setCursor(0, 3);
              lcd.print("   T max <= T min   ");              
            }
            lcd.setCursor(12, 1); 
            lcd.print(Tmax);
           }
           break; 
        case 6: //Таймер уровня масла
            ChangeTempFlag=HIGH;
            OilLevelTimer=!OilLevelTimer;
            lcd.setCursor(12, 1); 
            if (OilLevelTimer) {lcd.print("On ");} else {lcd.print("Off");}
           break; 
		case 7: //Уменьшить время наполнения бака (в секундах)
           ChangeTempFlag=HIGH;
           if (OilLevelDelay>0)
           {
            OilLevelDelay--;
            lcd.setCursor(12, 1); 
            lcd.print(OilLevelDelay);
           }
           break; 
       }
       break;    
    case BUTTON_START://кнопка Старт
       if (!StartFlag) 
       {
            StartingStatus=HIGH;
            offset=offsetmax;
            monitor_timer_id.enable();
            monitor();
            lcd.setCursor(0, 0); 
            lcd.print("     STARTING...    ");
            control_timer_id.enable();
            control_timer_id.check();
       }       
       break;
    case BUTTON_STOP://Кнопка стоп
       if (StartFlag) 
       {
        control_timer_id.disable();
        Stopping();
        StartFlag=LOW;
       }
       lcd.setCursor(0, 0); 
       lcd.print("Programm is stopped!");
       break;
  }
}/* --(end main loop )-- */


/*-----( Моргание экраном при ошибке )-----*/
void blink_ERR()
{
  for(int i = 0; i< 5; i++)
  {
    lcd.backlight();
    delay(250);
    lcd.noBacklight();
    delay(250);
  }
  lcd.backlight(); // finish with backlight on   
}/* --( end blink_ERR )-- */


/*-----( Управление горелкой в зависимости от температуры воды )-----*/
void control()
{
 if (StartFlag||StartingStatus)
 {
  switch (HeatingFlag)
  {
  case HIGH: //горелка горит
   if (TempWater>=Tmax)
   {
     Stopping();
   }
   break;
  case LOW: //горелка потушена
   if (TempWater<Tmin&&TempOil>=Toil&&TempShtock>=Tsht)
   {
     Starting();
   }
   break;
 }
 }
}/* --( end control )-- */


/*-----( запись в ЕЕПРОМ )-----*/
void EEPROM_float_write(int addr, float val)
{ 
  byte *x = (byte *)&val;
  for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}/* --( end EEPROM_float_write )-- */
 

/*-----( чтение из ЕЕПРОМ )-----*/
float EEPROM_float_read(int addr)
{   
  byte x[4];
  for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
  float *y = (float *)&x;
  return y[0];
}/* --( end EEPROM_float_read )-- */


/*-----( считываем значение с датчика пламени )-----*/ 
void Flame_OnOff()
{
  Flame = !digitalRead(FLAME_PIN);    
}/* --( end Flame_OnOff )-- */


/*-----( Считывание нажатых кнопок )-----*/
int getPressedButton()
{
  int buttonValue = analogRead(BUTTON_PIN); // считываем значения с аналогового входа 
Serial.println(buttonValue);
  if (buttonValue < 100) {
    delay(BUTTON_DELAY);
    return BUTTON_MENU;  
  }
  else if (buttonValue < 200) {
    delay(BUTTON_DELAY);
    return BUTTON_UP;
  }
  else if (buttonValue < 400){
    delay(BUTTON_DELAY);
    return BUTTON_DOWN;
  }
  else if (buttonValue < 600){
    delay(BUTTON_DELAY);
    return BUTTON_START;
  }
  else if (buttonValue < 800){
    delay(BUTTON_DELAY);
    return BUTTON_STOP;
  }
  return BUTTON_NONE;
}/* --( end getPressedButton )-- */


/*-----( чтение температуры с датчиков )-----*/
void getTemp() {
if (TempSensor==0)
{
  TempOil = sensors.getTempC(TempOilAdr);
  TempWater = sensors.getTempC(TempWaterAdr);
  TempShtock = sensors.getTempC(TempShtockAdr);
  sensors.requestTemperatures();
}
if (TempSensor==1)
{
  int reading = analogRead(TEMPOIL_PIN);
  reading = analogRead(TEMPOIL_PIN);
  TempOil = reading * 5.0/1024 * 100;// 9.31;
  reading = analogRead(TEMPWATER_PIN);
  TempWater = reading * 5.0/1024 * 100;// 9.31;
  reading = analogRead(TEMPSHTOCK_PIN);
  TempShtock = reading * 5.0/1024 * 100;// 9.31;
}
}/* --( end getTemp )-- */


/*-----( потеря пламени )-----*/
void lostFlame() {
  if (StartFlag&&HeatingFlag&&!Flame)
  {
   Stopping();
   if (TempOil>=Toil&&TempShtock>=Tsht)
   {
    Starting(); 
   }
  }
}/* --( end lostFlame )-- */

/*-----( Главное меню )-----*/
void mainMenu() {
//Если параметры изменены, записываем их в ЕЕПРОМ
  if (ChangeTempFlag)
  {
    switch(offset) {           
       case 2:
         EEPROM_float_write(0,Toil);
         break;
       case 3:
         EEPROM_float_write(12,Tsht);
         break;
       case 4:
         EEPROM_float_write(4,Tmin);
         break;
       case 5:
         EEPROM_float_write(8,Tmax);
         break;
       case 6:
         if (OilLevelTimer) {EEPROM_float_write(16,1);} else {EEPROM_float_write(16,0);}
         break;
       case 7:
         EEPROM_float_write(20,OilLevelDelay);
         break;
    }   
    ChangeTempFlag=LOW;
  } 
  offset++;
  if (offset > offsetmax) {lcd.clear(); offset=1;}
  switch(offset) {           
       case 1:
          monitor_timer_id.disable();
          lcd.setCursor(0, 1); 
          lcd.print("     START/STOP     "); 
          break;
       case 2:
          lcd.setCursor(0, 0); 
          lcd.print("                    ");
          lcd.setCursor(0, 3); 
          lcd.print("                    ");
          lcd.setCursor(0, 1); 
          lcd.print("    T oil =         "); 
          lcd.setCursor(12, 1); 
          lcd.print(Toil);
          break;
       case 3:
          lcd.setCursor(0, 0); 
          lcd.print("                    ");
          lcd.setCursor(0, 3); 
          lcd.print("                    ");
          lcd.setCursor(0, 1); 
          lcd.print("    T sht =         "); 
          lcd.setCursor(12, 1); 
          lcd.print(Tsht);
          break;
       case 4:
          lcd.setCursor(0, 0); 
          lcd.print("                    ");
          lcd.setCursor(0, 3); 
          lcd.print("                    ");
          lcd.setCursor(0, 1); 
          lcd.print("    T min =         "); 
          lcd.setCursor(12, 1); 
          lcd.print(Tmin);
          break;
       case 5:
          lcd.setCursor(0, 0); 
          lcd.print("                    ");
          lcd.setCursor(0, 3); 
          lcd.print("                    ");
          lcd.setCursor(0, 1); 
          lcd.print("    T max =         "); 
          lcd.setCursor(12, 1); 
          lcd.print(Tmax);
          break;
       case 6:
          lcd.setCursor(0, 0); 
          lcd.print("                    ");
          lcd.setCursor(0, 3); 
          lcd.print("                    ");
          lcd.setCursor(0, 1); 
          lcd.print("    Timer =         "); 
          lcd.setCursor(12, 1); 
          if (OilLevelTimer) {lcd.print("On ");} else {lcd.print("Off");} 
          break;
       case 7:
          lcd.setCursor(0, 0); 
          lcd.print("                    ");
          lcd.setCursor(0, 3); 
          lcd.print("                    ");
          lcd.setCursor(0, 1); 
          lcd.print("    Delay =         "); 
          lcd.setCursor(12, 1); 
          lcd.print(OilLevelDelay); 
          break;
	   case 8:
          monitor_timer_id.enable();
          break;
  }        
}/* --( end mainMenu )-- */


/*-----( Монитор )-----*/
void monitor()
{
  flame_timer_id.check();
  gt_timer_id.check();
  lcd.setCursor(0, 1); 
  lcd.print("          To=      C"); 
  lcd.setCursor(0, 2); 
  lcd.print("          Tw=      C"); 
  lcd.setCursor(0, 3); 
  lcd.print("          Ts=      C"); 
  lcd.setCursor(0, 1); 
  lcd.print("Dly:   "); 
  lcd.setCursor(0, 2); 
  lcd.print("Tmr:   "); 
  lcd.setCursor(0, 3); 
  lcd.print("Fl:   "); 
//статус
  if (!StartingStatus)
  {
   lcd.setCursor(0, 0); 
   if (StartFlag) {lcd.print("Programm is started!");} else {lcd.print("Programm is stopped!");}
  }
//Т масла
  lcd.setCursor(13, 1); 
  lcd.print(TempOil); 
//Т воды
  lcd.setCursor(13, 2); 
  lcd.print(TempWater); 
//Т штока
  lcd.setCursor(13, 3); 
  lcd.print(TempShtock); 
//время наполнения бака
  lcd.setCursor(4, 1); 
  lcd.print(OilLevelDelay); 
//Таймер
  lcd.setCursor(4, 2); 
  if (OilLevelTimer) {lcd.print("On ");} else {lcd.print("Off");}
//Пламя
  lcd.setCursor(3, 3); 
  if (Flame) {lcd.print("On ");} else {lcd.print("Off");}
}/* --( end monitor )-- */


/*-----( Задержка с проверкой таймеров каждую секунду )-----*/
void myDelay(int Delay)
{
unsigned long currentTime=millis();
int Time;
do
  {
    Time=int ((millis()-currentTime)/1000);
    oilheat_timer_id.check();
    shtockheat_timer_id.check();
    oillevel_timer_id.check();
    monitor_timer_id.check();
    stopper_timer_id.check();
    if (ErrorStopFlag) {break;}
  }
 while (Time<Delay);
}/* --( end myDelay )-- */


/*-----( Управление подогревом масла )-----*/
void oilheat()
{
 gt_timer_id.check();
 if ((TempOil<Toil)&&(StartFlag||StartingStatus)&&(TempWater<Tmin))
 {
  relayOn(4); 
 }
 else
 {
  relayOff(4);
 }
}/* --( end oilheat )-- */


/*-----( контроль уровня бака )-----*/ 
void OilLevelControl()
{
  OilLevel = !digitalRead(OILLEVEL_PIN);
  if (OilLevel&&!OilLevelStatus&&!relayStatus1)
    { 
     relayOn(6);
     if (OilLevelTimer) {OilLevelTime=millis();}
     OilLevelStatus = HIGH;
    }
  if (!OilLevel)
  {
    relayOff(6);
    OilLevelStatus = LOW;
  }
  if (OilLevelTimer&&int ((millis()-OilLevelTime)/1000)>=OilLevelDelay)
  {
    relayOff(6);
  }
}/* --( end OilLevelControl )-- */

/*-----( включение реле )-----*/
void relayOn(int adr)
{
 switch (adr) {
  case 1:
    relayStatus1 = LOW; //включить реле
    digitalWrite(RELAY1_PIN, relayStatus1);
    break;
  case 2:
    relayStatus2 = LOW; //включить реле
    digitalWrite(RELAY2_PIN, relayStatus2);
    break;
  case 3:
    relayStatus3 = LOW; //включить реле
    digitalWrite(RELAY3_PIN, relayStatus3);
    break;
  case 4:
    relayStatus4 = LOW; //включить реле
    digitalWrite(RELAY4_PIN, relayStatus4);
    break;
  case 5:
    relayStatus5 = LOW; //включить реле
    digitalWrite(RELAY5_PIN, relayStatus5);
    break;
  case 6:
    relayStatus6 = LOW; //включить реле
    digitalWrite(RELAY6_PIN, relayStatus6);
    break;
 } 
}/* --( end relayOn )-- */


/*-----( выключение реле )-----*/
void relayOff(int adr)
{
 switch (adr) {
  case 1:
    relayStatus1 = HIGH; //выключить реле
    digitalWrite(RELAY1_PIN, relayStatus1);
    break;
  case 2:
    relayStatus2 = HIGH; //выключить реле
    digitalWrite(RELAY2_PIN, relayStatus2);
    break;
  case 3:
    relayStatus3 = HIGH; //выключить реле
    digitalWrite(RELAY3_PIN, relayStatus3);
    break;
  case 4:
    relayStatus4 = HIGH; //выключить реле
    digitalWrite(RELAY4_PIN, relayStatus4);
    break;
  case 5:
    relayStatus5 = HIGH; //выключить реле
    digitalWrite(RELAY5_PIN, relayStatus5);
    break;
  case 6:
    relayStatus6 = HIGH; //выключить реле
    digitalWrite(RELAY6_PIN, relayStatus6);
    break;
 } 
}/* --( end relayOff )-- */

/*-----( Управление подогревом штока )-----*/
void shtockheat()
{
 gt_timer_id.check();
 if ((TempShtock<Tsht)&&(StartFlag||StartingStatus)&&(TempWater<Tmin))
 {
  relayOn(5); 
 }
 else
 {
  relayOff(5);
 }
}/* --( end shtockheat )-- */

/*-----( СТАРТ ГОРЕЛКИ )-----*/
void Starting()
{
 StartingStatus=HIGH;
 Count++;
 lcd.setCursor(0, 0); 
 lcd.print("STAGE 1, PLEASE WAIT");
 relayOn(1);//реле первичного воздуха
 myDelay(Stage1Time);
 if (ErrorStopFlag) {ErrorStopFlag=LOW; return;}
 lcd.setCursor(0, 0); 
 lcd.print("STAGE 2, PLEASE WAIT");
 relayOn(2);//реле вторичного воздуха
 relayOn(3);//реле розжига
 myDelay(Stage2Time);
 if (ErrorStopFlag) {ErrorStopFlag=LOW; return;}
 flame_timer_id.check();
 if (Flame)
 {
   relayOff(3);
   lcd.setCursor(0, 0); 
   lcd.print("Programm is started!");
   StartFlag=HIGH;
   HeatingFlag=HIGH;
   ErrorFlag=LOW;
 } 
 else
 {
   Stopping();
   if (Count<countMax) //повторный пуск
   {
     ErrorFlag=HIGH;
     Starting();
   }
 } 
 Count=0;
 StartingStatus=LOW;
}/* --( end Starting )-- */


/*-----( СТОП ГОРЕЛКИ )-----*/
void Stopping()
{
 relayOff(1);
 relayOff(2);
 relayOff(3);
 HeatingFlag=LOW;
}/* --( end Stopping )-- */

/*-----( АВАРИЙНЫЙ СТОП ГОРЕЛКИ )-----*/
void stopper()
{
  if (StartingStatus&&getPressedButton()==BUTTON_STOP)
  {
   StartFlag=LOW;
   ErrorFlag=HIGH;
   ErrorStopFlag=HIGH;
   StartingStatus=LOW;
   stopByError();
  }
}/* --( end stopper )-- */


/*-----( стоп по ошибке )-----*/
void stopByError()
{
 if (ErrorFlag)
 {
  ErrorFlag=LOW;
  StartFlag=LOW;
  control_timer_id.disable();
  Stopping();
  blink_ERR();
 }
}/* --( end stopByError )-- */


/*-----( Проверка таймеров )-----*/
void timerCheck()
{
 stopByError_timer_id.check();
 oilheat_timer_id.check();
 shtockheat_timer_id.check();
 oillevel_timer_id.check();
 flame_timer_id.check();
 gt_timer_id.check();
 monitor_timer_id.check();
 control_timer_id.check();
 lostFlame_timer_id.check();
}/* --( end timerCheck )-- */

/* ( THE END ) */

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Иван Дьяченков пишет:

у человека попросил скетч но в нем выдает ошибку 

А человек что говорит?

Иван Дьяченков
Offline
Зарегистрирован: 18.03.2020

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

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, а компилятор чего говорит? Вы сообщения можете скопипастить?

Иван Дьяченков
Offline
Зарегистрирован: 18.03.2020

ЕвгенийП пишет:

Ну, а компилятор чего говорит? Вы сообщения можете скопипастить?











babington222:72:14: error: 'EEPROM_float_read' was not declared in this scope

 float Toil = EEPROM_float_read(0); //установленная температура масла

              ^~~~~~~~~~~~~~~~~

babington222:73:14: error: 'EEPROM_float_read' was not declared in this scope

 float Tsht = EEPROM_float_read(12); //установленная температура масла

              ^~~~~~~~~~~~~~~~~

babington222:74:14: error: 'EEPROM_float_read' was not declared in this scope

 float Tmin = EEPROM_float_read(4); //установленная минимальная температура воды

              ^~~~~~~~~~~~~~~~~

babington222:75:14: error: 'EEPROM_float_read' was not declared in this scope

 float Tmax = EEPROM_float_read(8); //установленная максимальная температура воды

              ^~~~~~~~~~~~~~~~~

babington222:76:22: error: 'EEPROM_float_read' was not declared in this scope

 long OilLevelDelay = EEPROM_float_read(10); //время наполнения бака (в секундах)

                      ^~~~~~~~~~~~~~~~~

babington222:88:53: error: 'POSITIVE' was not declared in this scope

 LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

                                                     ^~~~~~~~

babington222:98:50: error: 'Flame_OnOff' was not declared in this scope

 TimedAction flame_timer_id   = TimedAction(500,  Flame_OnOff); //вызов функции датчика пламени

                                                  ^~~~~~~~~~~

babington222:99:50: error: 'monitor' was not declared in this scope

 TimedAction monitor_timer_id = TimedAction(1000, monitor); //монитор параметров

                                                  ^~~~~~~

babington222:100:45: error: 'getTemp' was not declared in this scope

 TimedAction gt_timer_id = TimedAction(1000, getTemp); //вызов функции считывания температуры

                                             ^~~~~~~

E:\Downloads\babington222\babington222.ino:100:45: note: suggested alternative: 'getenv'

 TimedAction gt_timer_id = TimedAction(1000, getTemp); //вызов функции считывания температуры

                                             ^~~~~~~

                                             getenv

babington222:101:49: error: 'control' was not declared in this scope

 TimedAction control_timer_id = TimedAction(500, control); //Управление горелкой в зависимости от температуры воды

                                                 ^~~~~~~

E:\Downloads\babington222\babington222.ino:101:49: note: suggested alternative: 'isControl'

 TimedAction control_timer_id = TimedAction(500, control); //Управление горелкой в зависимости от температуры воды

                                                 ^~~~~~~

                                                 isControl

babington222:102:49: error: 'oilheat' was not declared in this scope

 TimedAction oilheat_timer_id = TimedAction(500, oilheat); //Управление подогревом масла

                                                 ^~~~~~~

babington222:103:50: error: 'OilLevelControl' was not declared in this scope

 TimedAction oillevel_timer_id = TimedAction(500, OilLevelControl); //Управление уровнем бака

                                                  ^~~~~~~~~~~~~~~

E:\Downloads\babington222\babington222.ino:103:50: note: suggested alternative: 'OilLevelTimer'

 TimedAction oillevel_timer_id = TimedAction(500, OilLevelControl); //Управление уровнем бака

                                                  ^~~~~~~~~~~~~~~

                                                  OilLevelTimer

babington222:104:52: error: 'shtockheat' was not declared in this scope

 TimedAction shtockheat_timer_id = TimedAction(500, shtockheat); //Управление подогревом штока

                                                    ^~~~~~~~~~

E:\Downloads\babington222\babington222.ino:104:52: note: suggested alternative: 'strcat'

 TimedAction shtockheat_timer_id = TimedAction(500, shtockheat); //Управление подогревом штока

                                                    ^~~~~~~~~~

                                                    strcat

babington222:105:53: error: 'stopByError' was not declared in this scope

 TimedAction stopByError_timer_id = TimedAction(500, stopByError); //стоп горелки по ошибке

                                                     ^~~~~~~~~~~

E:\Downloads\babington222\babington222.ino:105:53: note: suggested alternative: 'strerror'

 TimedAction stopByError_timer_id = TimedAction(500, stopByError); //стоп горелки по ошибке

                                                     ^~~~~~~~~~~

                                                     strerror

babington222:106:51: error: 'lostFlame' was not declared in this scope

 TimedAction lostFlame_timer_id = TimedAction(500, lostFlame); //потеря пламени

                                                   ^~~~~~~~~

E:\Downloads\babington222\babington222.ino:106:51: note: suggested alternative: 'Flame'

 TimedAction lostFlame_timer_id = TimedAction(500, lostFlame); //потеря пламени

                                                   ^~~~~~~~~

                                                   Flame

babington222:107:49: error: 'stopper' was not declared in this scope

 TimedAction stopper_timer_id = TimedAction(500, stopper); //аварийный стоп

                                                 ^~~~~~~

E:\Downloads\babington222\babington222.ino:107:49: note: suggested alternative: 'toupper'

 TimedAction stopper_timer_id = TimedAction(500, stopper); //аварийный стоп

                                                 ^~~~~~~

                                                 toupper

exit status 1
'EEPROM_float_read' was not declared in this scope




ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы используете не ту библиотеку EEPROM, которую имел в виду автор. Ищите правильную. 

Иван Дьяченков
Offline
Зарегистрирован: 18.03.2020

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

вот с его библиотекой тоже самое пишет по ошибкам.


Несколько библиотек найдено для "EEPROM.h"
 Используется: C:\Users\Home\Documents\Arduino\libraries\EEPROM
Не используется: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\11
exit status 1
'EEPROM_float_read' was not declared in this scope

 

nik182
Offline
Зарегистрирован: 04.05.2015
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Иван Дьяченков пишет:

вот с его библиотекой тоже самое пишет по ошибкам.

'EEPROM_float_read' was not declared in this scope

Ну, что Вам сказать? Вам пишут, что нету такого "EEPROM_float_read". Вариантов ровно два: 1) искать библиотеку, в которой есть; или 2) переписывать код, чтобы убрать этот вызов, заменив его на что-то другое, что есть в наличии.

По другому - никак. А чего Вы ожидали?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Да я бы побоялся этот код использовать, учитывая, что там такое встречается:

if (EEPROM_float_read(16)==1)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Дело не а библиотеке , а в компиляторе и коде. Функция присутствует, просто ниже цикла loop

 

Объявить как положено и скомпилируется.

Кстати там таких функций, все.

ТС, перетащи setup и loop в самый низ кода.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kakmyc пишет:

Объявить как положено и скомпилируется.

Ну, и pдорово. А я, грешным делом, код-то и не посмотрел - ввёл человека в заблуждение :-(

Иван Дьяченков
Offline
Зарегистрирован: 18.03.2020

Всем хей вроде перетащил на верх и стал выдавать только по дисплею ошибку,

babington222:110:49: error: 'POSITIVE' was not declared in this scope

 LiquidCrystal lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

                                                 ^~~~~~~~

E:\Downloads\babington222\babington222.ino: In function 'void blink_ERR()':

babington222:431:9: error: 'class LiquidCrystal' has no member named 'backlight'

     lcd.backlight();

         ^~~~~~~~~

babington222:433:9: error: 'class LiquidCrystal' has no member named 'noBacklight'

     lcd.noBacklight();

         ^~~~~~~~~~~

babington222:436:7: error: 'class LiquidCrystal' has no member named 'backlight'

   lcd.backlight(); // finish with backlight on

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А вот это точно не та библиотека.

В той, что я использую (названия совпадают), в конструктор передается всего 3 параметра: адрес, размер по Х, размер по У

Типа того
LiquidCrystal_I2C lcd(0x27,16,2);

Иван Дьяченков
Offline
Зарегистрирован: 18.03.2020

а еще вот так выдает с папкими это понятно пишет какую использует

babington222:110:53: error: 'POSITIVE' was not declared in this scope
 
 LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
 
                                                     ^~~~~~~~
 
Несколько библиотек найдено для "EEPROM.h"
 Используется: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\EEPROM
Не используется: C:\Users\Home\Documents\Arduino\libraries\EEPROM
exit status 1
'POSITIVE' was not declared in this scope
 
Kakmyc
Offline
Зарегистрирован: 15.01.2018

Замени POSITIVE на '1'

Иван Дьяченков
Offline
Зарегистрирован: 18.03.2020

Kakmyc пишет:
Замени POSITIVE на '1'

ругается могу библиотеку закинуть если можете посмотреть?

babington222:110:54: error: no matching function for call to 'LiquidCrystal_I2C::LiquidCrystal_I2C(int, int, int, int, int, int, int, int, int, int)'

 LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, 1);

                                                      ^

In file included from E:\Downloads\babington222\babington222.ino:4:0:

C:\Users\Home\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:57:3: note: candidate: LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t, uint8_t, uint8_t)

   LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows);

   ^~~~~~~~~~~~~~~~~

C:\Users\Home\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:57:3: note:   candidate expects 3 arguments, 10 provided

C:\Users\Home\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:55:7: note: candidate: constexpr LiquidCrystal_I2C::LiquidCrystal_I2C(const LiquidCrystal_I2C&)

 class LiquidCrystal_I2C : public Print {

       ^~~~~~~~~~~~~~~~~

C:\Users\Home\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:55:7: note:   candidate expects 1 argument, 10 provided

C:\Users\Home\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:55:7: note: candidate: constexpr LiquidCrystal_I2C::LiquidCrystal_I2C(LiquidCrystal_I2C&&)

C:\Users\Home\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:55:7: note:   candidate expects 1 argument, 10 provided

exit status 1
no matching function for call to 'LiquidCrystal_I2C::LiquidCrystal_I2C(int, int, int, int, int, int, int, int, int, int)'

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Не буду смотреть.

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

Иван Дьяченков
Offline
Зарегистрирован: 18.03.2020
Народ хелп вот такую ошибку выдает


Хелп народ борюсь вот что получается...
C:\Users\Home\AppData\Local\Temp\ccBbPzGE.ltrans0.ltrans.o: In function `main':

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/main.cpp:46: undefined reference to `loop'

collect2.exe: error: ld returned 1 exit status

exit status 1
Ошибка компиляции для платы Arduino Nano.

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Иван Дьяченков пишет:

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

Я может тоже, как и Вы, хочу хер в 25см (шутю, не хочу). Разберитесь с программой сами или закажите за деньги. Матери Терезы где-то там...

-NMi-
Offline
Зарегистрирован: 20.08.2018

Скоро лето.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mykaida пишет:
Матери Терезы где-то там...
Мать Тереза отошла в лучший мир более 20 лет назад и молится там за нас - грешных, так что теперь Вы за неё! Если не mykaida, то кто?

:-)

Иван Дьяченков
Offline
Зарегистрирован: 18.03.2020

mykaida пишет:

Иван Дьяченков пишет:

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

Я может тоже, как и Вы, хочу хер в 25см (шутю, не хочу). Разберитесь с программой сами или закажите за деньги. Матери Терезы где-то там...

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

Иван Дьяченков
Offline
Зарегистрирован: 18.03.2020

Со скечем  разобрался, все свободны осталось дописать меню)))

Иван Дьяченков
Offline
Зарегистрирован: 18.03.2020

Kakmyc пишет:

Дело не а библиотеке , а в компиляторе и коде. Функция присутствует, просто ниже цикла loop

 

Объявить как положено и скомпилируется.

Кстати там таких функций, все.

ТС, перетащи setup и loop в самый низ кода.

спасибо большое наставили на путь, с Ардуино просто первый раз с таким большим скечем, и небыли прописаны loop ...  все сменил вставил и все прошло.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Иван Дьяченков пишет:

Со скечем  разобрался, все свободны осталось дописать меню)))

Дык

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Иван Дьяченков пишет:

Со скечем  разобрался, все свободны осталось дописать меню)))

По статистике те, кто работают моском, живут малость больше, чем те, кто не работает им. Дык я  Вам жисть удлинняю

Иван Дьяченков
Offline
Зарегистрирован: 18.03.2020

mykaida пишет:

Иван Дьяченков пишет:

Со скечем  разобрался, все свободны осталось дописать меню)))

По статистике те, кто работают моском, живут малость больше, чем те, кто не работает им. Дык я  Вам жисть удлинняю

прям как вопрос заданный политикам : Почему корова какает лепешками, а коза горошками?)))