Скеч для инкубатора не работает - зависает

alabuhi
Offline
Зарегистрирован: 27.02.2021

Здравствуйте форумчане.

Я в ардуино не силён - так собрал пару мигалок и светильников.

А теперь делаю инкубатор . Думал что скачаю готовый скеч и всё.

Схему собрал залил скеч и в итоге получил проблему .Теперь к сути проблемы.

Включаю ардуино - всё загружается -выводит показания температуры и влажности и через несколько секунд светодиод на 13 пине начинает мигать раз 5 в секунду на дисплее информация не меняется на кнопки не реагирует. Как выложить скеч не знаю ,поэтому просто скопировал из IDE

********************************************
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017
Alfizik
Alfizik аватар
Offline
Зарегистрирован: 16.12.2020

DHT не живут долго в инкубаторах, хорошо работают si7021 sht31 aht10,

http://u-m.biz/phpBB3/viewtopic.php?t=288

 

anatoli_nik
Offline
Зарегистрирован: 17.01.2019
#include <avr/wdt.h> //сторожевой пёс
#include <OneWire.h>
#include <DallasTemperature.h>
#include "DHT.h"
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>  // Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
 
#define DHTPIN 12 // номер пина, к которому подсоединен датчик 
DHT dht(DHTPIN, DHT11);//DHT dht(DHTPIN, DHT11);// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 11 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
 
#define turnPin 6 //поворот
#define ventilator 4 //вентилятор проветривания
#define ventilatorH 5 //венилятор для поддержания влажности
#define buttonPlus 15
#define buttonMenu 16
#define buttonMinus 17
 
#define TimeError 60    //время задержки ошибки 20сек * TimeError = 20 1 минута-3 еденицы 
 
 
boolean r_povorota, r_povorot, r_ventilator, r_nasosa, proverka, turn, PowerLigt, dhT;
long prevmicros;
byte Power_promeg, ventilar, H, dlit_raboti_nasosa = 5, vrema_raboti_ventilatora;  //0-255 vrema_roboti_ventilatora
 
byte gradus[8] = {B01000, B10100, B01000, B00111, B01000, B01000, B00111, B00000,};
 
boolean counter, r_ventilatora, step, powerTurn, exitMenu, left, right, turnStartPosition, ventilation, error, ErrorPower;
byte hi, sec, mi, sTimer, mTimer, hTimer, dTimer = 1, day = 1; 
byte backLight, menu;
byte avtomatik, timeTurn, setPower, timeTurnExperement, periodTurn, accountTurn, Power;
byte n, rn, rv, m, i, errorTime, errorL, errorH, errorHour = 6; 
unsigned int t, Temperature, b;          //0-65535
float e, h, tt, kof, tSetprintDisplay;
//signed char kof; //-128 - 127
 
 
 
void setup() {
  
  wdt_disable();
  sensors.begin();
  dht.begin();
  lcd.begin(16,2);
  lcd.clear();
  
  lcd.createChar(1, gradus);  //Регистрируем собственные символы с кодами 1 и ...
 
  DDRB |= (1 << 5); //моргание светодиода на пине 13 каждую секунду
  pinMode(ventilatorH, OUTPUT); pinMode(ventilator, OUTPUT); digitalWrite(ventilator, LOW);  pinMode(turnPin, OUTPUT); digitalWrite(turnPin, LOW);
 
  pinMode(buttonPlus, INPUT_PULLUP); pinMode(buttonMinus, INPUT_PULLUP); pinMode(buttonMenu, INPUT_PULLUP);
  
  hTimer = EEPROM.read(20); dTimer = EEPROM.read(3); 
  powerTurn = EEPROM.read(11); 
  kof = EEPROM.read(5); 
  dlit_raboti_nasosa = EEPROM.read(6); vrema_raboti_ventilatora = EEPROM.read(7);
  avtomatik = EEPROM.read(8); t = EEPROM.read(9) + 370; H = EEPROM.read(10); 
  setPower = EEPROM.read(13); PowerLigt = EEPROM.read(15); dhT = EEPROM.read(16); //dhT - флаг для выбора датчика температуры dht|18B20
  
  if (avtomatik) parametri();    
  setTimer();
  lcd.backlight(); //noBacklight();
  backLight = 240;
  wdt_enable (WDTO_4S);
 
   h = dht.readHumidity(); 
    if (dhT) {tt = dht.readTemperature();  Temperature = (10 * tt) + kof;}                                 //температура с DHT22  
    else {sensors.requestTemperatures(); tt = sensors.getTempCByIndex(0); Temperature = (10 * tt) + kof;}  //температура с 18B20
    lcd.setCursor(2, 0); lcd.print("inkubator_4"); lcd.setCursor(5, 1); lcd.print("v_0.8"); delay(2000);
  displayPrint();      
}
 
 
 
 
 
 
void setTimer(){
  cli();
  TCCR1A = 0b00000000; //none   toggle  clear  set - инверсия установить
  TCCR1B = (1 << WGM12)|(1 << CS12); // 10b00011001;
  TIMSK1 = (1 << OCIE1A);
  OCR1A = 62500; //разрешение ШИМ сигнала (ограничение для счета регистра TCNT1), возможно до 65 535
  sei();
}
 
