включение света и насоса на определенное время.

DENchick
DENchick аватар
Offline
Зарегистрирован: 29.01.2016

доброго времени суток . 

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

алгоритм работы:

влажность падает ниже определенного значения (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);
}

 

DENchick
DENchick аватар
Offline
Зарегистрирован: 29.01.2016
#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);
}

 

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

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

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

Время считать можно по разному. Правильный и более точный вариант на таймере, реализация описывалась и обсуждалась многократно на этом форуме. Простой, не точный вариант, создать счетчик, который будет увеличиваться с каждым проходом на 1, В Вашем скетче один оборот Loop происходит более чем 3 секунды, примерно посчитать и замерить опытным путем не составит труда. Тем более думаю что абсолютно не важно ровно два часа будет свет гореть или +-5-10 минут. При старте программы счетчик устанавливаете в ноль, при достижении нужного значения считанного с фоторезистора включаете свет и начинаете инкрементировать счетчик, по достижении определенного значения счетчика свет выключаете и обнуляете счетчик. Далее ждете следующее срабатывания условия значения фоторезистора и опять все по кругу.

Вообще, вариантов масса, это просто один из способов решения задачи, а так, Ваша фантазия Вам в руки. :)

DENchick
DENchick аватар
Offline
Зарегистрирован: 29.01.2016

спасибо большое за равернутый ответ. нашел в сети только это но думаю что не оно

 https://sites.google.com/site/vanyambauseslinux/arduino/tajmery-sceetciki-arduino немогли бы вы написть кусочек скетча для образца.

bwn
Offline
Зарегистрирован: 25.08.2014

Ну а зачем в данном-конкретном случае так усложнять? Юзаем старую бабушку millis().  Да и первый интервал на ней же. Проблема пропадания питания остается.

DENchick
DENchick аватар
Offline
Зарегистрирован: 29.01.2016

Спасибо большое буду дальше думать как это всё записать, это первый скетч который я пишу поэтому очень много вопросов.

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Тут все давно есть, просто нужно воспользоваться формой поиска в верхнем, правом углу.

Первое, второе, третье и много еще чего есть.

DENchick
DENchick аватар
Offline
Зарегистрирован: 29.01.2016

Очень благодарен вам за ответы и помощь.)

DENchick
DENchick аватар
Offline
Зарегистрирован: 29.01.2016

Просто когда не знаешь что искать, не особо найдёшь.

bwn
Offline
Зарегистрирован: 25.08.2014

А вы по всему форуму последовательно глазами пробегитесь. И скорее найдете, чем нет, требуемое вам. Чего здесь только не обсуждалось)))). Еще и идей возможно нахватаетесь.))))

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

DENchick пишет:

... как реализовать со светом ума не приложу (((.

помогите пожалуйста..

Привет. Фоторезистор купили? чем мерять освещенность будете?

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

--Нужна ардуина

--хороший датчик влажности почвы самодельный из двух угольных стержней.

--фоторезистор

--два реле для включения полива и света.

--источник питания для дуины и реле.

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

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Вот парень сделал отличные электроды https://youtu.be/eKz8a6yCfaU

Да и устройство у него получилось просто отличное!!! Рекомендую посмотреть.

DENchick
DENchick аватар
Offline
Зарегистрирован: 29.01.2016

датчик влажности  у меня такой же ) ,фоторезистор есть диплей тоже , единственное не знаю как часы програмные прикрутить в программировании полный ноль.

bwn
Offline
Зарегистрирован: 25.08.2014

DENchick пишет:

датчик влажности  у меня такой же ) ,фоторезистор есть диплей тоже , единственное не знаю как часы програмные прикрутить в программировании полный ноль.

Ну зачем они тебе? Возьми модуль на DS3231 и не ломай голову. А выставлять после каждого сбоя по новой? Да и точность у программных та еще.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

по ссылкам часов прошлись что вам накидали?

Что не понятно пишите, допилить ваш скетч дело не хитрое да только это "медвежья услуга"

DENchick
DENchick аватар
Offline
Зарегистрирован: 29.01.2016

в нашей глуши не продаются, заказывать долго .да и точность +- 10 минут мне за глаза.

bwn
Offline
Зарегистрирован: 25.08.2014

DENchick пишет:

в нашей глуши не продаются, заказывать долго .да и точность +- 10 минут мне за глаза.

Вам решать.))))

DENchick
DENchick аватар
Offline
Зарегистрирован: 29.01.2016

до сюда я дорался )) а прикрутить таймер или что-то в этом роде не хватает ума (.

#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);
}

 

DENchick
DENchick аватар
Offline
Зарегистрирован: 29.01.2016

bodriy2014 пишет:

по ссылкам часов прошлись что вам накидали?

Что не понятно пишите, допилить ваш скетч дело не хитрое да только это "медвежья услуга"

да прочитал все но все равно не понял как это к моему делу прикрутить.

#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();
  }
}  

}

 

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Ну наскоряк как то так например можно с лампой поступить:

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); //Гасим  лампу, ее время истекло
  
  }
}

 

DENchick
DENchick аватар
Offline
Зарегистрирован: 29.01.2016

да сложновато сам бы точно не допетрил ((. спасибо

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

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

DENchick
DENchick аватар
Offline
Зарегистрирован: 29.01.2016

Алгоритм я составил а вот для выполнения знаний не хватает.

bwn
Offline
Зарегистрирован: 25.08.2014

DENchick пишет:
Алгоритм я составил а вот для выполнения знаний не хватает.

Так раздел в помощь. Там операторов три десятка. Ваши шаги по алгоритму переводите в команды. Или алгоритм выглядит - я хочу.)))))

DENchick
DENchick аватар
Offline
Зарегистрирован: 29.01.2016

Так и делаю) уже есть первые результаты сейчас испытываю.