Лучше бы исходник с Layout дал или в чем ты там рисуешь. По фотке же не видно половину дорожек. Все в тумане. Думаешь кто-то будет по фотке плату повторять и еще потом ошибку исправлять?
Роман добрый день, вы бы лучше выложили ссылку по поводу проводящихся сейчас испытаний нового инкубатора. А то не все наверное ходят на Forumhouse. Может кому будет интересно. (Это не реклама).
Интерисует количество и диаметр вентиляционных отверстий, как впускных, так и выпускных., а меня сейчас три на вход, три на выход, диаметром 10мм, поставил одну небольшую ванночку, влажность без парогенератора 65,5% и не падает, он даже не включается, поставил вторую такую влажность выросла до 85,5 - парогениратор вообще вынул, за ненадобностью. И так вопрос:
1.Добавить отверстий? для лучшего воздухообмена, или их диаметр, или оставить как есть?
температуру держит отлично, на уставку выходит быстро.
Не дождавшись ответа от Романа загрузил 20 шт яиц, доверия к которым мало, т.к. возраст петушка 2 года, влажность регулируем площадью ванночек, просверлил еще 2 выходных отверстия, теперь три входных и пять выходных.
А как же я могу ответить не видя инкубатора? И даже видя не скажу наверняка. Я пошел по пути измерения CO2. Будем смотреть что покажут приборы в конце инкубации. Уже температура контрольного яйца выше прочих.
Мой снаружи 50Х50Х62 см, толщина стенок 5 см - какая то медицинская коробка с крышкой, внутри сделал две камеры одна 39Х39Х38 и другая примерно 10Х39Х39
на седьмой день инкубации "забраковал" 6 штук - 4 не оплод, два погибшие эмбрионы, ну я не специалист, первый раз это делал.
так как у тебя Роман сделано, я думаю, не каждый осилит. Сильно много электроники и сложность ее настройки не привлечет, а наоборот- отпугнет "потенциального покупателя". По моему, чем проще, тем лучше , по крайней мере для такого ленивого "колхозника", как я :).
Из 14 оставшихся яиц, вылупилось к вечеру 5 цыплят, один уже прокрутился, но вылазить пока не хочет. еще есть два проклюнувшихся яйца, что будет назавтра - посмотрим. вывод затянутый, потому что яЙца были очень большие, т.к. курам и петуху уже 2,5 года, куры разнеслись и иногда несут даже двухжелтковые, пытался собрать более-менее по размеру, но не сильно получилось. посему такой вот выход. плюс когда собирал на улице был мороз 30 градусов может какие яйца и поморозил. если к утру к пяти имеющимся еще 3 вылупятся, считаю для первого раза результат отличным. В воскресенье договорился взять 20 гусиных яиц от заводчиков - тут и будем проверять выводимость.
А был опыт выведения гусей? Не так все просто с ними.
Нет опыта не было, значит будет. В 90-е , когда жрать было нечего, я держал доволно большое хозяйство, корова с теленком, поросята, кролики, куры, так что меня это не пугает, это после 2000-х стали жить лучше, всю живность перевели, будем вспоминать.
Но всё же. Уважаемые, подскажите, почкму дисплей по I2C не хочет работать? Показывает кубики. Хотел освободить пины которые задействованы на дисплей, но чёт бред выходит.
Но всё же. Уважаемые, подскажите, почкму дисплей по I2C не хочет работать? Показывает кубики. Хотел освободить пины которые задействованы на дисплей, но чёт бред выходит.
Сканер I2C, что показывает? Пока не получите адреса всех подключенных внешних устройств через их протоколы, нахрена скетч основной заливать? Или считаете себя джедаем проводов?
У дисплея стандартный (0x27, 16, 2). Много где именно его ставил.
Скеч без изменений не устраивает из-за того что я не вкуриваю как поставить DHT11 и DS18B20, так как они оба на 11 пин подключаются. Этож бред? А больше свободных пинов нема.
Действительно на одном пине. Логика - DHT измеритель влажности и температуры, ДС-ка не нужна.
По дисплею, если действительно работает, попробуйте со своей библиотекой (их хренова гора) запустить только отображение информации из скетча ТС (закомментить все лишнее), возможно используются другие методы, тогда сравнивать с примерами из вашей библы и корректировать в скетче.
Действительно на одном пине. Логика - DHT измеритель влажности и температуры, ДС-ка не нужна.
По дисплею, если действительно работает, попробуйте со своей библиотекой (их хренова гора) запустить только отображение информации из скетча ТС (закомментить все лишнее), возможно используются другие методы, тогда сравнивать с примерами из вашей библы и корректировать в скетче.
P/S DHT, не лучшее решение для инкубатора. Весьма брехливый показометр, а на инкубационных значениях влажности тем более. Лучше потратьте денег и посмотрите на что то вроде SHT** или как у ТС.
Ну и пускай. Главное если получится хотябы 2-3 выводка сделать, и на этом хорошо. Пока нормальные запчастили жду из "поднебесной".
Всем привет, отсутсвовал по случаю поступления моего сына в Питере в мед.университет на бютжет, можете поздравлять. извиняюсь за оффтоп.
Лёвчег, советую прислушаться к советам Романа (Umka) и не использовать DTH11, я просто их сдуру купил пять штук, надо же было куда-то использовать, потом все равно заменил все на Si7021.
Всем привет, отсутсвовал по случаю поступления моего сына в Питере в мед.университет на бютжет, можете поздравлять. извиняюсь за оффтоп.
Примите мои поздравления за сына! Удачи ему в учёбе!!!
lean_74 пишет:
Лёвчег, советую прислушаться к советам Романа (Umka) и не использовать DTH11, я просто их сдуру купил пять штук, надо же было куда-то использовать, потом все равно заменил все на Si7021.
Да я тоже потом заменю, просто в данный момент нет других, а ждать из китая долго. Про покупку у нас вообще молчу, цены конские, да и срок доставки не на много меньше!
А инкубатор срочно собрать нужно. Родственники обещают к концу недели 5 десятков перепилинных яиц подогнать за так.
Примите мои поздравления за сына! Удачи ему в учёбе!!!
Спасибо!
Лёвчег пишет:
Да я тоже потом заменю, просто в данный момент нет других, а ждать из китая долго. Про покупку у нас вообще молчу, цены конские, да и срок доставки не на много меньше!
А инкубатор срочно собрать нужно. Родственники обещают к концу недели 5 десятков перепилинных яиц подогнать за так.
Практика показывает, в этом деле торопиться не стоит, нужно собрать и "погонять" инкубатор, проверить температуру и влажность, если надо откалибровать, У меня Далласы на 0,7 градуса из одной партии врут.
Практика показывает, в этом деле торопиться не стоит, нужно собрать и "погонять" инкубатор, проверить температуру и влажность, если надо откалибровать, У меня Далласы на 0,7 градуса из одной партии врут.
[/quote]
Как калибровать? Точных измерителей нет. Остаётся надеяться)
А я вот очередные 300 яиц достал в выводной шкаф. Наклюнутых много. Электрики в начале месяца активно светом баловались. По 20 часов не было. Дизель выручал. Ну, посмотрим что вылупится.
Лучше бы исходник с Layout дал или в чем ты там рисуешь. По фотке же не видно половину дорожек. Все в тумане. Думаешь кто-то будет по фотке плату повторять и еще потом ошибку исправлять?
Роман исходник выше, 15 пост темы
Ну да, я думал та плата была позже допилена.
Нарисовал плату, правда это всего лишь 3-я моя плата в Sprint-Layout, посему сильно просьба не пинать.
https://yadi.sk/d/nCYIDGV73E2aRv
Вот же выше дал ссылку, там в lay6
сейчас в корпус заталкиваю в коробочку из Леруа за 37руб., и правлю скетч под новые выводы
Роман добрый день, вы бы лучше выложили ссылку по поводу проводящихся сейчас испытаний нового инкубатора. А то не все наверное ходят на Forumhouse. Может кому будет интересно. (Это не реклама).
Не вопрос. Начало тут https://www.youtube.com/watch?v=xPMhensZ3Pw
Но это совсем другой инкубатор (контроллер).
Не вопрос. Начало тут https://www.youtube.com/watch?v=xPMhensZ3Pw
Но это совсем другой инкубатор (контроллер).
Интерисует количество и диаметр вентиляционных отверстий, как впускных, так и выпускных., а меня сейчас три на вход, три на выход, диаметром 10мм, поставил одну небольшую ванночку, влажность без парогенератора 65,5% и не падает, он даже не включается, поставил вторую такую влажность выросла до 85,5 - парогениратор вообще вынул, за ненадобностью. И так вопрос:
1.Добавить отверстий? для лучшего воздухообмена, или их диаметр, или оставить как есть?
температуру держит отлично, на уставку выходит быстро.
Не дождавшись ответа от Романа загрузил 20 шт яиц, доверия к которым мало, т.к. возраст петушка 2 года, влажность регулируем площадью ванночек, просверлил еще 2 выходных отверстия, теперь три входных и пять выходных.
А как же я могу ответить не видя инкубатора? И даже видя не скажу наверняка. Я пошел по пути измерения CO2. Будем смотреть что покажут приборы в конце инкубации. Уже температура контрольного яйца выше прочих.
http://zftlab.org/pages/2017021400.html
И похоже с нем вода закончилась http://esp8266.flymon.net/?macs=18FE34E0C1DF,18FE34DB15A6&graphs=hum,temp,co2,rssi,gpio&period=1h
А вот тепловизор типа http://zftlab.org/files/examples_js/ver_15a_umka.html
Мой снаружи 50Х50Х62 см, толщина стенок 5 см - какая то медицинская коробка с крышкой, внутри сделал две камеры одна 39Х39Х38 и другая примерно 10Х39Х39
на седьмой день инкубации "забраковал" 6 штук - 4 не оплод, два погибшие эмбрионы, ну я не специалист, первый раз это делал.
так как у тебя Роман сделано, я думаю, не каждый осилит. Сильно много электроники и сложность ее настройки не привлечет, а наоборот- отпугнет "потенциального покупателя". По моему, чем проще, тем лучше , по крайней мере для такого ленивого "колхозника", как я :).
Вот чудо и случилось. Первые два появились на свет. Остальные еще пищат из своих яиц.
Из 14 оставшихся яиц, вылупилось к вечеру 5 цыплят, один уже прокрутился, но вылазить пока не хочет. еще есть два проклюнувшихся яйца, что будет назавтра - посмотрим. вывод затянутый, потому что яЙца были очень большие, т.к. курам и петуху уже 2,5 года, куры разнеслись и иногда несут даже двухжелтковые, пытался собрать более-менее по размеру, но не сильно получилось. посему такой вот выход. плюс когда собирал на улице был мороз 30 градусов может какие яйца и поморозил. если к утру к пяти имеющимся еще 3 вылупятся, считаю для первого раза результат отличным. В воскресенье договорился взять 20 гусиных яиц от заводчиков - тут и будем проверять выводимость.
С гусиками не торопитесь, они сложные в выводе.
С гусиками не торопитесь, они сложные в выводе.
Да договорился уже, как то некрасиво переобуваться. Будем завтра все мыть, а воскресенье вечером закладывать.
А был опыт выведения гусей? Не так все просто с ними.
А был опыт выведения гусей? Не так все просто с ними.
Нет опыта не было, значит будет. В 90-е , когда жрать было нечего, я держал доволно большое хозяйство, корова с теленком, поросята, кролики, куры, так что меня это не пугает, это после 2000-х стали жить лучше, всю живность перевели, будем вспоминать.
Сделал новую версию инкубатора на промини https://yadi.sk/d/iH2s0-ZR3GRrxh правда скачал перевернутый шаблон
0001
#include <avr/wdt.h>
0002
//#include <LiquidCrystal_I2C.h>
0003
#include <LiquidCrystal.h>
0004
#include <EEPROM.h>
0005
//#include "DHT.h"
0006
#include <Si7021.h> //мой датчик влажности
0007
#include <OneWire.h>
0008
#include <Wire.h>
0009
#define START_CONVERT 0
0010
#define READ_TEMP 1
0011
0012
0013
0014
//#define DHTPIN 11 // what digital pin we're connected to
0015
//#define DHTTYPE DHT11 // DHT 11, DHT 22
0016
//DHT dht(DHTPIN, DHTTYPE);
0017
SI7021 si7021;
//раскоментировать, если используем датчик si7021.
0018
0019
//LiquidCrystal_I2C lcd(0x27, 16, 2); // инициализация библиотеки дисплея
0020
LiquidCrystal lcd(17, 16, 15, 14, 13, 12);
// (RS, E, DB4, DB5, DB6, DB7)
0021
0022
//номера выводов кнопок
0023
//#define EXT_HEATING // ИСПОЛЬЗУЕМ ДОП.НАГРЕВАТЕЛЬ ВМЕСТО УВЛАЖНИТЕЛЯ. Если нужен увлажнитель, просто закомментируйте эту строку.
0024
#define heater_pin 7 // нагреватель
0025
#define humidifer_pin 4 // увлажнитель
0026
//#define fan_pin 10 // вентилятор
0027
#define alarm_pin 9 // пин аварии
0028
//#define beeper_pin 17 //пищалка по аварии
0029
0030
//#define turn_pin 9 // управление поворотом вперед
0031
//#define pin9 9 // проверка
0032
//#define extend_heater_pin 8 // дополнительный нагреватель
0033
#define button_minus_pin 0 //пин кнопки "минус"
0034
#define button_plus_pin 1 //пин кнопки "плюс"
0035
#define button_enter_pin 10 //пин кнопки "enter"
0036
#define DS18B20_Pin 11 //пин термометра
0037
//Пин 2 Вход обработки прерывания для детектора нуля и управления семистором
0038
0039
OneWire ds(DS18B20_Pin);
0040
0041
// Контакты Bl Pi Ye Or
0042
int
pins[] = {3, 5, 6, 8};
//Задаем пины по порядку для шаговика
0043
int
phases = 8;
// Для полушагового режима
0044
0045
// Для полушагового режима
0046
bool
motorPhases[8][4] = {
// [phase][pin]
0047
// -------- pins ----------
0048
// Winding A B A B
0049
// Motor Pin 1 2 3 4
0050
// Color Bl Pi Ye Or
0051
{ 1, 1, 0, 0},
0052
{ 0, 1, 0, 0},
0053
{ 0, 1, 1, 0},
0054
{ 0, 0, 1, 0},
0055
{ 0, 0, 1, 1},
0056
{ 0, 0, 0, 1},
0057
{ 1, 0, 0, 1},
0058
{ 1, 0, 0, 0}
0059
};
0060
int
phase = 0;
0061
int
_step = 1;
// Если у шага поменять знак, на -1 - изменится направление вращения шаговика.
0062
0063
boolean button_minus;
// статус нажатия кнопок
0064
boolean button_plus;
0065
boolean button_enter;
0066
boolean value = HIGH;
// переменная состояния релешки увлажнителя
0067
0068
unsigned
long
currentTime;
// задаем переменные для тайминга поворота
0069
unsigned
long
loopTime;
0070
unsigned
long
serialTime;
//this will help us know when to talk with processing
0071
0072
boolean hotFlag1 = 0;
// флаг включения обогревателя основного 1-ошибка, включать нельзя
0073
//boolean fanFlag = 0; // флаг включения вентилятора проветривания 1-включено проветривание
0074
unsigned
long
trhMillis = 0;
0075
unsigned
long
humMillis = 0;
0076
0077
boolean flag = 0;
0078
int
clockTime = 0;
// флаг того что выводим температуру или влажность
0079
unsigned
long
lastMillis = millis();
0080
int
TimeTemp = 4;
//время следующего измерения температуры в секундах
0081
int
TimeTurn = 20;
//время поворота в десятых долях секунды
0082
byte
TurnNow = 0;
// текущая задержка времени для переворота
0083
const
unsigned
long
TRHSTEP = 300UL;
// Период опроса датчиков
0084
0085
//int counter=0;//для проверки вачдога
0086
0087
volatile uint8_t minut = 0;
0088
//volatile uint8_t chas=0;
0089
int
chas = 0;
0090
volatile uint8_t sec = 0;
0091
int
den = 0;
0092
int
oldden = 0;
0093
int
oldchas = 0;
0094
0095
int
temp = 0;
// температура Далласа
0096
float
temp1 = 0;
// температура Далласа с десятыми
0097
float
temp2 = 0;
// температура DHT, si7021
0098
float
hum = 0;
0099
0100
int
del = 80;
// переменная ожидания между выборами меню
0101
unsigned
int
interval = 200;
// интервал сколько будет длиться цикл while, после чего перейдёт к следующему меню.(кол-во итераций)
0102
0103
boolean
out
= 0;
//управление симистором yul-i-an
0104
int
reg, er, zad;
// yul-i-an
0105
double
I, Kp = 3, Ki = 0.45, Kd = 0.6, pre_err, err;
// yul-i-an
0106
0107
//unsigned long alarmDelay;
0108
0109
float
needTemp = 37.6;
// нужная для текущего дня температура инкубации (по умолчанию)
0110
float
needHum = 60.5;
// ---- влажность
0111
int
ventTime = 2;
// длительность проветривания
0112
boolean needTurn =
false
;
// нужен ли поворот яиц?
0113
int
bird = 0;
0114
0115
// make some custom characters:
0116
byte
znak_g[8] = {
//г
0117
0b11111,
0118
0b10001,
0119
0b10000,
0120
0b10000,
0121
0b10000,
0122
0b10000,
0123
0b10000,
0124
0b00000
0125
};
0126
byte
znak_b[8] = {
//Б
0127
0b11111,
0128
0b10001,
0129
0b10000,
0130
0b11110,
0131
0b10001,
0132
0b10001,
0133
0b11110,
0134
0b00000
0135
};
0136
0137
byte
znak_p[8] = {
0138
0b11111,
0139
0b10001,
0140
0b10001,
0141
0b10001,
0142
0b10001,
0143
0b10001,
0144
0b10001,
0145
0b00000
0146
};
0147
byte
znak_i[8] = {
0148
0b10001,
0149
0b10001,
0150
0b10011,
0151
0b10101,
0152
0b11001,
0153
0b10001,
0154
0b10001,
0155
0b00000
0156
};
0157
0158
byte
znak_l[8] = {
0159
0b00111,
0160
0b01001,
0161
0b10001,
0162
0b10001,
0163
0b10001,
0164
0b10001,
0165
0b10001,
0166
0b00000
0167
};
0168
0169
byte
light_znak[8] = {
0170
0b10000,
0171
0b10000,
0172
0b10000,
0173
0b11110,
0174
0b10001,
0175
0b10001,
0176
0b01110,
0177
0b00000
0178
};
0179
0180
byte
znak_u[8] = {
0181
0b10001,
0182
0b10001,
0183
0b10001,
0184
0b01111,
0185
0b00001,
0186
0b10001,
0187
0b01110,
0188
0b00000
0189
};
0190
0191
0192
byte
znak_ia[8] = {
0193
0b01111,
0194
0b10001,
0195
0b10001,
0196
0b01111,
0197
0b00101,
0198
0b01001,
0199
0b10001,
0200
0b00000
0201
};
0202
byte
znak_d[8] = {
0203
0b01110,
0204
0b01010,
0205
0b01010,
0206
0b01010,
0207
0b01010,
0208
0b11111,
0209
0b10001,
0210
0b00000
0211
};
0212
byte
znak_ch[8] = {
0213
0b10001,
0214
0b10001,
0215
0b10001,
0216
0b01111,
0217
0b00001,
0218
0b00001,
0219
0b00001,
0220
0b00000
0221
};
0222
byte
znak_c[8] = {
0223
0b10010,
0224
0b10010,
0225
0b10010,
0226
0b10010,
0227
0b10010,
0228
0b10010,
0229
0b11111,
0230
0b00001
0231
};
0232
0233
//расчет мощности по ПИД закону регулирования
0234
//_------------------------------------------------------------
0235
#define kP 6//коэффициент пропорциональности 6
0236
#define p_min 0.0//минимум П составляющей - не < 0
0237
#define p_max 100.0//максимум П составляющей - не > 100
0238
#define kI 0.100//коэффициент интегрирования 0.025
0239
#define i_min 0.0//минимум И составляющей
0240
#define i_max 30.0//максимум И составляющей
0241
#define kd 0//коэффициент диференциирования
0242
#define d_ctl 7.0//зона пропорциональности ust-d_ctl
0243
#define out_min 0//минимальный выходной %
0244
#define out_max 100//максимальный выходной %
0245
//возвращает необходимую мощность
0246
uint8_t PIctl(
float
temp,
float
ust) {
0247
0248
uint8_t
out
= 0;
//uint8_t
0249
static
float
i = 0;
0250
static
float
ed = 0;
///
0251
float
e, p;
0252
float
d;
///
0253
e = (ust - temp);
//ошибка регулирования
0254
p = (temp < ust - d_ctl) ? p_max : (temp > ust) ? p_min : (kP * e);
//П составляющая
0255
i = (i < i_min) ? i_min : (i > i_max) ? i_max : i + (kI * e);
//И составляющая
0256
d = kd * (e - ed);
//Д составляющая
0257
ed = e;
///
0258
out
= (p + i + d < out_min) ? out_min : (p + i + d > out_max) ? out_max : p + i + d;
0259
//вывод для настройки
0260
// Serial.print(" e ");
0261
// Serial.print(e);
0262
// Serial.print(" p ");
0263
// Serial.print(p);
0264
// Serial.print(" i ");
0265
// Serial.print(i);
0266
// Serial.print(" out ");
0267
// Serial.println(out);
0268
return
out
;
0269
}
0270
//---------------------------------------------------------------
0271
0272
0273
0274
void
readSet() {
0275
den = EEPROM_int_read(100);
0276
chas = EEPROM_int_read(102);
0277
int
bird;
// выбор птицы
0278
int
r_array[6][4][5] = {
0279
{{2, 382, 600, 0, 1}, {12, 376, 600, 3, 1}, {15, 374, 480, 10, 1}, {18, 370, 855, 10, 0}},
0280
{{2, 378, 550, 0, 1}, {7, 378, 500, 3, 1}, {14, 378, 500, 10, 1}, {16, 375, 700, 0, 0}},
0281
{{7, 382, 700, 0, 1}, {14, 378, 600, 0, 1}, {25, 378, 600, 10, 1}, {28, 375, 855, 0, 0}},
0282
{{2, 380, 600, 0, 1}, {7, 378, 550, 0, 1}, {29, 375, 450, 10, 1}, {30, 370, 750, 0, 0}},
0283
{{7, 378, 700, 0, 1}, {14, 378, 600, 0, 1}, {27, 378, 600, 15, 1}, {30, 375, 855, 0, 0}},
0284
{{8, 377, 650, 0, 1}, {14, 377, 500, 0, 1}, {25, 375, 650, 10, 1}, {28, 375, 655, 10, 0}},
0285
};
0286
//ковалев
0287
// {{2, 382, 650, 0, 1}, {12, 377, 540, 5, 1}, {18, 374, 480, 20, 1}, {20, 371, 855, 10, 0}}, // chick
0288
// {{2, 382, 600, 0, 1}, {12, 376, 600, 3, 1}, {15, 374, 480, 10, 1}, {18, 370, 855, 10, 0}}, // quail
0289
// {{7, 381, 700, 0, 1}, {13, 376, 600, 3, 1}, {25, 373, 560, 20, 1}, {30, 370, 855, 10, 0}}, // duck
0290
// {{15, 380, 610, 5, 1}, {26, 375, 520, 20, 1}, {27, 374, 690, 10, 0}, {35, 370, 800, 0, 0}}, // muskus
0291
// {{3, 379, 630, 0, 0}, {13, 378, 540, 3, 1}, {26, 375, 560, 20, 1}, {30, 372, 590, 10, 0}}, // goose
0292
// {{6, 379, 560, 0, 1}, {12, 376, 530, 3, 1}, {26, 373, 520, 20, 1}, {30, 370, 855, 10, 0}}, // turkey
0293
0294
//Serial.println("readset=");
0295
0296
bird = EEPROM_int_read(110);
0297
for
(
int
d = 4; d >= 0; d--) {
0298
if
(den <= r_array[bird][d][0]) {
//у Ковалева < ,а у меня <=
0299
needTemp =
float
(r_array[bird][d][1]) / 10;
//
0300
needHum =
float
(r_array[bird][d][2]) / 10;
//
0301
ventTime = r_array[bird][d][3];
0302
needTurn = r_array[bird][d][4];
0303
}
0304
}
0305
//TimeTurn= EEPROM_int_read(98);
0306
// EEPROM.write(10, TurnNow);
0307
//int turnPeriod = EEPROM_int_read(104);
0308
TurnNow = EEPROM.read(120);
0309
//int intTurnNow=TurnNow;
0310
//if ((intTurnNow<0) || (intTurnNow>turnPeriod) ){
0311
// TurnNow=0;
0312
// EEPROM.write(120, TurnNow);
0313
//}
0314
if
(den > 36 || den < 0) {
0315
den = 0;
//
0316
}
0317
if
(chas > 24) {
0318
chas = 0;
//
0319
}
0320
if
(minut > 60) {
0321
minut = 0;
//
0322
}
0323
0324
}
0325
0326
void
setup
() {
0327
wdt_disable();
// запретили как можно скорее собаку, что-бы не уйти в бесконечный ребут
0328
// Serial.begin(9600);
0329
// readSet();
0330
lcd.begin(16,2);
0331
// lcd.backlight(); // Включаем подсветку дисплея
0332
lcd.clear();
0333
0334
// create a new character
0335
// lcd.createChar(5, znak_g);//г
0336
lcd.createChar(5, znak_b);
//Б
0337
lcd.createChar(1, znak_i);
//И
0338
lcd.createChar(2, znak_p);
//П
0339
lcd.createChar(3, znak_l);
//Л
0340
lcd.createChar(4, light_znak);
// мягкий хнак
0341
lcd.createChar(7, znak_d);
//Д
0342
lcd.createChar(8, znak_c);
//Ц
0343
lcd.createChar(6, znak_u);
//У
0344
0345
lcd.setCursor(0, 0);
0346
0347
lcd.print(
" HAPO"
);
0348
lcd.write(7);
0349
lcd.print(
"H"
);
0350
lcd.write(4);
0351
lcd.print(
"|"
);
0352
lcd.write(1);
0353
lcd.setCursor(0, 1);
0354
lcd.print(
" "
);
0355
lcd.write(1);
0356
lcd.print(
"HK"
);
0357
lcd.write(6);
0358
lcd.write(5);
0359
lcd.print(
"ATOP"
);
0360
0361
0362
0363
Wire.begin();
// старт I2C
0364
0365
// dht.begin();
0366
si7021.begin();
// Runs : Wire.begin() + reset() // старт датчика влажности
0367
delay(3000);
// подождем пока датчик запуститься, и завтавка погорит
0368
si7021.setHumidityRes(12);
// Humidity = 12-bit / Temperature = 14-bit //максимальное разрешение
0369
0370
0371
lcd.createChar(5, znak_g);
//г
0372
readSet();
// читаем настройки из еепром
0373
0374
0375
0376
// настройкa часов
0377
TCCR1A = (1 << WGM11);
//режим14 FAST PWM
0378
TCCR1B = (1 << CS12) | (1 << WGM13) | (1 << WGM12);
//делить частоту CPU на 256
0379
ICR1 = 62499;
// (16000000MHz /div256) -1 = 1 раз в секунду
0380
TIMSK1 = (1 << TOIE1);
//разрешить прерывание
0381
0382
tempProcess(START_CONVERT);
//конвентируем dallas
0383
0384
attachInterrupt(0, zero_crosss_int, RISING);
//внешнее прерывание на D2
0385
0386
//pinMode(extend_heater_pin, OUTPUT); //пин дополнительного нагревателя. Переводим в 1 чтобы не включать реле.
0387
//digitalWrite(extend_heater_pin, HIGH);
0388
pinMode(heater_pin, OUTPUT);
0389
// pinMode(turn_pin, OUTPUT); // устанавливаем выводы
0390
// pinMode(pin9, INPUT); // устанавливаем выводы
0391
// digitalWrite(turn_pin, LOW);
0392
//digitalWrite(turn_pin2, HIGH);
0393
pinMode(humidifer_pin, OUTPUT);
0394
digitalWrite(humidifer_pin, LOW);
0395
// pinMode(fan_pin, OUTPUT);
0396
// digitalWrite(fan_pin, LOW);
0397
pinMode(alarm_pin, OUTPUT);
0398
digitalWrite(alarm_pin, HIGH);
0399
pinMode(button_minus_pin, INPUT_PULLUP);
//подтягиваем входы кнопок к плюсу встроенными резисторами
0400
pinMode(button_plus_pin, INPUT_PULLUP);
0401
pinMode(button_enter_pin, INPUT_PULLUP);
0402
0403
for
(
int
i = 0; i < 4; i++) pinMode(pins[i], OUTPUT);
//настраиваем выводы для шаговика
0404
for
(
int
i = 0; i < 4; i++) digitalWrite(pins[i], LOW);
0405
0406
0407
// alarmDelay = millis();
0408
0409
wdt_enable(WDTO_8S);
// активировали таймер, каждые 8 секунд его нужно сбрасывать
0410
0411
}
0412
0413
ISR (TIMER1_OVF_vect) {
0414
sec++ ;
//инкремент переменной каждую секунду
0415
if
(sec > 59) {
0416
sec = 0;
0417
minut++;
0418
}
0419
if
(minut > 59) {
0420
minut = 0;
// при записи каждый час хватит памяти на 11 лет
0421
chas++;
0422
}
0423
if
(chas > 23) {
0424
chas = 0;
//readSet(); но нам главное знать день инкубации
0425
den++;
0426
}
0427
if
(den > 36) {
0428
den = 0;
// частный случай для нас не принципиальный, у нас день инкубации
0429
}
0430
}
0431
0432
void
loop
() {
0433
wdt_reset();
// говорим собаке что "В Багдаде все спокойно", начинается очередной отсчет 8-х секунд.
0434
// Serial.print("pin9=");
0435
// Serial.println(digitalRead(alarm_pin));
0436
// Serial.print("chas=");
0437
// Serial.println(chas);
0438
// Serial.print("oldchas=");
0439
// Serial.println(oldchas);
0440
// Serial.print("oldden=");
0441
// Serial.println(oldden);
0442
// Serial.print("button_plus=");
0443
// Serial.println(button_plus);
0444
// Serial.println(" ");
0445
0446
if
(oldchas != chas) {
// раз в час сохраняем время
0447
EEPROM_int_write(102, chas);
0448
oldchas = chas;
0449
turn(needTurn);
0450
wdt_reset();
0451
}
0452
if
(oldden != den) {
// раз в день читаем настройки заново
0453
EEPROM_int_write(100, den);
0454
readSet();
0455
oldden = den;
0456
}
0457
button_read();
0458
if
(!button_enter) {
0459
delay(del);
//
0460
lcd.clear();
0461
menu();
0462
}
0463
if
(!button_plus) {
0464
delay(del);
0465
// lcd.clear();
0466
// alarmDelay = millis(); // задержка аварии по нажатии кнопки Минус
0467
}
0468
if
(!button_minus) {
0469
delay(del);
0470
lcd.clear();
0471
// digitalWrite(turn_pin, !digitalRead(turn_pin)); // включаем/выключаем реле поворота по кнопке Плюс
0472
lcd.setCursor(3, 0);
0473
lcd.write(2);
0474
lcd.print(
"EPEBOPOT"
);
// перепелка
0475
0476
// _step=- _step;
0477
for
(
int
k = 0; k <127; k++) {
// 4076 на полный оборот передаточное число 63.68395:1
0478
phase += _step;
0479
if
(phase > 7) phase = 0;
0480
if
(phase < 0) phase = 7;
0481
0482
for
(
int
i = 0; i < 4; i++) {
0483
digitalWrite(pins[i], ((motorPhases[phase][i] == 1) ? HIGH : LOW));
0484
}
0485
// Пауза на вращение на один полушаг
0486
delayMicroseconds(8000);
0487
wdt_reset();
0488
}
0489
}
else
//отключаем пины шаговика, чтобы не грелся понапрасну
0490
for
(
int
i = 0; i < 4; i++) {
// тут проверочку сделать, чтобы все время не отключать, уже отключенный, поворот
0491
digitalWrite(pins[i], LOW);
0492
}
0493
0494
lcd.setCursor(0, 0);
0495
if
(millis() > serialTime)
0496
{
0497
getSensors();
// получаем данные с датчиков
0498
0499
PID();
//расчитываем ПИД yul-i-an
0500
serialTime += 1200;
//1200
0501
// err=needTemp-temp1;
0502
// Serial.print("needTemp=");
0503
// Serial.println(needTemp);
0504
// Serial.print("temp1=");
0505
// Serial.println(temp1);
0506
// Serial.print("err=");
0507
// Serial.println(err);
0508
// Serial.print("zad=");
0509
// Serial.println(zad);
0510
// Serial.print("fanFlag=");
0511
// Serial.println(fanFlag);
0512
// Serial.print("hotFlag1=");
0513
// Serial.println(hotFlag1);
0514
// Serial.print("needTemp=");
0515
// Serial.println(needTemp);
0516
// Serial.println("");
0517
}
0518
0519
if
(flag == 0)
0520
{
0521
lastMillis = millis();
0522
clockTime = !clockTime;
0523
flag = 1;
0524
}
0525
0526
if
(millis() - lastMillis >= TimeTemp * 1000) {
0527
flag = 0;
0528
}
0529
if
(clockTime == 1) {
0530
lcd.setCursor(0, 0);
// выводим часы и день инкубации
0531
if
(chas < 10) lcd.print(
" "
);
0532
lcd.print(chas, DEC);
0533
lcd.print(
":"
);
0534
if
(minut < 10)lcd.print(0);
0535
lcd.print(minut, DEC);
0536
lcd.print(
" "
);
0537
lcd.write(7);
0538
lcd.print(
"EH"
);
0539
lcd.write(4);
0540
lcd.print(
" "
);
0541
lcd.print(den, DEC);
0542
lcd.print(
" "
);
0543
lcd.setCursor(0, 1);
0544
lcd.print(
"P="
);
0545
lcd.print(zad);
// печать температуры на дисплей temp%10
0546
// lcd.print((char)223);
0547
lcd.print(
"% "
);
0548
printbird(bird);
0549
}
0550
else
{
0551
0552
lcd.setCursor(0, 0);
// устанавливаем курсор в 0-ом столбце, 0 строка (начинается с 0)
0553
lcd.print(
"T1="
);
0554
lcd.print(temp / 10, 1);
// печать температуры на дисплей temp
0555
lcd.print(
"."
);
0556
lcd.print(temp % 10, 1);
// печать температуры на дисплей temp%10
0557
0558
lcd.print((
char
)223);
0559
lcd.print(
" ("
);
0560
lcd.print(needTemp, 1);
0561
lcd.print((
char
)223);
0562
lcd.print(
") "
);
0563
lcd.setCursor(0, 1);
0564
lcd.print(
"H ="
);
0565
lcd.print(hum, 1);
// печать влажности на дисплей
0566
lcd.print(
"%"
);
0567
lcd.print(
" ("
);
0568
lcd.print(needHum, 1);
0569
lcd.print(
"%) "
);
0570
0571
}
0572
0573
getSensors();
// получаем данные с датчиков
0574
humidifer(needHum);
0575
// turn(needTurn); // переворот перенесли при смене каждого часа
0576
fan(ventTime);
0577
alarm(needTemp);
0578
0579
// if (fanFlag) { //если флаг вентилятора включен выключем тены до температуры 32 градуса и включаем вентилятор
0580
// digitalWrite(fan_pin, LOW); //
0581
// if (temp1 >= 32)
0582
// { hotFlag1 = 1;
0583
// } else {
0584
// hotFlag1 = 0; //
0585
// }
0586
0587
// } else {
0588
// // digitalWrite(extend_heater_pin, HIGH); //поверить!!!!
0589
//// digitalWrite(fan_pin, HIGH); //
0590
// hotFlag1 = 0;
0591
// }
0592
0593
}
0594
0595
0596
//регулятор ПИД
0597
void
PID() {
0598
err = needTemp - temp1;
0599
if
(hotFlag1 == 0) I = I + err;
//если проветривание или авария не включаем
0600
0601
// zad=Kp*err+(Ki*I*0.25)+(Kd*(err-pre_err)/0.25);
0602
zad = PIctl(temp1, needTemp);
//расчет мощности
0603
pre_err = err;
0604
if
(temp1 >= 39.5)
//это при перегреве
0605
{
0606
zad = 0;
0607
I = 0;
0608
}
0609
if
(zad < 0) {
0610
zad = 0;
0611
I = 0;
0612
}
0613
if
(zad > 100) {
0614
zad = 100;
0615
}
0616
// Serial.print("reg=");
0617
// Serial.println(reg);
0618
0619
}
0620
//Внешнее прерывание детектора нуля
0621
void
zero_crosss_int()
0622
{
0623
ResOut();
//Вызов функции управления симистором по алгоритму Брезенхема
0624
}
0625
0626
//управление симистором
0627
void
ResOut() {
0628
delayMicroseconds(1230);
//для попадания в ноль
0629
reg = zad + er;
0630
if
(reg < 50) {
0631
out
= 0;
0632
// PORTD &= ~_BV(PD6); // установить "0" на линии 6 порта D
0633
// PORTD &= ~(1 << 6);
0634
er = reg ;
0635
0636
}
0637
else
{
0638
out
= 1;
0639
// PORTD |= _BV(PD6);
0640
// PORTD |= (1 << 6);
0641
er = reg - 100;
0642
}
0643
if
(hotFlag1 == 0) {
0644
digitalWrite(heater_pin,
out
);
//если проветривание или авария не включаем
0645
0646
}
0647
else
{
0648
digitalWrite(heater_pin, LOW);
0649
0650
}
0651
}
0652
0653
0654
void
button_read() {
//функция проверки нажатия кнопки
0655
button_minus = digitalRead(button_minus_pin);
//запоминаем значение кнопки
0656
button_plus = digitalRead(button_plus_pin);
//запоминаем значение кнопки
0657
button_enter = digitalRead(button_enter_pin);
//запоминаем значение кнопки
0658
// if (!button_minus || !button_plus || !button_enter) beeper(50);
0659
wdt_reset();
0660
}
0661
0662
0663
//меню
0664
void
menu() {
0665
startInk();
0666
time_setup_chas();
0667
time_setup_minut();
0668
bird_setup();
0669
turn_setup();
0670
// turn_time_setup();
0671
// alarm_setup();
0672
// vent_setup();
0673
}
0674
0675
// записываем в память день начала инкубации
0676
void
startInk() {
0677
String str_menu =
"START INK"
;
0678
int
perem_menu = den;
0679
int
adress_errom = 100;
0680
int
perem_max = 36;
0681
String str_perem =
"Day"
;
0682
den = setup_menu(str_menu, perem_menu, adress_errom, perem_max, str_perem);
0683
}
0684
//устанавливаем часы
0685
void
time_setup_chas() {
0686
String str_menu =
"SETUP HOUR"
;
0687
int
perem_menu = chas;
0688
int
adress_errom = 102;
0689
int
perem_max = 23;
0690
String str_perem =
"Hour"
;
0691
chas = setup_menu(str_menu, perem_menu, adress_errom, perem_max, str_perem);
0692
}
0693
//устанавливаем минуты
0694
void
time_setup_minut() {
0695
String str_menu =
"SETUP minute"
;
0696
int
perem_menu = minut;
0697
int
adress_errom = 0;
0698
int
perem_max = 59;
0699
String str_perem =
"minute"
;
0700
minut = setup_menu(str_menu, perem_menu, adress_errom, perem_max, str_perem);
0701
}
0702
0703
//выбираем птицу /////////////////////////////////////////////////////////
0704
0705
void
bird_setup() {
0706
String str_menu =
"SETUP bird"
;
0707
int
perem_menu = bird;
0708
int
adress_errom = 110;
0709
int
perem_max = 5;
0710
String str_perem =
"bird"
;
0711
bird = setup_menu(str_menu, perem_menu, adress_errom, perem_max, str_perem);
0712
}
0713
0714
0715
//устанавливаем поворот
0716
void
turn_setup() {
0717
int
turnPeriod = EEPROM_int_read(104);
//период поворота лотков в часах
0718
0719
String str_menu =
"TURN SETUP"
;
0720
int
perem_menu = turnPeriod;
0721
int
adress_errom = 104;
0722
int
perem_max = 12;
0723
String str_perem =
"TURN Hour"
;
0724
turnPeriod = setup_menu(str_menu, perem_menu, adress_errom, perem_max, str_perem);
0725
}
0726
0727
////устанавливаем время переворота
0728
//void turn_time_setup() {
0729
//int TimeTurn=EEPROM_int_read(98); //период поворота лотков в часах
0730
//
0731
//String str_menu= "TURN TIME";
0732
//int perem_menu=TimeTurn;
0733
//int adress_errom=98;
0734
//int perem_max=99;
0735
//String str_perem="TURN time";
0736
//TimeTurn= setup_menu(str_menu,perem_menu,adress_errom,perem_max,str_perem);
0737
//}
0738
0739
0740
//устанавливаем сигнализацию
0741
//void alarm_setup() {
0742
// int alarmTemp = EEPROM_int_read(106);
0743
// String str_menu = "ALARM SETUP";
0744
// int perem_menu = alarmTemp;
0745
// int adress_errom = 106;
0746
// int perem_max = 10;
0747
// String str_perem = "T.Alarm +- C";
0748
// alarmTemp = setup_menu(str_menu, perem_menu, adress_errom, perem_max, str_perem);
0749
//}
0750
0751
//устанавливаем вентиляцию
0752
//void vent_setup() {
0753
// int fanTemp = EEPROM_int_read(108);
0754
// String str_menu = "A.FAN SETUP";
0755
// int perem_menu = fanTemp;
0756
// int adress_errom = 108;
0757
// int perem_max = 40;
0758
// String str_perem = "T.Fan C";
0759
// fanTemp = setup_menu(str_menu, perem_menu, adress_errom, perem_max, str_perem);
0760
//}
0761
0762
int
setup_menu(String str_menu,
int
perem_menu,
int
adress_errom,
int
perem_max, String str_perem) {
0763
lcd.clear();
0764
delay(del);
0765
button_read();
0766
lcd.setCursor(0, 0);
0767
lcd.print(str_menu);
0768
lcd.print(
" "
);
0769
delay(1000);
0770
int
x = 0;
0771
while
(1) {
0772
x++;
0773
if
(x > interval)
break
;
0774
button_read();
0775
if
(adress_errom != 0) perem_menu = EEPROM_int_read(adress_errom);
0776
if
(!button_enter) {
0777
delay(del);
0778
lcd.clear();
//очищаем экран
0779
break
;
0780
}
0781
if
(!button_minus) {
0782
perem_menu--;
0783
if
(perem_menu < 0) perem_menu = perem_max;
0784
if
(adress_errom != 0) EEPROM_int_write(adress_errom, perem_menu);
0785
lcd.clear();
0786
readSet();
0787
}
0788
0789
if
(!button_plus) {
0790
perem_menu++;
0791
if
(perem_menu > perem_max) perem_menu = 0;
0792
if
(adress_errom != 0) EEPROM_int_write(adress_errom, perem_menu);
0793
lcd.clear();
0794
readSet();
0795
}
0796
if
(adress_errom != 0) perem_menu = EEPROM_int_read(adress_errom);
0797
0798
lcd.setCursor(0, 0);
0799
if
(str_perem ==
"bird"
) {
0800
lcd.print(
"BIRD "
);
0801
printbird(perem_menu);
0802
0803
lcd.print(
" "
);
0804
0805
}
else
{
0806
lcd.print(str_perem);
0807
lcd.print(
"= "
);
0808
lcd.print(perem_menu);
0809
lcd.print(
" "
);
0810
}
0811
lcd.setCursor(0, 1);
0812
lcd.print(
"START NEXT +1"
);
0813
delay(del);
0814
}
0815
return
perem_menu;
0816
}
0817
0818
void
printbird(
int
nbird) {
0819
switch
(nbird) {
0820
case
0:
0821
lcd.print(
"K"
);
// курица
0822
lcd.write(6);
0823
lcd.print(
"P"
);
// курица
0824
lcd.write(1);
0825
lcd.write(8);
0826
lcd.print(
"A "
);
// курица
0827
break
;
0828
case
1:
0829
lcd.write(2);
0830
lcd.print(
"EPE"
);
// перепелка
0831
lcd.write(2);
0832
lcd.print(
"E"
);
// перепелка
0833
lcd.write(3);
0834
lcd.print(
"KA "
);
// перепелка
0835
break
;
0836
case
2:
0837
lcd.write(6);
0838
lcd.print(
"TKA "
);
// утка
0839
break
;
0840
case
3:
0841
lcd.write(1);
0842
lcd.print(
"H"
);
// индоутка
0843
lcd.write(7);
0844
lcd.print(
"O"
);
// индоутка
0845
lcd.write(6);
0846
lcd.print(
"TKA "
);
// утка
0847
break
;
0848
case
4:
0849
lcd.write(5);
0850
lcd.write(6);
0851
lcd.print(
"C"
);
// гусь
0852
lcd.write(4);
0853
lcd.print(
" "
);
// гусь
0854
break
;
0855
case
5:
0856
lcd.write(1);
0857
lcd.print(
"H"
);
// индюк
0858
lcd.write(7);
0859
lcd.print(
"|OK "
);
// индюк
0860
0861
break
;
0862
}
0863
0864
}
0865
0866
0867
void
getSensors() {
0868
unsigned
long
curMillis = millis();
// Получаем текущее время работы
0869
if
(curMillis - trhMillis >= TRHSTEP) {
// время для нового измерения?
0870
temp = tempProcess(READ_TEMP);
//читаем темпратуру с далласа
0871
temp1 =
float
(temp) / 10;
0872
tempProcess(START_CONVERT);
// сразу запрос на конвертацию
0873
}
0874
0875
// Demonstrate non-blocking calls
0876
if
(curMillis - trhMillis >= TRHSTEP * 4) {
// время для нового измерения?
0877
0878
// hum = dht.readHumidity(); //получение темпрературы и влажности с DHT11
0879
// temp2 = dht.readTemperature();
0880
temp2 = si7021.readTemp();
//получение темпрературы и влажности с si7021
0881
hum = si7021.readHumidity();
0882
0883
trhMillis = curMillis;
0884
}
0885
0886
}
0887
0888
//управляем влажностью
0889
void
humidifer(
float
set_humidity) {
0890
//float humidity;
0891
0892
unsigned
long
curMillis = millis();
0893
0894
if
(curMillis >= humMillis + 2000) {
0895
// Serial.print("curMillis=");
0896
// Serial.println(curMillis);
0897
// Serial.print("humMillis=");
0898
// Serial.println(humMillis);
0899
// Serial.print("hum=");
0900
// Serial.println(hum);
0901
// Serial.print("set_humidity=");
0902
// Serial.println(set_humidity);
0903
// Serial.print("value=");
0904
// Serial.println(value);
0905
// Serial.print("pin9=");
0906
// Serial.println(digitalRead(alarm_pin));
0907
// Serial.print("pin4=");
0908
// Serial.println(digitalRead(humidifer_pin));
0909
0910
humMillis = curMillis;
0911
0912
// if (set_humidity >= hum) digitalWrite(humidifer_pin, HIGH); //сравниваем измеренную влажность с заданной
0913
// else if (set_humidity -5 < hum) digitalWrite(humidifer_pin, LOW); //если влажность низкая, включаем увлажнитель
0914
if
((hum >= set_humidity + 2) || (hum <= set_humidity - 2)) {
0915
if
((hum <= set_humidity - 2) && (value == LOW)) {
0916
value = HIGH;
0917
}
0918
if
((hum >= set_humidity + 2) && (value == HIGH)) {
0919
value = LOW;
0920
}
0921
digitalWrite(humidifer_pin, value);
0922
0923
}
0924
}
0925
0926
0927
}
0928
0929
//управляем поворотом
0930
void
turn(boolean needTurn) {
0931
wdt_disable();
// запретили как можно скорее собаку, что-бы не уйти в бесконечный ребут
0932
0933
//TurnNow
0934
int
turnPeriod = EEPROM_int_read(104);
//период поворота лотков в часах
0935
// int turnCommand;
0936
if
(turnPeriod == 0)
return
;
//если нулевой период поворота, то не поворачиваем яйца.
0937
TurnNow++;
0938
int
intTurnNow=TurnNow;
0939
if
((intTurnNow <= turnPeriod) && (intTurnNow >= 0)){
0940
EEPROM.write(120, TurnNow);
0941
}
else
{
0942
TurnNow=0;
0943
EEPROM.write(120, TurnNow);
0944
}
0945
0946
// int turnCommand = TurnNow;
0947
// currentTime = millis();
0948
// Serial.print("turnPeriod=");
0949
// Serial.println(turnPeriod);
0950
// Serial.print("TurnNow=");
0951
// Serial.println(TurnNow);
0952
// Serial.print("intTurnNow=");
0953
// Serial.println(intTurnNow);
0954
// Serial.print("needTurn=");
0955
// Serial.println(needTurn);
0956
// Serial.print("loopTime=");
0957
// Serial.println(loopTime);
0958
// Serial.println(" ");
0959
0960
if
((needTurn ==
true
) && (turnPeriod==intTurnNow)) {
0961
0962
lcd.clear();
0963
lcd.setCursor(3, 0);
0964
lcd.write(2);
0965
lcd.print(
"EPEBOPOT"
);
//
0966
0967
_step=- _step;
0968
for
(
int
k = 0; k <2038; k++) {
//4076 на полный оборот передаточное число 63.68395:1
0969
phase += _step;
0970
if
(phase > 7) phase = 0;
0971
if
(phase < 0) phase = 7;
0972
0973
for
(
int
i = 0; i < 4; i++) {
0974
digitalWrite(pins[i], ((motorPhases[phase][i] == 1) ? HIGH : LOW));
0975
}
0976
// Пауза на вращение на один полушаг
0977
delayMicroseconds(10000);
// максимум 20000 мин 1000
0978
// wdt_reset();
0979
}
0980
for
(
int
i = 0; i < 4; i++) {
//чтобы шаговик не грелся лишнего
0981
digitalWrite(pins[i], LOW);
0982
}
0983
0984
// loopTime = currentTime; // в loopTime записываем новое значение
0985
// }
0986
// }
0987
}
0988
wdt_enable(WDTO_8S);
// активировали таймер, каждые 8 секунд его нужно сбрасывать
0989
0990
}
0991
0992
//управляем авариями
0993
void
alarm(
float
needTemp) {
0994
int
alarmTemp = EEPROM_int_read(106);
0995
if
(temp1 > 39.5) {
//|| temp1 < (needTemp - alarmTemp)
0996
// beeper(10);
0997
digitalWrite(alarm_pin, LOW);
//если измеренная температура выше заданной на величину аварии
0998
}
0999
else
digitalWrite(alarm_pin, HIGH);
//то включаем аварийный сигнал.
1000
1001
}
1002
1003
//void beeper(int duration) {
1004
// tone(beeper_pin, 2000, duration);
1005
//}
1006
1007
1008
//управляем вентиляторами
1009
void
fan(
int
fanTime) {
1010
int
fanTemp = EEPROM_int_read(108);
1011
if
((chas == 7 && minut < fanTime) || (chas == 19 && minut < fanTime) || (temp1 > 39.5)) {
//fanTemp=395
1012
// digitalWrite( fan_pin, LOW);
1013
// fanFlag = 1;
1014
1015
//если наступило время проветривания или измеренная температура выше заданной на величину авариито включаем продувку.
1016
// digitalWrite(extend_heater_pin, HIGH); // при этом отключаем обогрев
1017
// digitalWrite(heater_pin, LOW);
1018
hotFlag1 = 1;
1019
// hotFlag2 = 1;
1020
}
1021
else
{
1022
// fanFlag = 0;
1023
hotFlag1 = 0;
1024
}
1025
1026
//digitalWrite(fan_pin, HIGH); //иначе выключаем.
1027
1028
// hotFlag1 = 1;
1029
// hotFlag2 = 1;
1030
//
1031
1032
}
1033
1034
// вольтметр
1035
//void voltmeter() {
1036
// float outputValue = 0;
1037
// outputValue = float(analogRead(voltmeter_pin)) / 63, 9;
1038
// //if(outputValue < 4.5) beeper(50);
1039
// //Serial.print("Voltage = " );
1040
// //Serial.println(outputValue);
1041
// lcd.setCursor(14, 3);
1042
// lcd.print("V");
1043
// lcd.print(outputValue, 1);
1044
//}
1045
//
1046
//// Печать мощности нагрвателя
1047
//void outpuPower() {
1048
// lcd.setCursor(14, 3);
1049
// lcd.print("W");
1050
// lcd.print(Output, 0);
1051
// lcd.print(" ");
1052
//}
1053
1054
1055
//==============================
1056
int
tempProcess(boolean ch) {
1057
int
t = 0;
1058
if
(!ch) {
1059
ds.reset();
1060
ds.write(0xCC);
1061
ds.write(0x44);
1062
}
1063
else
{
1064
ds.reset();
1065
ds.write(0xCC);
1066
ds.write(0xBE);
1067
t = ds.read();
1068
t = t | (ds.read() << 8);
1069
//return t>>4;//целые *C, десятые отброшены
1070
//return (t+8)>>4;//целые *С с округлением
1071
return
(t * 10) >> 4;
//целое в десятых *C (214=>21,4*C)
1072
}
1073
}
1074
// чтение
1075
int
EEPROM_int_read(
int
addr) {
1076
byte
raw[2];
1077
for
(
byte
i = 0; i < 2; i++) raw[i] = EEPROM.read(addr + i);
1078
int
&num = (
int
&)raw;
1079
return
num;
1080
}
1081
1082
// запись
1083
void
EEPROM_int_write(
int
addr,
int
num) {
1084
byte
raw[2];
1085
(
int
&)raw = num;
1086
for
(
byte
i = 0; i < 2; i++) EEPROM.write(addr + i, raw[i]);
1087
}
1088
//пример int
1089
//// запись
1090
//EEPROM_int_write(12, 1000); // адрес 12 (+2 байта)
1091
//EEPROM_int_write(14, 2000); // адрес 14 (+2 байта)
1092
//EEPROM_int_write(16, 3000); // адрес 16 (+2 байта)
1093
//// чтение
1094
//int d = EEPROM_int_read(12);
1095
//int e = EEPROM_int_read(14);
1096
//int f = EEPROM_int_read(16);
Здравствуйте, где скачать библиотеку ?
#include <avr/wdt.h>
Эту не надо качать - системная!
Эту не надо качать - системная!
Спасибо .
Замечательный проект! Спасибо за работу. Единственное чего нехватает, так это номинала элементов. В остальном 5+!
Всё, разобрался. Толька не совсем понял чё за микруха к шаговику идет. Если ULN2003APG, тогда 4 и 5 нужно местами поменять. Верно?
И ещё вопрос. Почему DHT11 (22) и DS18B20 на одном 11 пине?
В общем я так понимаю, мне никто не ответит...
Но всё же. Уважаемые, подскажите, почкму дисплей по I2C не хочет работать? Показывает кубики. Хотел освободить пины которые задействованы на дисплей, но чёт бред выходит.
В общем я так понимаю, мне никто не ответит...
Но всё же. Уважаемые, подскажите, почкму дисплей по I2C не хочет работать? Показывает кубики. Хотел освободить пины которые задействованы на дисплей, но чёт бред выходит.
Сканер I2C, что показывает? Пока не получите адреса всех подключенных внешних устройств через их протоколы, нахрена скетч основной заливать? Или считаете себя джедаем проводов?
У дисплея стандартный (0x27, 16, 2). Много где именно его ставил.
Скеч без изменений не устраивает из-за того что я не вкуриваю как поставить DHT11 и DS18B20, так как они оба на 11 пин подключаются. Этож бред? А больше свободных пинов нема.
Или я в чём то ошибаюсь?
Действительно на одном пине. Логика - DHT измеритель влажности и температуры, ДС-ка не нужна.
По дисплею, если действительно работает, попробуйте со своей библиотекой (их хренова гора) запустить только отображение информации из скетча ТС (закомментить все лишнее), возможно используются другие методы, тогда сравнивать с примерами из вашей библы и корректировать в скетче.
Действительно на одном пине. Логика - DHT измеритель влажности и температуры, ДС-ка не нужна.
По дисплею, если действительно работает, попробуйте со своей библиотекой (их хренова гора) запустить только отображение информации из скетча ТС (закомментить все лишнее), возможно используются другие методы, тогда сравнивать с примерами из вашей библы и корректировать в скетче.
P/S DHT, не лучшее решение для инкубатора. Весьма брехливый показометр, а на инкубационных значениях влажности тем более. Лучше потратьте денег и посмотрите на что то вроде SHT** или как у ТС.
Других нету в наличие, а ждать долго.
Спасибо за разъяснения! В таком случае не вижу смысла подключать дисплей по I2C.
Ещё раз спасибо!!!
Сезон вроде закончился, а вы тут шумите!
Та ладно, у меня круглогодичный с интервалом в три недели (перепелки).
Других нету в наличие, а ждать долго.
Спасибо за разъяснения! В таком случае не вижу смысла подключать дисплей по I2C.
Ещё раз спасибо!!!
SHT10, брал здесь. Не реклама, хотя регулярно к ним ныряю.
Дорого же.
У нас htu21 и то дешевле http://u-m.biz/shop/index.php?route=product/product&path=63&product_id=88
У меня SHT в корейцах стоят, так что для меня вариантов не было.
Так это клон sht21, он лучше sht10. Плюс плата со стабом уже и согласование уровней, а не голый датчик без платы. Впрочем кому и dht11 датчик :)
Там же место штатное + плата-переходник. Не стал влезать в конструкцию, работает и хорошо.
Нихрена у них цены!!! Не, я думаю, что +-5% влажности так сильно погоду не сделают. Так что по мне лучше связка DHT и DS.
Тогда зачем связка, калибруйте температуру и влажность DHT в требуемом диапазоне и пользуйтесь им.
Сломается ваш dht в инкубаторе. Проходили. Да и показывает он погоду на соседней улице. Запаритесь калибровать.
Тогда зачем связка, калибруйте температуру и влажность DHT в требуемом диапазоне и пользуйтесь им.
Я сказал только про влажность. А вот на счет температуры, знающие люди говорят, что каждая десятка важна.
Ну и пускай. Главное если получится хотябы 2-3 выводка сделать, и на этом хорошо. Пока нормальные запчастили жду из "поднебесной".
Ну и пускай. Главное если получится хотябы 2-3 выводка сделать, и на этом хорошо. Пока нормальные запчастили жду из "поднебесной".
Всем привет, отсутсвовал по случаю поступления моего сына в Питере в мед.университет на бютжет, можете поздравлять. извиняюсь за оффтоп.
Лёвчег, советую прислушаться к советам Романа (Umka) и не использовать DTH11, я просто их сдуру купил пять штук, надо же было куда-то использовать, потом все равно заменил все на Si7021.
Всем привет, отсутсвовал по случаю поступления моего сына в Питере в мед.университет на бютжет, можете поздравлять. извиняюсь за оффтоп.
Примите мои поздравления за сына! Удачи ему в учёбе!!!
Лёвчег, советую прислушаться к советам Романа (Umka) и не использовать DTH11, я просто их сдуру купил пять штук, надо же было куда-то использовать, потом все равно заменил все на Si7021.
Да я тоже потом заменю, просто в данный момент нет других, а ждать из китая долго. Про покупку у нас вообще молчу, цены конские, да и срок доставки не на много меньше!
А инкубатор срочно собрать нужно. Родственники обещают к концу недели 5 десятков перепилинных яиц подогнать за так.
Примите мои поздравления за сына! Удачи ему в учёбе!!!
Спасибо!
Да я тоже потом заменю, просто в данный момент нет других, а ждать из китая долго. Про покупку у нас вообще молчу, цены конские, да и срок доставки не на много меньше!
А инкубатор срочно собрать нужно. Родственники обещают к концу недели 5 десятков перепилинных яиц подогнать за так.
Практика показывает, в этом деле торопиться не стоит, нужно собрать и "погонять" инкубатор, проверить температуру и влажность, если надо откалибровать, У меня Далласы на 0,7 градуса из одной партии врут.
С возвращением lean_74
С возвращением lean_74
Рома, привет! С телефона не совсем удобно, завтра на форуме пообщаемся.
[/quote]
Практика показывает, в этом деле торопиться не стоит, нужно собрать и "погонять" инкубатор, проверить температуру и влажность, если надо откалибровать, У меня Далласы на 0,7 градуса из одной партии врут.
[/quote]
Как калибровать? Точных измерителей нет. Остаётся надеяться)
Как калибровать? Точных измерителей нет. Остаётся надеяться)
Ректально :) Вполне точный вариант. Ради науки так сказать...
А вообще 0,3 туда-сюда это вообще не важно. Поверьте. Я уже много десятков тысяч вывел.
Как калибровать? Точных измерителей нет. Остаётся надеяться)
Ректально :) Вполне точный вариант. Ради науки так сказать...
Та ладно, запугаешь человека.)))) Левчег, подмышку его, подмышку.
Ну там же смайлик.
А я вот очередные 300 яиц достал в выводной шкаф. Наклюнутых много. Электрики в начале месяца активно светом баловались. По 20 часов не было. Дизель выручал. Ну, посмотрим что вылупится.
Левчег, подмышку его, подмышку.
Гениально!!! Спасибо)