ISR (TIMER1_COMPA_vect) //вектор прерывания по СТС таймера/счетчика 2 для работы собственного времени контроллера
{
  PORTB = PORTB ^ (1 << 5); sTimer++; if (sTimer > 59) {mTimer++; sTimer = 0; if (mTimer > 59) {hTimer++; mTimer = 0;} if (hTimer > 23) {dTimer++; hTimer = 0;}}
}
 
 
 
void parametri()                //изменение параметров  в зависимости от дня инкубации, сюда можно внести свои данные режима инкубации
{
  switch(avtomatik){
   case 1:   //для кур
      if (day < 2) {t = 380; powerTurn = true; r_ventilator = false;  H = 60;} 
         else {t = 378; powerTurn = true; r_ventilator = false; H = 60;}
      if (day > 14) {t = 377; H = 60; r_ventilator = true; EEPROM.write(7, 18); vrema_raboti_ventilatora = 18; powerTurn = true; }
      if (day > 17) {t = 370; H = 80; powerTurn = false; r_ventilator = true;}
    break;
   case 2:   //для перепелов
      if (day < 2) {t = 380; powerTurn = true;  r_ventilator = false; H = 60;} 
         else {t = 378; powerTurn = true; r_ventilator = false; H = 60;}
      if (day > 7) {t = 377; H = 60; r_ventilator = true; EEPROM.write(7, 10); vrema_raboti_ventilatora = 10; powerTurn = true;}
      if (day > 13) {t = 377; H = 60; powerTurn = true; r_ventilator = true;}
      if (day > 14) {t = 370; H = 80; powerTurn = false; r_ventilator = true;}
    break;
    case 3: //утка
         if (day < 2) {t = 385; powerTurn = true;  r_ventilator = false; H = 70;} 
         else {t = 380; powerTurn = true; r_ventilator = false; H = 70;}
      if (day > 7) {t = 378; H = 60; r_ventilator = false; EEPROM.write(7, 15); vrema_raboti_ventilatora = 15; powerTurn = true;}
      if (day > 14) {t = 378; H = 60; powerTurn = true; r_ventilator = true;}
      if (day > 25) {t = 375; H = 90; powerTurn = false; r_ventilator = false;}
    break;
    case 4: //гуси
      if (day < 6) {t = 380; powerTurn = true;  r_ventilator = false; H = 70;} 
         else {t = 378; powerTurn = true; r_ventilator = false; H = 60;}
      if (day > 13) {t = 378; H = 70; r_ventilator = true; EEPROM.write(7, 25); vrema_raboti_ventilatora = 25; powerTurn = true;}
      if (day > 26) {t = 375; H = 85; powerTurn = true; r_ventilator = true;}
      if (day > 28) {t = 375; H = 85; powerTurn = false; r_ventilator = false;}
    break;
  }
}
 
void nagrev()                              //работа нагревателя, 200 - минимальная мощность, 0 - максимальная
{
  // if (!r_ventilatora) {
    if (Temperature > t + 5) {
//      digitalWrite(ventilator, HIGH);
      rn += 4;
      Power = EEPROM.read(13);
    }
 //   if (Temperature < t + 3) digitalWrite(ventilator, LOW);
//  }
 
  if (Temperature < t)      n = 1;
  if (Temperature < t - 10) n = 2;
  if (Temperature < t - 40) n = 5;
  if (Temperature > t)      n = 4;
  if (Power == 255)         n = 3;
 
  switch (n) {
    case 4:
      if (rn > 12) {
        rn = 0;
        if (Temperature >= b) Power -= 1;
        else Power += 1;
        if (Temperature > t + 3) Power -= 6;
      }
      else rn++;
      break;
 
    case 1:
      if (rv > 14) {
        rv = 0;
        if (Temperature <= b) Power += 1;
        else Power -= 1;
      }
      else rv++;
      break;
 
    case 2:
      if (Temperature > b)
      {
        b = Temperature - b;
        switch (b)
        { case 1: Power -= 4; break;
          case 2: Power -= 5; break;
          case 3: Power -= 8; break;
          case 4: Power -= 8; break;
          case 5: Power -= 20; break;
          default: Power -= 22;
        }
      }
      else {
        Power += 4;
        if (Temperature < (t - 20)) Power += 30;
      }
      break;
 
    case 5:
      if (Temperature <= (b + 30)) Power += 20; if (Power > 200) Power = 200;
      break;
 
    case 3:
      if (Temperature < t) Power = 30;
      break;
  }
 
  b = Temperature;                    //промежуточное значение температуры
  if (Temperature > t + 7) Power -= 20; 
  Power = constrain(Power, 8, 200); //ограничение мощности 50%
  if ((Power == 8) && (Temperature > t + 3)) Power = 0; //выключение нагревателя 
  if (!menu) {lcd.setCursor(0, 1); lcd.print("Pow"); i = map(Power, 0, 200, 1, 99); if (i < 10) lcd.print(" "); lcd.print(i); lcd.print("%");}//мощность на нагрев
  analogWrite(3, Power);
}
 
 
 
