Страница 4 из 5

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 27 фев 2018, 14:08
Aslanvu
Купил модуль часы реального времени ds1307
К каким пинам подключить?

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 28 фев 2018, 07:22
Nemo
К тем же что и дисплей.
Плата -> часы -> дисплей.
Получается часы в разрыв между платой и дисплеем.

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 28 фев 2018, 13:40
kulibin
Роман добрый день. Есть один вопрос, как в скетче SmartInkubatorV2_4F_auto_all_bird_btn поменять датчик влажности SHT10 на SHT21, так как в наличие SHT21 есть у меня а в магазинах на данный момент нет , а из Китая долго ждать, сезон инкубации уже скоро и хотелось бы испытать контроллер в работе.

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 01 мар 2018, 08:06
Umka
Это Вы на forumhouse писали? Как будет время, сделаю.

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 01 мар 2018, 10:20
Umka

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 01 мар 2018, 11:40
Kirill
Роман,здравствуйте.У меня вопрос. :roll: Такая ситуация,что инкубатор у меня будет полностью 12 в.Обогрев галогенка на кулере.Так как будет работать с ПИД ,то куда лучше подключить куллер?В сети говорят что при подключении по шим куллеры издают пишущий неприятный звук.Да и поток воздуха заметно снизится при маленьком проценте мощности..Как посоветуете?

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 01 мар 2018, 12:17
Umka
Кулер - по английски "охладитель". Вы сейчас спрашиваете про тот вентилятор, который будет воздух по инкубатору гонять? Подключайте его к блоку питания, зачем его регулировать? Регулировать надо температуру нагревателем!

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 01 мар 2018, 12:22
Kirill
Umka писал(а):Кулер - по английски "охладитель". Вы сейчас спрашиваете про тот вентилятор, который будет воздух по инкубатору гонять? Подключайте его к блоку питания, зачем его регулировать? Регулировать надо температуру нагревателем!
Вы правильно поняли.Который воздух гонять через лампочку.Регулировать его точно не надо.но тогда он постоянно будет крутится..а это надо?

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 01 мар 2018, 12:34
Kirill
И ещё вопросик..Для заливки "сторожевого таймера" и заливки прошивки используется один и тоже программатор?Не совсем из вашего видео понял.И ссылочку не дадите на него,а то там их много разновидностей,а я ещё не спец. 8-) Может не заморачиваться и взять нано,там ведь есть программатор.

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 01 мар 2018, 17:16
Umka
Конечно надо, вентилятор должен работать постоянно пока идет инкубация. Там же и дыхание и воздухообмен и охлаждение (подогрев) яиц набегающим воздухом. Да и не будет равномерной температуры без вентилятора. Теплый воздух вверх поднимется, а холодный внизу будет и углекислый газ тоже.
С программаторами каша у вас в голове. Я это все уже рассказывал. Программатор прошивает МК. Программатор прошивает загрузчик. Родной загрузчик у Ардуино (кроме Уно) не работает со сторожевым таймером. Загрузчик позволяет загружать программы в Ардуино через конвертор. У всех Ардуино конвертор встроен, кроме Про Мини, которыми мы и пользуемся чаще всего. Им нужен внешний конвертер. Он нужен только для загрузки скетчей. Ардуино это по сути и есть контроллер Атмега и загрузчик. Ардуино можно сделать программатором. Программатором тоже можно прошивать скетчи, но тогда затрется загрузчик. Программа будет работать, но заливать скетчи через конвертер уже не получится. Сторожевой таймер при такой прошивке будет работать, потому что загрузчика нету. То есть это уже не Ардуино, а просто Атмел на плате. Вернуть загрузчик можно прошив его программатором. Для правильной работы сторожевого таймера шьется альтернативный загрузчик optiboot. Он компактнее стандартного. Он родной для плат Уно. Ну вот так примерно. Подробнее разжевывать некогда. Есть ролики на канале про все это.

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 01 мар 2018, 20:28
Kirill
Спасибо,Роман.Яснее стало.Пересмотрю видео ещё раз уже с другой точки зрения.

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 04 мар 2018, 10:08
Vitalik1111
Здравствуйте Роман!!! Понравилась Ваша автоматика, решил смастерить инк. Ещё год назад собрал электронику часы, блок релле, мосфеты для нагревателя и увлажнителя ну и саму ардуину,регулировка кнопками. Всунул в холодильник, пробовал с прошивками играться. Понравился скеч с 12В регулировка шим по 10-й ноге SimpleSmartInkubatorPWM12V. В авто SmartInkubatorV2_4F_auto_all_bird_btn пид и энкодер (у меня кнопки). Решил доделать инкуб. Извиняюсь я в програмировании мало чего понимаю, с пинами, часами, датчиками разобрался а вот чтобы была шим регулировка? Что вместо чего поменять? Ещё раз извиняюсь может пропустил что, может скеч готовый есть? Спасибо за ответ и понимание!!

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 04 мар 2018, 13:50
Umka
Приветствую. Ну нету у меня всех вариантов! Функцию thermostat() возьмите со скетча где ШИМ и все. Там правки минимальные. Есть редактор удобный Notepad++ и модуль Compare для сравнения двух файлов.

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 04 мар 2018, 16:39
grifon26
Я переделал с вашего скетча версии Ф, на свой лад, я просто несилен в програмировании(может убрал нужное чтото, проверить пока немогу заказал недостающие елементи), посмотрите скетч. У меня только однин датчик температури DS18B20 і LCD 16*4, и переворот на двух реле с концевиками. Большое спасибо.
[spoiler]#include <PID_v1.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM2.h>
#include "RTClib.h"
#include <DallasTemperature.h>
#include <OneWire.h>
#include <Sensirion.h>
#include <avr/wdt.h>

