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

Общий раздел для всех подразделов форума.
Aslanvu
Сообщения: 9
Зарегистрирован: 15 фев 2018, 20:01

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

Сообщение Aslanvu » 27 фев 2018, 14:08

Купил модуль часы реального времени ds1307
К каким пинам подключить?

Аватара пользователя
Nemo
Команда UM
Сообщения: 4234
Зарегистрирован: 05 июн 2015, 06:48

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

Сообщение Nemo » 28 фев 2018, 07:22

К тем же что и дисплей.
Плата -> часы -> дисплей.
Получается часы в разрыв между платой и дисплеем.

kulibin
Сообщения: 1
Зарегистрирован: 28 фев 2018, 13:30

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

Сообщение kulibin » 28 фев 2018, 13:40

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

Аватара пользователя
Umka
Команда UM
Сообщения: 6274
Зарегистрирован: 04 июн 2015, 13:45
Откуда: Суджа
Контактная информация:

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

Сообщение Umka » 01 мар 2018, 08:06

Это Вы на forumhouse писали? Как будет время, сделаю.


Kirill
Сообщения: 4
Зарегистрирован: 01 мар 2018, 11:30

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

Сообщение Kirill » 01 мар 2018, 11:40

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

Аватара пользователя
Umka
Команда UM
Сообщения: 6274
Зарегистрирован: 04 июн 2015, 13:45
Откуда: Суджа
Контактная информация:

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

Сообщение Umka » 01 мар 2018, 12:17

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

Kirill
Сообщения: 4
Зарегистрирован: 01 мар 2018, 11:30

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

Сообщение Kirill » 01 мар 2018, 12:22

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

Kirill
Сообщения: 4
Зарегистрирован: 01 мар 2018, 11:30

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

Сообщение Kirill » 01 мар 2018, 12:34

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

Аватара пользователя
Umka
Команда UM
Сообщения: 6274
Зарегистрирован: 04 июн 2015, 13:45
Откуда: Суджа
Контактная информация:

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

Сообщение Umka » 01 мар 2018, 17:16

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

Kirill
Сообщения: 4
Зарегистрирован: 01 мар 2018, 11:30

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

Сообщение Kirill » 01 мар 2018, 20:28

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

Аватара пользователя
Vitalik1111
Сообщения: 1
Зарегистрирован: 28 фев 2018, 15:03

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

Сообщение Vitalik1111 » 04 мар 2018, 10:08

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

Аватара пользователя
Umka
Команда UM
Сообщения: 6274
Зарегистрирован: 04 июн 2015, 13:45
Откуда: Суджа
Контактная информация:

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

Сообщение Umka » 04 мар 2018, 13:50

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

grifon26
Сообщения: 10
Зарегистрирован: 03 мар 2018, 09:35

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

Сообщение grifon26 » 04 мар 2018, 16:39

Я переделал с вашего скетча версии Ф, на свой лад, я просто несилен в програмировании(может убрал нужное чтото, проверить пока немогу заказал недостающие елементи), посмотрите скетч. У меня только однин датчик температури 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]

Аватара пользователя
Umka
Команда UM
Сообщения: 6274
Зарегистрирован: 04 июн 2015, 13:45
Откуда: Суджа
Контактная информация:

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

Сообщение Umka » 04 мар 2018, 18:09

Не видел таких дисплеев.

Aslanvu
Сообщения: 9
Зарегистрирован: 15 фев 2018, 20:01

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

Сообщение Aslanvu » 25 мар 2018, 13:01

Здравствуйте!

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

Aslanvu
Сообщения: 9
Зарегистрирован: 15 фев 2018, 20:01

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

Сообщение Aslanvu » 25 мар 2018, 13:43

На какие пины подключается энкодер?

Aslanvu
Сообщения: 9
Зарегистрирован: 15 фев 2018, 20:01

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

Сообщение Aslanvu » 25 мар 2018, 13:46

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

Аватара пользователя
Umka
Команда UM
Сообщения: 6274
Зарегистрирован: 04 июн 2015, 13:45
Откуда: Суджа
Контактная информация:

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

Сообщение Umka » 25 мар 2018, 14:21

Варианты поворота в Гугле.
Энкодер на 2-3 пины, там прерывание.
Насчет программатора не понял.

Aslanvu
Сообщения: 9
Зарегистрирован: 15 фев 2018, 20:01

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

Сообщение Aslanvu » 25 мар 2018, 15:31

Т.е. я скетч залил на ардуино про мини через встроенный программатор ардуино уно

Аватара пользователя
Umka
Команда UM
Сообщения: 6274
Зарегистрирован: 04 июн 2015, 13:45
Откуда: Суджа
Контактная информация:

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

Сообщение Umka » 25 мар 2018, 16:11

Может через конвертер? Откула там встроенный программатор? Это как коленвал карданом назвать.

Aslanvu
Сообщения: 9
Зарегистрирован: 15 фев 2018, 20:01

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

Сообщение Aslanvu » 25 мар 2018, 19:45

Наверное :roll:
В таком случае будет схема правильно работать? :)

Аватара пользователя
Umka
Команда UM
Сообщения: 6274
Зарегистрирован: 04 июн 2015, 13:45
Откуда: Суджа
Контактная информация:

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

Сообщение Umka » 25 мар 2018, 20:06

Разве схема как-то зависит от способа прошивки? Если кож залит, то должен работать.

grifmax
Сообщения: 9
Зарегистрирован: 24 май 2016, 16:25
Откуда: Орел

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

Сообщение grifmax » 28 мар 2018, 14:03

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

grifon26
Сообщения: 10
Зарегистрирован: 03 мар 2018, 09:35

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

Сообщение grifon26 » 02 апр 2018, 19:05

Скажите пожалуста а таблица инкубации у Вас уже провереная? В інтернете есть тоже но с температурой менше чем у Вас. Спасибо

Ответить