void displayPrint(){
  lcd.setCursor(0, 0); if (hTimer < 10) lcd.print("0"); lcd.print(hTimer); lcd.setCursor(3, 0); if (mTimer < 10) lcd.print("0"); lcd.print(mTimer);
  lcd.setCursor(6, 0); lcd.print("Day"); lcd.print(dTimer);
  lcd.setCursor(12, 0); lcd.print("H"); lcd.print(h, 0); lcd.print("%");
  
  lcd.setCursor(0, 1); lcd.print("Pw"); i = map(Power, 0, 200, 1, 99); if (i < 10) lcd.print(" "); lcd.print(i); lcd.print("%");//мощность на нагрев
  lcd.setCursor(6, 1); lcd.print(avtomatik);
  lcd.setCursor(7, 1); if (powerTurn) lcd.print("|"); else lcd.print("0"); lcd.print(accountTurn);
  lcd.setCursor(8, 1);  if (ventilation) lcd.print("*"); else lcd.print("-");
  lcd.setCursor(9, 1);  if (digitalRead(ventilatorH)) lcd.print("#"); else lcd.print("-");
  lcd.setCursor(11, 1); lcd.print(Temperature * 0.1, 1); lcd.print("\1");
  
}
 
 
void errorMelody() { //8 пин на буззер
  //noTone(8);  tone(6, 440, 200);  delay(200);
  //noTone(6);  tone(7, 494, 500);  delay(500);
  tone(8, 523, 300);  
}
  
 
void loop() {
 
if (menu){
switch (menu){
   case 1:
      lcd.setCursor(0, 1); lcd.print("Temp calibration");
      lcd.setCursor(2, 0); lcd.print(kof/10); lcd.print("\1"); //lcd.print(" daL "); lcd.print(e, 1);
      if (!digitalRead(buttonPlus)) {backLight = 20; delay(200); kof++; EEPROM.write(5, kof); if (kof > 15) {kof = -15; lcd.clear();} exitMenu = true;}
      if (!digitalRead(buttonMinus)) {backLight = 20; delay(200); kof--; EEPROM.write(5, kof); if (kof < -15) {kof = 15; lcd.clear();} exitMenu = true;}
      break;
 
   case 2: lcd.setCursor(2, 0); lcd.print("reset time?");
      if (!digitalRead(buttonMinus) || !digitalRead(buttonPlus)) {backLight = 20; delay(200); hTimer = 0; dTimer = 1; day = 1; mTimer = 0;
      EEPROM.write(3, day); EEPROM.write(2, hTimer); menu = 0; lcd.clear(); displayPrint();}
      break;
 
   case 3: lcd.setCursor(1, 0); lcd.print("setPowerDefaul");
      if (!digitalRead(buttonPlus)) {backLight = 20; delay(200); setPower--; EEPROM.write(13, setPower); lcd.clear(); exitMenu = true;}
      if (!digitalRead(buttonMinus)) {backLight = 20; delay(200); setPower++; EEPROM.write(13, setPower); lcd.clear(); exitMenu = true;}
      lcd.setCursor(5, 1);  i = map(setPower, 60, 200, 99, 1); if (i < 10) lcd.print(" "); lcd.print(i); lcd.print("%");  
      break;    
 
   case 4: lcd.setCursor(3, 0); lcd.print("avtom setap");
      if (!digitalRead(buttonPlus)) {backLight = 20; delay(200); avtomatik++; lcd.clear(); EEPROM.write(8, avtomatik); if (avtomatik > 4) avtomatik = 4; exitMenu = true;}
      if (!digitalRead(buttonMinus)) {backLight = 20; delay(200); avtomatik--; lcd.clear(); EEPROM.write(8, avtomatik); if (avtomatik > 4) avtomatik = 0; exitMenu = true;}  
      lcd.setCursor(2, 1); 
      if (!avtomatik) lcd.print("not avtom");
      if (avtomatik == 1) lcd.print("kuri");
      if (avtomatik == 2) lcd.print("perepelki");
      if (avtomatik == 3) lcd.print("ytki");
      if (avtomatik == 4) lcd.print("gusi");
      if (avtomatik) parametri();
      break;
      
    case 5: lcd.setCursor(3, 0); lcd.print("test turn");   
      if (!digitalRead(buttonPlus)) {PORTD = PORTD ^ (1 << 6); turn = !turn; lcd.setCursor(4, 1); if (turn) lcd.print("left"); else lcd.print("right"); delay(500); exitMenu = true;}
      if (!digitalRead(buttonMinus)) {PORTD = PORTD ^ (1 << 6); turn = !turn; lcd.setCursor(4, 1); if (turn) lcd.print("left"); else lcd.print("right"); delay(500); exitMenu = true;}
     break;  
 
    case 6: lcd.setCursor(3, 0); lcd.print("test Vent"); 
      if (!digitalRead(buttonPlus)) {PORTD = PORTD ^ (1 << 4); ventilation = !ventilation; lcd.setCursor(5, 1); if (ventilation) lcd.print("on "); else lcd.print("off"); delay(500); exitMenu = true;}
      if (!digitalRead(buttonMinus)) {PORTD = PORTD ^ (1 << 4); ventilation = !ventilation; lcd.setCursor(5, 1); if (ventilation) lcd.print("on "); else lcd.print("off"); delay(500); exitMenu = true;}
     break;   
 
  //  case 6: lcd.setCursor(3, 0); lcd.print("Set Power"); lcd.setCursor(2, 1); i = map(Power, 60, 200, 99, 1); if (i < 10) lcd.print(" "); lcd.print(i); lcd.print("%");
  //    if (!digitalRead(buttonPlus)) {delay(200); Power--; if (Power < 60) Power = 60; exitMenu = true;}
  //    if (!digitalRead(buttonMinus)) {delay(200); Power++; if (Power > 200) Power = 200; exitMenu = true;}
  //   break;
 
    case 7: lcd.setCursor(3, 0); lcd.print("Set Ligt"); lcd.setCursor(5, 1); if (PowerLigt) lcd.print("on "); else lcd.print("off");
      if (!digitalRead(buttonPlus)) {delay(200); PowerLigt = !PowerLigt; exitMenu = true; EEPROM.write(15, PowerLigt);}
      if (!digitalRead(buttonMinus)) {delay(200); PowerLigt = !PowerLigt; exitMenu = true; EEPROM.write(15, PowerLigt);}
    break;
 
     case 8: lcd.setCursor(3, 0); lcd.print("DHT "); lcd.setCursor(10, 0); lcd.print(" 18B20");
             lcd.setCursor(8, 0); if (dhT) lcd.print("<"); else lcd.print(">");
      if (!digitalRead(buttonPlus)) {delay(300); dhT = !dhT; exitMenu = true; EEPROM.write(16, dhT);}
      if (!digitalRead(buttonMinus)) {delay(300); dhT = !dhT; exitMenu = true; EEPROM.write(16, dhT);}
    break;
 
    case 9: if (avtomatik) {menu = 0; displayPrint(); backLight = 240;}
            else {lcd.setCursor(1, 0); lcd.print("Set t = "); lcd.setCursor(10, 0); tSetprintDisplay = 370+t; lcd.print(tSetprintDisplay/10); lcd.print("\1");  
                if (!digitalRead(buttonPlus)) {delay(200); t++; if (t > 15) t = 15; EEPROM.write(9, t); exitMenu = true;}
                if (!digitalRead(buttonMinus)) {delay(200); t--; if (t > 8) t = 0; EEPROM.write(9, t); exitMenu = true;}}
     break;
 
    case 10: lcd.setCursor(1, 0); lcd.print("Set H = "); 
                if (!digitalRead(buttonPlus)) {delay(200); H += 5; if (H > 90) H = 90; EEPROM.write(10, H); exitMenu = true;} 
                if (!digitalRead(buttonMinus)) {delay(200); H -= 5; if (H < 30) H = 30; EEPROM.write(10, H); exitMenu = true;}
     break;
 
    case 11: lcd.setCursor(3, 0); lcd.print("povorot  "); if (powerTurn) lcd.print("on "); else lcd.print("off");
                if (!digitalRead(buttonPlus)) {delay(200); powerTurn = !powerTurn; EEPROM.write(11, powerTurn); exitMenu = true;}
                if (!digitalRead(buttonMinus)) {delay(200); powerTurn = !powerTurn; EEPROM.write(11, powerTurn); exitMenu = true;}
       break;
 
    case 15: lcd.setCursor(3, 0); lcd.print("error"); lcd.setCursor(10, 0); lcd.print(Temperature * 0.1, 1); lcd.print("\1");
                lcd.setCursor(1, 1); lcd.print("off"); lcd.setCursor(12, 1); lcd.print("off");
                if (!digitalRead(buttonPlus)) {delay(200); noTone(8);}
                if (!digitalRead(buttonMinus)) {delay(200); noTone(8);}
       break;
            
         
  }
}
 
 
 if (mi != mTimer){
        h = dht.readHumidity();     //влажность с DHT22
  if (!menu) {lcd.setCursor(3, 0); if (mTimer < 10) lcd.print("0"); lcd.print(mTimer);
  lcd.setCursor(12, 0); lcd.print("H"); lcd.print(h, 0); lcd.print("%"); }      //влажность
  mi = mTimer;
 
  if ((Temperature > t - 5) && (Temperature < t + 5) && (h < H - 3)) {digitalWrite(ventilatorH, HIGH);  displayPrint();}  //вентилятор для поддержания влажности
  else {digitalWrite(ventilatorH, LOW); displayPrint();}  
  
  if (ventilation) {displayPrint(); vrema_raboti_ventilatora--; PORTD |= (1 << 4); if (!vrema_raboti_ventilatora) {PORTD &= ~(1 << 4); ventilation = false; vrema_raboti_ventilatora = EEPROM.read(7);  displayPrint();  //включение/выключение работа вентилятора проветривания
        errorHour = 2; ErrorPower = false;}}       // включение отсчета времени для срабатывания ошибки
 }
 
 
 if (sec != sTimer){
      counter = !counter; if (!menu) {if (counter) {lcd.setCursor(2, 0); lcd.print(":");} else {lcd.setCursor(2, 0); lcd.print(" ");}}
  
      if (backLight) {backLight--; lcd.backlight(); if (!backLight) {if (!PowerLigt) lcd.noBacklight(); menu = 0; lcd.clear(); displayPrint();}}
     
      if (!ventilation) m++; //если не работает проветривание, то считаем 20 сек для работы нагревателя
      else {if (dhT) {tt = dht.readTemperature();  Temperature = (10 * tt) + kof;}                                 //температура с DHT22  
            else {sensors.requestTemperatures(); tt = sensors.getTempCByIndex(0); Temperature = (10 * tt) + kof;}  //температура с 18B20
            if (!menu) {lcd.setCursor(11, 1); lcd.print(Temperature * 0.1, 1);}} 
   
      sec = sTimer;}
 
 
 
  if (hi != hTimer){ if (!menu) {lcd.setCursor(0, 0); if (hTimer < 10) lcd.print("0"); lcd.print(hTimer);} EEPROM.write(20, hTimer); //сохранение текущего часа
      
      sensors.requestTemperatures(); // температура с 18b20
      e = sensors.getTempCByIndex(0);
      if ((r_ventilator || (!avtomatik && vrema_raboti_ventilatora)) && (hTimer == 6 || hTimer == 18)) {ventilation = true; Power = 2; analogWrite(3, Power);}//включение вентиляции
      if (powerTurn) {timeTurn++; if (timeTurn > 1) {timeTurn = 0; PORTD = PORTD ^ (1 << 6); accountTurn++;}} //инверсия пина для поворота
      if (errorHour) errorHour--; //истечение 6 часов для включения режима авария
      hi = hTimer;}
 
 
  if (day != dTimer) {if (!menu) {lcd.setCursor(6, 0); lcd.print("Day"); lcd.print(dTimer);} 
     EEPROM.write(3, day);  day = dTimer;   parametri();
     }
 
  if (m > 20) {
    
    if (dhT) {tt = dht.readTemperature();  Temperature = (10 * tt) + kof;}                                 //температура с DHT22  
    else {sensors.requestTemperatures(); tt = sensors.getTempCByIndex(0); Temperature = (10 * tt) + kof;}  //температура с 18B20
 
   
    if ((!errorHour) && (Temperature < t - 20)) {error = true; menu = 15; errorMelody();}          //включение мелодии ошибки
    if (Temperature == t) ErrorPower = true;
    if (ErrorPower)  {if (Temperature < errorL || Temperature > errorH) errorTime++;                                  //определение ошибки
                      else {errorTime--; if (errorTime > TimeError) {errorTime = 0; noTone(8);}}
    if (errorTime > TimeError) {errorMelody(); error = true; menu = 15; errorTime = 20;}
 
 
    if (!menu) {lcd.setCursor(11, 1); lcd.print(Temperature * 0.1, 1);}   
    if (Temperature != t) nagrev(); m = 0;} //работа нагревателя, выполнется 3 разa в 1 минуту(ы), чтобы не мешать инерционности процессу
  
   
  if (!digitalRead(buttonMenu)) {delay(250); menu++; lcd.clear(); if (exitMenu) {menu = 0; displayPrint(); exitMenu = false;} 
      if (menu > 11) {noTone(8); menu = 0; displayPrint(); backLight = 240;}}
       
  wdt_reset();
 
 
 
  }}

 