int del = 80; // переменная ожидания между выборами меню
unsigned int interval = 300; // интервал сколько будет длиться цикл while, после чего перейдёт к следующему меню.(кол-во итераций)
#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 button_minus_pin 2 //пин кнопки "минус"
#define button_plus_pin 3 //пин кнопки "плюс"
#define button_enter_pin 4 //пин кнопки "enter"
#define DS18B20_Pin 7 //пин термометра
#define setSampleTime 300 //время цикла ПИД
#define h_histeresis 1.0 // гистерезис влажности

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

unsigned int rawData;
unsigned long currentTime; // задаем переменные для тайминга поворота
unsigned long loopTime;
unsigned long serialTime; //this will help us know when to talk with processing
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, 16, 4); // инициализация библиотеки дисплея
OneWire oneWire(DS18B20_Pin);
DallasTemperature sensors(&oneWire);
Sensirion sht = Sensirion(dataPin, clockPin);

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_DS1307 RTC;

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

RTC.begin(); // Старт часов
lcd.init(); // Старт дисплея
Wire.begin(); // старт I2C
lcd.backlight(); // Включаем подсветку дисплея
windowStartTime = millis();
delay(15);
wdt_enable (WDTO_8S); //взводим сторожевой таймер на 8 секунд.
myPID.SetOutputLimits(0, WindowSize); //задаем лимиты ширины ПИД-импульса от 0 до 1 секунды.
myPID.SetMode(AUTOMATIC); //включаем ПИД-регулирование
myPID.SetSampleTime(setSampleTime);

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);
alarmDelay = millis();
sensors.begin();
sensors.setResolution(12); // установить разрешение (точность)
sensors.setWaitForConversion(false); // отключить ожидание
birdSelect(); // читаем птицу
}

void loop() {
unsigned int startDayUnixtime; // хранящийся в памяти день старта программы в юникс-формате
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
{{3, 379, 630, 0, 0}, {13, 378, 540, 3, 1}, {26, 375, 560, 20, 1}, {30, 372, 590, 10, 0}}, // goose
{{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);
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();
}
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);
wdt_reset();
}

