247

Теплица на Ардуино-Мега. Часть 6.

Серия "Умная" теплица на Ардуино-Мега

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

Теперь расскажу об автоматическом поливе. Его конструкция в моей теплице выглядит примерно так:

Из большого бака раз в день в определенное время ( настраивается с помощью меню ) вода наливается в бак, расположенный в теплице, с помощью насоса. В моем случае в 10-00. Количество воды определяется срабатыванием поплавкового датчика. На всякий случай через меню можно настроить предельное время работы насоса ( защита от несработки датчика. Итак, вода налилась:

После этого вода в баке весь день греется в теплице, в которой тепло. А вечером, у меня настроено в 19-00, насос включатся на 40 секунд, вода переливается и уже самотеком, по закону сообщающихся сосудов, выливается на грядку:

Как я настраивал автополив можно посмотреть на Youtube.
Электрическую схему теплицы можно посмотреть в предыдущих постах, а вот скетч пришлось переделать. Время для работы насоса, достаточное для того, чтобы вода перелилась и начался полив, составляет 40 секунд. Я, недолго думая, написал:

digitalWrite (ReleNasos_2,0); // Включаем насос
delay (Parametr[2]*1000); // где Parametr[2] - это время в секундах, настраиваемое с  //помощью меню.
digitalWrite (ReleNasos_2,1); // Насос отключить

Однако оказалось, что если настраиваем 15 секунд, все работает нормально, а если 40, то программа останавливается на этом delay навсегда. Так и не разобрался, почему. Не подскажете начинающему? Переписал таким образом:

digitalWrite (ReleNasos_2,0); // Включаем насос
for (int Poliv_delay = 0; Poliv_delay<=Parametr[2]; Poliv_delay++)
{
delay (1000);
}
digitalWrite (ReleNasos_2,1); // Насос отключить

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

Arduino & Pi

1.5K постов20.9K подписчиков

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу

Вы смотрите срез комментариев. Показать все
10
DELETED
Автор поста оценил этот комментарий
Пробуй:

delay(Patametr[2] * 1000L);

Умножая два int16 числа 40 и 1000 ты получаешь отрицательное число, которое в функции delay становится очень большим положительным.

А вообще, используй timer1 и прерывания или delay в цикле как ты делаешь. Также научись пользоваться отладчиком. Решает много проблем.
раскрыть ветку (6)
14
Автор поста оценил этот комментарий
Умножая два int16 числа 40 и 1000 ты получаешь отрицательное число, которое в функции delay становится очень большим положительным.

Вот в чем проблема. Гуглил-гуглил - ничего не нашел, почему отрицательное. Я же потом написал на каждый чих функции полива Serial.print и увидел, что

Serial.print(Patametr[2] * 1000)

Выдает отрицательное число, что-то -20 с чем-то тысяч. Поищу почему. Именно после этого переписал код. А вообще смешно, притащил в теплицу столик со стулом, закрыл дверь (на улице-то снег идет) и сидел, искал причину. Ну ничего, теперь все работает.  Жена рассмеялась, потом пришла, сфотографировала:

Иллюстрация к комментарию
раскрыть ветку (4)
16
DELETED
Автор поста оценил этот комментарий
Поищу почему

Дело в компиляторе. Он считает что ты множишь 2 int16 числа. Но int16 ограничивается 32767. Поэтому происходит переполнение и ты вместо ожидаемых 40000 получаешь -25536.


После чего это число передается как аргумент в функцию delay, которая в качестве аргумента принимает uint64. Поскольку uint64 беззнаковое, отрицательным быть не может, то опять происходит переполнение и вместо ожидаемых 40000 миллисекунд ты получаешь 18446744073709544384. Можно подождать 584942417 лет и ты увидишь что твоя программа не зависла на самом деле.

раскрыть ветку (1)
3
Автор поста оценил этот комментарий

Спасибо, точно так и есть. Я еще поискать не успел, как Ваш ответ прочитал. Теперь все понятно.

4
Автор поста оценил этот комментарий
Выдает отрицательное число, что-то -20 с чем-то тысяч. Поищу почему
Гугли: переполнение переменной или буфера
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Спасибо!

0
Автор поста оценил этот комментарий

Каким отладчиком пользуетесь?

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества