включение света и насоса на определенное время.
- Войдите на сайт для отправки комментариев
Пнд, 01/02/2016 - 02:46
доброго времени суток .
пытаюсь сделать автополив цветка на ардуино, но возникли затруднения с включением на заданное время без модуля реального времени,по датчикам (фоторезистор и датчик влажности почвы самодельный из двух угольных стержней от мизинчиковых батареек).
алгоритм работы:
влажность падает ниже определенного значения (550) насос включается на 10 секунд задержка 1 минуту ,думаю что через "delay" если значение ниже повтор ный полив.
свет. тут все гораздо сложнее если значение ниже порога должен включиться свет на два часа, отключиться и ждать часов 10-12 (до утра) как реализовать со светом ума не приложу (((.
помогите пожалуйста.
#include <LiquidCrystal.h>
int vlaznostcellPin = 8; // сенсор и понижающий резистор на 10 кОм подключены к a8
int vlaznostcellReading; // данные считываемые с аналогового пина
int photocellPin=7; // сенсор и понижающий резистор на 10 кОм подключены к a7
int photocellReading;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup(void) {
Serial.begin(9600);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
}
void loop(void)
{
vlaznostcellReading = analogRead(vlaznostcellPin);
photocellReading= analogRead(photocellPin);
lcd.begin(16, 2);
lcd.print("VLAZNOST`= ");
lcd.println(vlaznostcellReading);
lcd.setCursor(0, 1);
lcd.print("SVET = " );
lcd.println(photocellReading);
Serial.print("vlaznost`= ");
Serial.println(vlaznostcellReading);// аналоговые значения
Serial.print("svet=");
Serial.println(photocellReading);
delay(5000);
}
#include <LiquidCrystal.h> int vlaznostcellPin = 15; // сенсор и понижающий резистор на 10 кОм подключены к a0 int vlaznostcellReading; // данные считываемые с аналогового пина int photocellPin=14; int photocellReading; int Relayvlaznost = 26; int Relaysvet = 24; LiquidCrystal lcd(8, 9, 4, 5, 6, 7); void setup(void) { Serial.begin(9600); LiquidCrystal lcd(8, 9, 4, 5, 6, 7); pinMode(Relayvlaznost, OUTPUT); pinMode(Relaysvet, OUTPUT); } void loop(void) { vlaznostcellReading = analogRead(vlaznostcellPin); photocellReading= analogRead(photocellPin); lcd.begin(16, 2); lcd.print("VLAZNOST`= "); lcd.println(vlaznostcellReading); lcd.setCursor(0, 1); lcd.print("SVET = " ); lcd.println(photocellReading); Serial.print("vlaznost`= "); Serial.println(vlaznostcellReading);// аналоговые значения Serial.print("svet="); Serial.println(photocellReading); if (analogRead(photocellPin) < 400) digitalWrite(Relaysvet, HIGH); else digitalWrite(Relaysvet, LOW); if (analogRead(vlaznostcellPin) < 600) digitalWrite(Relayvlaznost, HIGH); else digitalWrite(Relayvlaznost, LOW); delay(3000); }Без модуля реального времени придется программно реализовывать часы, делать схему резервного питания, контролировать наличие питания, при пропадании питания, переходить на резервное, сохрянять насройки текущего времени в еепром, продолжать считать время и корректировать текущее время в еепром. Но если питание будет отсутсвовать слишком долго, есть вероятность потерять какой то временной интервал. То есть запустится система, прочитает текущее время из еепром и начент с ним работать, а сдвиг может оказаться довольно большим и скорректировать его удасться только в ручную. Думаю проще все же приобрести модуль часов, стоят они копейки и работают от батарейки очень длительное время, да и ресурсы конртоллера не будут использовать.
А без часов можно только так, как Вы и предложили. Поливать по мере высыхания почвы до определенного значения, в определенном обьеме. Свет включать только по значениям фоторезистора на определенный промежуток времени.
Время считать можно по разному. Правильный и более точный вариант на таймере, реализация описывалась и обсуждалась многократно на этом форуме. Простой, не точный вариант, создать счетчик, который будет увеличиваться с каждым проходом на 1, В Вашем скетче один оборот Loop происходит более чем 3 секунды, примерно посчитать и замерить опытным путем не составит труда. Тем более думаю что абсолютно не важно ровно два часа будет свет гореть или +-5-10 минут. При старте программы счетчик устанавливаете в ноль, при достижении нужного значения считанного с фоторезистора включаете свет и начинаете инкрементировать счетчик, по достижении определенного значения счетчика свет выключаете и обнуляете счетчик. Далее ждете следующее срабатывания условия значения фоторезистора и опять все по кругу.
Вообще, вариантов масса, это просто один из способов решения задачи, а так, Ваша фантазия Вам в руки. :)
спасибо большое за равернутый ответ. нашел в сети только это но думаю что не оно
https://sites.google.com/site/vanyambauseslinux/arduino/tajmery-sceetciki-arduino немогли бы вы написть кусочек скетча для образца.
Ну а зачем в данном-конкретном случае так усложнять? Юзаем старую бабушку millis(). Да и первый интервал на ней же. Проблема пропадания питания остается.
Спасибо большое буду дальше думать как это всё записать, это первый скетч который я пишу поэтому очень много вопросов.
Тут все давно есть, просто нужно воспользоваться формой поиска в верхнем, правом углу.
Первое, второе, третье и много еще чего есть.
Очень благодарен вам за ответы и помощь.)
Просто когда не знаешь что искать, не особо найдёшь.
А вы по всему форуму последовательно глазами пробегитесь. И скорее найдете, чем нет, требуемое вам. Чего здесь только не обсуждалось)))). Еще и идей возможно нахватаетесь.))))
... как реализовать со светом ума не приложу (((.
помогите пожалуйста..
Привет. Фоторезистор купили? чем мерять освещенность будете?
Если чисто отсчитывать минуту потом два час и потом восемь часов до утра. То точность особо не нужна можно и программные часы прописать.
--Нужна ардуина
--хороший датчик влажности почвы самодельный из двух угольных стержней.
--фоторезистор
--два реле для включения полива и света.
--источник питания для дуины и реле.
--дисплей не обязательно, но можно выводить влажность и отсчет времени.
Вот парень сделал отличные электроды https://youtu.be/eKz8a6yCfaU
Да и устройство у него получилось просто отличное!!! Рекомендую посмотреть.
датчик влажности у меня такой же ) ,фоторезистор есть диплей тоже , единственное не знаю как часы програмные прикрутить в программировании полный ноль.
Ну зачем они тебе? Возьми модуль на DS3231 и не ломай голову. А выставлять после каждого сбоя по новой? Да и точность у программных та еще.
по ссылкам часов прошлись что вам накидали?
Что не понятно пишите, допилить ваш скетч дело не хитрое да только это "медвежья услуга"
в нашей глуши не продаются, заказывать долго .да и точность +- 10 минут мне за глаза.
в нашей глуши не продаются, заказывать долго .да и точность +- 10 минут мне за глаза.
Вам решать.))))
до сюда я дорался )) а прикрутить таймер или что-то в этом роде не хватает ума (.
#include <LiquidCrystal.h> int vlaznostcellPin = 15; // сенсор и понижающий резистор на 10 кОм подключены к a0 int vlaznostcellReading; // данные считываемые с аналогового пина int photocellPin=14; int photocellReading; int Relayvlaznost = 26; int Relaysvet = 24; LiquidCrystal lcd(8, 9, 4, 5, 6, 7); void setup(void) { Serial.begin(9600); LiquidCrystal lcd(8, 9, 4, 5, 6, 7); pinMode(Relayvlaznost, OUTPUT); pinMode(Relaysvet, OUTPUT); } void loop(void) { vlaznostcellReading = analogRead(vlaznostcellPin); photocellReading= analogRead(photocellPin); lcd.begin(16, 2); lcd.print("VLAZNOST`= "); lcd.println(vlaznostcellReading); lcd.setCursor(0, 1); lcd.print("SVET = " ); lcd.println(photocellReading); Serial.print("vlaznost`= "); Serial.println(vlaznostcellReading);// аналоговые значения Serial.print("svet="); Serial.println(photocellReading); if (analogRead(photocellPin) < 400) digitalWrite(Relaysvet, HIGH); else digitalWrite(Relaysvet, LOW); if (analogRead(vlaznostcellPin) < 600) digitalWrite(Relayvlaznost, HIGH); else digitalWrite(Relayvlaznost, LOW); delay(3000); }по ссылкам часов прошлись что вам накидали?
Что не понятно пишите, допилить ваш скетч дело не хитрое да только это "медвежья услуга"
#define relay 6 void setup() { Serial.begin(9600); pinMode(relay, OUTPUT); } void loop() { static bool state; if(digitalRead(2)==LOW) { digitalWrite(relay, LOW); } else(digitalRead(2)==HIGH); { static unsigned long time; if((millis() - time) > (state ? 1000 : 3000)) { state = !state; digitalWrite(relay, state); time = millis(); } } }Ну наскоряк как то так например можно с лампой поступить:
int Relaysvet = 24; int photocellPin=14; volatile boolean Status_Lamp_Flag = false; //Флаг "Лампа горела(была включена)" unsigned long StartMillis = 0; // Начальный временной интервал const long interval = 7200000; // Интервал времени которое будет включена лампа (milliseconds) 2 часа = 120 минут = 7200 секунд = 7200000 миллисекунд void setup() { pinMode(Relaysvet, OUTPUT); digitalWrite(Relaysvet, LOW); } void loop() { if (analogRead(photocellPin) < 400 && Status_Lamp_Flag == false) // Если темно и флаг лампы сброшен { unsigned long StartMillis = millis(); // Запоминиаем текущее время digitalWrite(Relaysvet, HIGH); // Включаем лампу Status_Lamp_Flag= true; //Устанавливаем Флаг "Лампа горела(была включена)" } if (analogRead(photocellPin) > 400 && Status_Lamp_Flag == true) //Если стало светло и Флаг "Лампа горела(была включена)" установлен { Status_Lamp_Flag= false; // Сбрасываем Флаг "Лампа горела(была включена)" } if( millis() - StartMillis >= interval) // Как только разность текущего значения времени и сохраненного времени старта превысит заданный интервал { digitalWrite(Relaysvet, LOW); //Гасим лампу, ее время истекло } }да сложновато сам бы точно не допетрил ((. спасибо
Важно, правильно составить алгоритм работы программы, а само программирование - это просто механическое выполнение определённых операций и не более того. Правда у каждого человека своё видение и способы решения, потому и говорю, все зависит от фантазии человека.
Алгоритм я составил а вот для выполнения знаний не хватает.
Так раздел в помощь. Там операторов три десятка. Ваши шаги по алгоритму переводите в команды. Или алгоритм выглядит - я хочу.)))))
Так и делаю) уже есть первые результаты сейчас испытываю.