alabuhi
Offline
Зарегистрирован: 27.02.2021

Спасибо ,что отозвались . Я щас на работе , но дело в том ,что если закоментировать строку 

069

  wdt_enable (WDTO_4S);

то всё начинает работать ,получается ,что не работает   #include <avr/wdt.h> //сторожевой пёс

я слышал ,что это не работает на arduino nano v.3 со старым загрузчиком 

А насчёт датчика DHT  -  заказывал htc  , но китайцы прислали USB кабель .Собираю из того ,что есть в наличии.

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

В коде нигде не встречается сброс сторожевого таймера

asm ( "WDR" );

Естественно он сработает и сбросит контроллер.

SLKH
Offline
Зарегистрирован: 17.08.2015

anatoli_nik пишет:

В коде нигде не встречается сброс сторожевого таймера

asm ( "WDR" );

Естественно он сработает и сбросит контроллер.

сброс в строке 378.

а надо ему быть перед выходом из loop, а не в блоке  "if (m > 20)"

alabuhi
Offline
Зарегистрирован: 27.02.2021

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

 

 

Вавена
Offline
Зарегистрирован: 07.05.2019

Люди добрые, объясните чайнику что не так с EEPROm, при проверке выкидывает сообщение:

Arduino: 1.6.4 (Windows 7), Плата"Arduino Uno"
Изменена опция сборки, пересобираем все
 
inkubator.ino: In function 'void loop()':
inkubator:190: error: 'EEPROM_read' was not declared in this scope
inkubator.ino: In function 'void startInk()':
inkubator:274: error: 'EEPROM_read' was not declared in this scope
inkubator:286: error: 'EEPROM_write' was not declared in this scope
inkubator:290: error: 'EEPROM_write' was not declared in this scope
inkubator.ino: In function 'void bird_setup()':
inkubator:321: error: 'EEPROM_read' was not declared in this scope
  
и так далее по скетчу. Скетч взят от Умки на перепелах, (привожу начало его):
 
#include <PID_v1.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include "RTClib.h"
#include <DallasTemperature.h>
#include <OneWire.h>
//#include <Sensirion.h>
#include <avr/wdt.h>
#include <Encoder.h>
#include "Adafruit_HTU21DF.h"

int del = 80;                     // переменная ожидания между выборами меню
unsigned int interval = 300;      // интервал сколько будет длиться цикл while, после чего перейдёт к следующему меню.(кол-во итераций)
//#define EXT_HEATING                  // ИСПОЛЬЗУЕМ ДОП.НАГРЕВАТЕЛЬ ВМЕСТО УВЛАЖНИТЕЛЯ. Если нужен увлажнитель, просто закомментируйте эту строку.
#define heater_pin 13                  // нагреватель
#define humidifer_pin 12               // увлажнитель
#define fan_pin 11                     // вентилятор
#define alarm_pin 14                   // пин аварии
#define beeper_pin 9                   //пищалка по аварии
#define dataPin 5                      //SHT10
#define clockPin 6                     //SHT10 
#define turn_pin 10                    // управление поворотом
#define extend_heater_pin 8          // дополнительный нагреватель
//#define button_minus_pin 2            //пин кнопки "минус"
//#define button_plus_pin 3             //пин кнопки "плюс"
#define button_enter_pin 4            //пин кнопки "enter"
#define DS18B20_Pin 7                 //пин термометра
#define setSampleTime 300            //время цикла ПИД
#define voltmeter_pin 1               //вход А1 через делитель (22к/10к) подключен к питанию модуля. Измеряет до 16В.
#define T_correction -0.1             // коррекция температуры SHT10
#define h_histeresis 1.0              // гистерезис влажности
#define door_pin 16                 // пин открытой двери (А2)