void button_read() {//функция проверки нажатия кнопки
button_minus = digitalRead(button_minus_pin); //запоминаем значение кнопки
button_plus = digitalRead(button_plus_pin); //запоминаем значение кнопки
button_enter = digitalRead(button_enter_pin); //запоминаем значение кнопки
if (!button_minus || !button_plus || !button_enter) beeper(50);
wdt_reset();
}

void menu() {
bird_setup();
turn_setup();
alarm_setup();
vent_setup();
startInk();
}

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);
if (!button_enter) {
delay(del);
lcd.clear(); //очищаем экран
break;
}
if (!button_minus) {
EEPROM_write(1, currentTime_day);
lcd.clear();
}
if (!button_plus) {
EEPROM_write(1, memoryDay - 1);
lcd.clear();
}
EEPROM_read(1, memoryDay);
lcd.setCursor(5, 0);
lcd.print("DAY = ");
lcd.print(currentTime_day - memoryDay);
lcd.setCursor(2, 1);
lcd.print("ZERO START +1");
delay(del);
}
}

void bird_setup() {
int birdType;
lcd.clear();
delay(del);
button_read();
lcd.setCursor(4, 0);
lcd.print("BIRD SETUP");
delay(1000);
lcd.clear();
int x = 0;
while (1) {
x++;
if (x > interval) {
break;
}
button_read();
EEPROM_read(17, birdType);
if (!button_enter) {
delay(del);
lcd.clear(); //очищаем экран
break;
}
if (!button_plus) {
x = 0;
if (birdType >= 5) //проверяем, если выше или равно 5,
EEPROM_write(17, 0); //пишем в память 0
else EEPROM_write(17, birdType + 1);
lcd.clear();
}
if (!button_minus) {
x = 0;
if (birdType <= 0) //проверяем, если ниже или равно 0,
EEPROM_write(17, 5); //пишем в память 5
else EEPROM_write(17, birdType - 1);
lcd.clear();
}
birdSelect();
lcd.setCursor(6, 0);
lcd.print(birdPrint);
lcd.setCursor(1, 1);
lcd.print("minus NEXT plus");
delay(del);
}
}

void birdSelect() {
int birdType;
EEPROM_read(17, birdType);
lcd.setCursor(2, 0);
lcd.print("BIRD - ");
switch (birdType) {
case 0:
//lcd.print("CHICK"); // курица
birdPrint = "CHICK";
break;
case 1:
//lcd.print("QUAIL"); // перепелка
birdPrint = "QUAIL";
break;
case 2:
//lcd.print("DUCK"); // утка
birdPrint = "DUCK";
break;
case 3:
//lcd.print("MUSKUS"); // индоутка
birdPrint = "MUSKUS";
break;
case 4:
//lcd.print("GOOSE"); // гусь
birdPrint = "GOOSE";
break;
case 5:
//lcd.print("TURKEY"); // индюк
birdPrint = "TURKEY";
break;
}
}

void turn_setup() {
int turnPeriod;

delay(del);
button_read();
lcd.setCursor(4, 0);
lcd.print("TURN SETUP");
delay(1000);
lcd.clear();
int x = 0;
while (1) {
x++;
if (x > interval) {
break;
}
button_read();
EEPROM_read(11, turnPeriod);
if (!button_enter) {
delay(del);
lcd.clear(); //очищаем экран
break;
}
if (!button_plus) {
x = 0;
EEPROM_write(11, turnPeriod + 1);
if (turnPeriod >= 13) { //проверяем, если выше 13,
EEPROM_write(11, 13); //пишем в память 13
}
lcd.clear();
}
if (!button_minus) {
x = 0;
EEPROM_write(11, turnPeriod - 1);
if (turnPeriod <= 0) { //проверяем, если ниже 0,
EEPROM_write(11, 0); //пишем в память 0
}
lcd.clear();
}
EEPROM_read(11, turnPeriod);
lcd.setCursor(0, 0);
lcd.print("PERIOD = ");
if (turnPeriod < 13)lcd.print(turnPeriod);
if (turnPeriod > 12) lcd.print("RND");
lcd.print(" Hour");
lcd.setCursor(1, 1);
lcd.print("minus NEXT plus");
delay(del);
}
}

void alarm_setup() {
float alarmTemp;
delay(del);
button_read();
lcd.setCursor(4, 0);
lcd.print("ALARM SETUP");
delay(1000);
lcd.clear();
int x = 0;
while (1) {
x++;
if (x > interval) break;
button_read();
EEPROM_read(5, alarmTemp);
if (!button_enter) {
delay(del);
lcd.clear(); //очищаем экран
break;
}
if (!button_plus) {
x = 0;
if (alarmTemp >= 10.0) //проверяем, если больше или равно 10,
EEPROM_write(5, 10.0); //пишем в память 10
else EEPROM_write(5, alarmTemp + 0.1);
}
if (!button_minus) {
x = 0;
if (alarmTemp <= 1.0) //проверяем, если ниже 1,
EEPROM_write(5, 1.0); //пишем в память 1
else EEPROM_write(5, alarmTemp - 0.1);
}
lcd.setCursor(1, 0);
lcd.print("T.Alarm +-");
lcd.print(alarmTemp, 1);
lcd.print((char)223);
lcd.print("C ");
lcd.setCursor(1, 1);
lcd.print("minus NEXT plus");
delay(del);
}
}

void vent_setup() {
boolean fanEnable;
delay(del);
button_read();
lcd.setCursor(3, 0);
lcd.print("A.FAN SETUP");
delay(1000);
lcd.clear();
int x = 0;
while (1) {
x++;
if (x > interval) break;
button_read();
EEPROM_read(9, fanEnable);
if (fanEnable > 1) fanEnable = 1;
if (!button_enter) {
delay(del);
lcd.clear(); //очищаем экран
break;
}
if (!button_minus) {
x = 0;
EEPROM_write(9, 0); //пишем в память 0, не включаем принудительную вентиляцию при превышении температуры
}
if (!button_plus) {
x = 0;
EEPROM_write(9, 1); //пишем в память 1, включаем принудительную вентиляцию при превышении температуры
}
lcd.setCursor(2, 0);
lcd.print("Ext.Fan ");
if (fanEnable == 0) lcd.print("disable");
else lcd.print("enable ");
lcd.setCursor(2, 1);
lcd.print("OFF NEXT ON");
delay(del);
}
}

void getSensors() {
unsigned long curMillis = millis(); // Получаем текущее время работы
if (curMillis - trhMillis >= TRHSTEP) { // время для нового измерения?
sensors.requestTemperatures();
temp1Ink = sensors.getTempCByIndex(0);
if (temp1Ink == -127.0) temp1Ink = 85.0;
}
if (curMillis - trhMillis >= TRHSTEP * 4) { // время для нового измерения?
measActive = true;
measType = TEMP;
sht.meas(TEMP, &rawData, NONBLOCK); // измеряем температуру.
trhMillis = curMillis;
}
if (measActive && sht.measRdy()) { // проверяем статус измерения
if (measType == TEMP) { // обрабатываем температуру или влажность?
measType = HUMI;
sht.meas(HUMI, &rawData, NONBLOCK); // измеряем влажность
}
else {
measActive = false;
}
}
}

