Скеч для инкубатора не работает - зависает
- Войдите на сайт для отправки комментариев
Сб, 27/02/2021 - 01:39
Здравствуйте форумчане.
Я в ардуино не силён - так собрал пару мигалок и светильников.
А теперь делаю инкубатор . Думал что скачаю готовый скеч и всё.
Схему собрал залил скеч и в итоге получил проблему .Теперь к сути проблемы.
Включаю ардуино - всё загружается -выводит показания температуры и влажности и через несколько секунд светодиод на 13 пине начинает мигать раз 5 в секунду на дисплее информация не меняется на кнопки не реагирует. Как выложить скеч не знаю ,поэтому просто скопировал из IDE
********************************************
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
DHT не живут долго в инкубаторах, хорошо работают si7021 sht31 aht10,
http://u-m.biz/phpBB3/viewtopic.php?t=288
#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(); }}Спасибо ,что отозвались . Я щас на работе , но дело в том ,что если закоментировать строку
069wdt_enable (WDTO_4S);то всё начинает работать ,получается ,что не работает #include <avr/wdt.h> //сторожевой пёс
я слышал ,что это не работает на arduino nano v.3 со старым загрузчиком
А насчёт датчика DHT - заказывал htc , но китайцы прислали USB кабель .Собираю из того ,что есть в наличии.
В коде нигде не встречается сброс сторожевого таймера
Естественно он сработает и сбросит контроллер.
В коде нигде не встречается сброс сторожевого таймера
Естественно он сработает и сбросит контроллер.
а надо ему быть перед выходом из loop, а не в блоке "if (m > 20)"
Всем спасибо за отзывчивость, но проект откладываю, так как собираю другой.
Люди добрые, объясните чайнику что не так с EEPROm, при проверке выкидывает сообщение:
#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("-");Люди добрые, объясните чайнику что не так с EEPROm, при проверке выкидывает сообщение:
Не так вот это: 'EEPROM_read' was not declared in this scope.
И встречный вопрос: тебе нравится считать строки без номеров?
anatoli_nik на какой версии Ардуино ИДЕ скеч работает, библиотеки откуда качал и какая плата ( у меня УНО).
Со скетчем и библиотеками от Умки (сайт - перепелки), блин нервы сдают(еепром в ошибке вылазит), может с твоим получится.
Автоматику на ректификационную колонну собирал на Ардуино Меге все легко прошло, ребята нормальный материал выкладывают без козявок, работает отлично, заслуживает доверия (прошу извинения за офтоп).