//boolean button_minus;                // статус нажатия кнопок
//boolean button_plus;
//boolean button_enter;
boolean turnFlag = 0;              // флаг поворота для случайного периода
boolean heater_off;               // флаг запрета нагревателя
boolean needFan;                 // флаг аварийной вентиляции
float humidity;                    // Влажность
float temp1Ink;                    // Температура DS18B20
float temp2Ink;                    // Температура SHT10
float needTemp = 37.6;             // нужная для текущего дня температура инкубации (по умолчанию)
float needHum = 60.5;              // ---- влажность
//float dewpoint;                    // Точка росы

unsigned char button_minus;           // статус нажатия кнопок
unsigned char button_plus;
unsigned char button_enter;
long oldPosition  = 500;            // позиция энкодера
unsigned int rawData;
unsigned long currentTime;            // задаем переменные для тайминга поворота
unsigned long loopTime;
unsigned long serialTime;             //это поможет нам узнать, когда следует обращаться к обработчику
unsigned long now;
unsigned long trhMillis = 0;           // период опроса датчиков
//byte measActive = false;
//byte measType = TEMP;
const unsigned long TRHSTEP   = 300UL;  // Период опроса датчиков
unsigned int currentDay;                // текущий день в юникс-формате
String birdPrint = "CHICK";