void thermostat(float tempPoint, float set_humidity) {
DateTime now = RTC.now();
unsigned long now1 = millis();
float alarmTemp;
EEPROM_read(5, alarmTemp);
Setpoint = tempPoint;
myPID.Compute();
if (now1 - windowStartTime > WindowSize) { //время для перещелкивания периода окна
windowStartTime = windowStartTime + WindowSize;
Input = temp1Ink;
lcd.setCursor(0, 0); // устанавливаем курсор в 0-ом столбце, 0 строка (начинается с 0)
lcd.print("T1=");
lcd.print(temp1Ink, 1); // печать температуры на дисплей
lcd.print((char)223);
lcd.setCursor(9, 0);
lcd.print("H=");
lcd.print(humidity, 1); // печать влажности на дисплей
//lcd.print("%");
lcd.print(" ");
lcd.print("D");
if (currentDay > 100) lcd.print("99");
else lcd.print(currentDay); // текущий день инкубации
lcd.setCursor(0, 1);
lcd.print("t");
lcd.print(Setpoint, 1);
lcd.setCursor(6, 1);
lcd.print("h");
lcd.print(set_humidity, 1);
lcd.setCursor(13, 1);
lcd.print("[");
if (RTC.isrunning()) {
if (now.hour() < 10) lcd.print(" ");
lcd.print(now.hour(), DEC);
lcd.print(":");
if (now.minute() < 10)lcd.print(0);
lcd.print(now.minute(), DEC);
}
lcd.setCursor(0, 2);
lcd.print("W");
if (Output > 990) lcd.print("99");
else lcd.print(Output / 10, 0);
lcd.print("%");
lcd.setCursor(0, 3);
lcd.print(birdPrint);
lcd.setCursor(7, 3);
lcd.print("Al+-");
lcd.print(alarmTemp, 1);

}
if (Output > (now1 - windowStartTime) && temp1Ink < 39.9 && heater_off == false) digitalWrite(heater_pin, HIGH);
else digitalWrite(heater_pin, LOW);
}

void humidifer(float set_humidity) {
unsigned long humMillis = 0;
unsigned long curMillis = millis();
if (set_humidity > humidity) digitalWrite(humidifer_pin, HIGH); //сравниваем измеренную влажность с заданной
if (set_humidity < humidity + h_histeresis) digitalWrite(humidifer_pin, LOW);
}

void turn(boolean needTurn) {
int turnPeriod; //период поворота лотков в часах
int turnCommand;
EEPROM_read(11, turnPeriod);
lcd.setCursor(15, 3);
lcd.print("R");
if (turnPeriod == 0)
{ lcd.print(" OFF ");
return; //если нулевой период поворота, то не поворачиваем яйца.
}
if (turnPeriod < 13) turnCommand = turnPeriod;
else if (turnPeriod > 12 && turnFlag == 0) { //если произошел поворот (сброшен флаг) и значение в памяти 13, то
turnCommand = random(1, 6); //берем случайное значение часов 1-6
turnFlag = 1; //защелкиваем флаг вычисления случайных значений до следующего поворота
}
currentTime = millis() / 1000;

lcd.print((loopTime - currentTime + turnCommand * 3600UL) / 60UL);
lcd.print("m");

if (needTurn == true) {
if (currentTime > (loopTime + turnCommand * 3600UL)) { // 3600000 сравниваем текущий таймер с переменной loopTime + период поворота в часах.
digitalWrite(turn_pin, !digitalRead(turn_pin)); // включаем/выключаем реле поворота
loopTime = currentTime; // в loopTime записываем новое значение
turnFlag = 0; //сбрасываем флаг поворота
}
}
}

void alarm(float needTemp) {
float tempInk = sensors.getTempCByIndex(0);
float alarmTemp;
boolean fanState;
EEPROM_read(5, alarmTemp);
EEPROM_read(9, fanState);
if ((millis() - alarmDelay) > 1800000) {
if (tempInk > (needTemp + alarmTemp) || tempInk < (needTemp - alarmTemp)) {
beeper(10);
digitalWrite(alarm_pin, LOW); //если измеренная температура выше заданной на величину аварии
}
else digitalWrite(alarm_pin, HIGH); //то включаем аварийный сигнал.
}
if (tempInk > (needTemp + alarmTemp) && fanState == 1) needFan = 1;
if (tempInk < (needTemp + alarmTemp - 2)) needFan = 0;
}

void beeper(int duration) {
tone(beeper_pin, 2000, duration);
}