LiquidCrystal_I2C lcd(0x3F, 20, 4);  // инициализация библиотеки дисплея
//SHT1x sht1x(dataPin, clockPin);
OneWire oneWire(DS18B20_Pin);
DallasTemperature sensors(&oneWire);
//Sensirion sht = Sensirion(dataPin, clockPin);
Adafruit_HTU21DF htu = Adafruit_HTU21DF();

double Setpoint, Input, Output;            //объявляем переменные для ПИД
PID myPID(&Input, &Output, &Setpoint, 50, 0.5, 0.1, DIRECT); //Инициализируем ПИД-библиотеку и коэффициенты
int WindowSize = 1000;                  // ширина окна терморегулятора 1 секунда.
unsigned long windowStartTime;
unsigned long alarmDelay;
RTC_DS3231 RTC;
Encoder myEnc(3, 2);

//SimpleTimer timer;

  /*  EEPROM(1) -     temp1Ink (float)
    EEPROM(13) -  set_humidity (float)
    EEPROM(5) -     +-alarmTemp  (float)
    EEPROM(9) -     alarm_fan    (bool)
    EEPROM(11) -    turnPeriod   (int)
    EEPROM(17) -     bird         (int)
 */


////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
  Serial.begin(9600);

  RTC.begin();         // Старт часов
  lcd.begin();          // Старт дисплея
  Wire.begin();        // старт I2C
  lcd.backlight();     // Включаем подсветку дисплея
  windowStartTime = millis();
  //  byte stat;
  //  byte error = 0;
  //  float tempInk;
  //  float set_humidity;
  //  float alarmTemp;

  delay(15);
  wdt_enable (WDTO_8S);                 //взводим сторожевой таймер на 8 секунд.
  myPID.SetOutputLimits(0, WindowSize); //задаем лимиты ширины ПИД-импульса от 0 до 1 секунды.
  myPID.SetMode(AUTOMATIC);             //включаем ПИД-регулирование
  myPID.SetSampleTime(setSampleTime);

  pinMode(extend_heater_pin, OUTPUT);      //пин дополнительного нагревателя. Переводим в 1 чтобы не включать реле.
  digitalWrite(extend_heater_pin, HIGH);
  pinMode(heater_pin, OUTPUT);
  pinMode(turn_pin, OUTPUT);              // устанавливаем выводы
  digitalWrite(turn_pin, HIGH);
  pinMode(humidifer_pin, OUTPUT);
  pinMode(fan_pin, OUTPUT);
  digitalWrite(fan_pin, HIGH);
  pinMode(alarm_pin, OUTPUT);
  digitalWrite(alarm_pin, HIGH);
  //pinMode(button_minus_pin, INPUT_PULLUP); //подтягиваем входы кнопок к плюсу встроенными резисторами
  //pinMode(button_plus_pin, INPUT_PULLUP);
  //pinMode(button_enter_pin, INPUT_PULLUP);
  //pinMode(door_pin, INPUT_PULLUP);
  alarmDelay = millis();
  htu.begin();
  sensors.begin();
  sensors.setResolution(12);            // установить разрешение (точность)
  sensors.setWaitForConversion(false);  // отключить ожидание
  birdSelect();                         // читаем птицу
  windowStartTime = millis();
  //RTC.adjust(DateTime(__DATE__, __TIME__));   //раскоментируйте для установки системмных даты и времени
}