void fan(int fanTime) {
DateTime now = RTC.now();
if ((now.hour() == 7 && now.minute() < fanTime) || (now.hour() == 19 && now.minute() < fanTime) || needFan == 1) {
digitalWrite(fan_pin, LOW);
digitalWrite(heater_pin, LOW);
heater_off = true;
}
else {
digitalWrite(fan_pin, HIGH); //иначе выключаем.
heater_off = false;
}
}

union { // This Data structure lets
byte asBytes[24]; // us take the byte array
float asFloat[6]; // sent from processing and
} // easily convert it to a
foo; // float array
void SerialReceive()
{
int index = 0;
byte Auto_Man = -1;
byte Direct_Reverse = -1;
while (Serial.available() && index < 26) {
if (index == 0) Auto_Man = Serial.read();
else if (index == 1) Direct_Reverse = Serial.read();
else foo.asBytes[index - 2] = Serial.read();
index++;
}
if (index == 26 && (Auto_Man == 0 || Auto_Man == 1) && (Direct_Reverse == 0 || Direct_Reverse == 1))
{
Setpoint = double(foo.asFloat[0]);
if (Auto_Man == 0) // * only change the output if we are in
{ // manual mode. otherwise we'll get an
Output = double(foo.asFloat[2]); // output blip, then the controller will
} // overwrite.
double p, i, d; // * read in and set the controller tunings
p = double(foo.asFloat[3]); //
i = double(foo.asFloat[4]); //
d = double(foo.asFloat[5]); //
myPID.SetTunings(p, i, d); //
if (Auto_Man == 0) myPID.SetMode(MANUAL); // * set the controller mode
else myPID.SetMode(AUTOMATIC); //
if (Direct_Reverse == 0) myPID.SetControllerDirection(DIRECT); // * set the controller Direction
else myPID.SetControllerDirection(REVERSE); //
}
Serial.flush(); // * clear any random data from the serial buffer
}

void SerialSend() {
delay(5);
Serial.print("~Mink/set ");
Serial.print(Setpoint);
Serial.print("^~Mink/outpwr ");
Serial.print(Output / 10);
Serial.print("^~Mink/t1 ");
Serial.print(temp1Ink);
Serial.print("^~Mink/hum ");
Serial.println(humidity);
}[/spoiler]

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 04 мар 2018, 18:09
Umka
Не видел таких дисплеев.

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 25 мар 2018, 13:01
Aslanvu
Здравствуйте!

Подскажите пожалуйста варианты как можно реализовать поворот лотков

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 25 мар 2018, 13:43
Aslanvu
На какие пины подключается энкодер?

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 25 мар 2018, 13:46
Aslanvu
Насчет заливки скетча. Я залил на ардуино про мини через программатор уно. В таком случае все правильно будет работать?
Спасибо :!: :)

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 25 мар 2018, 14:21
Umka
Варианты поворота в Гугле.
Энкодер на 2-3 пины, там прерывание.
Насчет программатора не понял.

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 25 мар 2018, 15:31
Aslanvu
Т.е. я скетч залил на ардуино про мини через встроенный программатор ардуино уно

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 25 мар 2018, 16:11
Umka
Может через конвертер? Откула там встроенный программатор? Это как коленвал карданом назвать.

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 25 мар 2018, 19:45
Aslanvu
Наверное :roll:
В таком случае будет схема правильно работать? :)

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 25 мар 2018, 20:06
Umka
Разве схема как-то зависит от способа прошивки? Если кож залит, то должен работать.

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 28 мар 2018, 14:03
grifmax
Aslanvu писал(а):Наверное :roll:
В таком случае будет схема правильно работать? :)
Нужно загрузчик сначала залить от ардуино уна. И потом заливать через прогроматор (уно или нано) причем в менеджере плат выбирать уно, а не про мини. А так без разницы через, что лить нано или уно.

Re: Открытый скетч автопрограммы инкубатора.

Добавлено: 02 апр 2018, 19:05
grifon26
Скажите пожалуста а таблица инкубации у Вас уже провереная? В інтернете есть тоже но с температурой менше чем у Вас. Спасибо