//////////////////////////////////////////////////////////////////////////
void loop() {
  // Input = getTemp();
  unsigned int startDayUnixtime;          // хранящийся в памяти день старта программы в юникс-формате
  //float needTemp = 37.6;                  // нужная для текущего дня температура инкубации (по умолчанию)
  //float needHum = 60.5;                   // ---- влажность
  int ventTime = 2;                       // длительность проветривания
  boolean needTurn = false;               // нужен ли поворот яиц?
  unsigned int currentTime_day;           //текущий день в юникс-формате (сколько дней минуло с 1 января 1970)
  int bird;                         // выбор птицы
  int r_array[6][4][5] = {
    {{2, 382, 650, 0, 1}, {12, 377, 540, 5, 1}, {18, 374, 480, 20, 1}, {20, 371, 855, 10, 0}},  // chick
    {{2, 382, 600, 0, 1}, {12, 376, 600, 3, 1}, {15, 374, 480, 10, 1}, {18, 370, 855, 10, 0}},  // quail
    {{7, 381, 700, 0, 1}, {13, 376, 600, 3, 1}, {25, 373, 560, 20, 1}, {30, 370, 855, 10, 0}},  // duck
    {{15, 380, 610, 5, 1}, {26, 375, 520, 20, 1}, {27, 374, 690, 10, 0}, {35, 370, 800, 0, 0}}, // muskus
    {{2, 382, 600, 0, 1}, {11, 378, 600, 3, 1}, {15, 374, 480, 10, 1}, {18, 370, 855, 10, 0}},  // perepel
    {{6, 379, 560, 0, 1}, {12, 376, 530, 3, 1}, {26, 373, 520, 20, 1}, {30, 370, 855, 10, 0}},  // turkey
  };

  DateTime now = RTC.now();
  currentTime_day = (now.unixtime() / 86400L);
  //timer.run();
  button_read();
  if (button_enter) {
    delay(del);
    lcd.clear();
    menu();
    lcd.clear();
  }
  if (button_minus) {
    delay(del);
    lcd.clear();
    alarmDelay = millis();    // задержка аварии по нажатии кнопки Минус
  }
  if (button_plus) {
    delay(del);
    lcd.clear();
    digitalWrite(turn_pin, !digitalRead(turn_pin));       // включаем/выключаем реле поворота по кнопке Плюс
  }
  if (button_plus && button_plus) {
    delay(del);
    lcd.clear();
    // bottomView = !bottomView;       // переключаем режим показа нижней строки.
  }
  //send-receive with processing if it's time
  if (millis() > serialTime * 5)
  {
    SerialReceive();
    SerialSend();
    serialTime += 500;
  }
  EEPROM_read(1, startDayUnixtime);
  currentDay = (currentTime_day - startDayUnixtime);

  EEPROM_read(17, bird);
  for (int d = 3; d >= 0; d--) {
    if (currentDay < r_array[bird][d][0]) {
      needTemp = float(r_array[bird][d][1] / 10.0);
      needHum = float(r_array[bird][d][2] / 10.0);
      ventTime = r_array[bird][d][3];
      needTurn = r_array[bird][d][4];
    }
  }
  getSensors();
  thermostat(needTemp, needHum);    // влажность передаем только для вывода на дисплей )))
  humidifer(needHum);
  turn(needTurn);
  fan(ventTime);
  alarm(needTemp);
  ext_heater(needTemp);
  //outpuPower();
  wdt_reset();
}


/// чтиаем энкодер ////////////////////////////////////////////////////////////////////////
void button_read() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    if (newPosition >= oldPosition + 2) {
      button_plus = 1;
    }
    if (newPosition <= oldPosition - 2) {
      button_minus = 1;
    }
    oldPosition = newPosition;
    //Serial.println(newPosition);
  }
  else {
    button_plus = 0;
    button_minus = 0;
  }

  if (digitalRead(button_enter_pin) == LOW )  {
    delay(del / 2);
    button_enter = 1;
  }
  if (digitalRead(button_enter_pin) == HIGH )  {
    delay(del / 2);
    button_enter = 0;
  }
  if (button_minus || button_plus || button_enter) beeper(50);
  wdt_reset();
}


////меню////////////////////////////////////////////////////////////////
void menu() {
  bird_setup();
  turn_setup();
  alarm_setup();
  vent_setup();
  startInk();
  //data_time_setup();
}


// записываем в память день начала инкубации в юникс-формате////////////
void startInk() {
  unsigned int currentTime_day;
  unsigned int memoryDay;
  DateTime now = RTC.now();
  currentTime_day = (now.unixtime() / 86400L);

  delay(del);
  button_read();
  lcd.setCursor(4, 0);
  lcd.print("START INK");
  delay(1000);
  lcd.clear();
  int x = 0;
  while (1) {
    x++;
    if (x > interval) break;
    button_read();
    EEPROM_read(1, memoryDay);
    //Serial.print(currentTime_day);
    //Serial.print("-");

 

 
SLKH
Offline
Зарегистрирован: 17.08.2015

Вавена пишет:

Люди добрые, объясните чайнику что не так с EEPROm, при проверке выкидывает сообщение:

Arduino: 1.6.4 (Windows 7), Плата"Arduino Uno"
Изменена опция сборки, пересобираем все
 
inkubator.ino: In function 'void loop()':
inkubator:190: error: 'EEPROM_read' was not declared in this scope
 

Не так вот это: 'EEPROM_read' was not declared in this scope. 

И встречный вопрос: тебе нравится считать строки без номеров?

Вавена
Offline
Зарегистрирован: 07.05.2019

anatoli_nik  на какой версии Ардуино ИДЕ скеч работает, библиотеки откуда качал и какая плата ( у меня УНО).

Со скетчем и библиотеками от Умки (сайт - перепелки), блин нервы сдают(еепром в ошибке вылазит),  может с твоим получится.

Автоматику на ректификационную колонну собирал на Ардуино Меге все легко прошло, ребята нормальный материал выкладывают без козявок, работает отлично, заслуживает доверия  (прошу извинения за офтоп).