Поливалка. Работает. Есть пара вопросов, кто опытный, помогите, пожалуйста.

grey72
Offline
Зарегистрирован: 30.01.2017

День добрый всем!

прошу Вашей консультации по двум вопросам. Если коротенько... В прошлом году сделал полив теплиц автоматом на 555 таймерах, работало весь сезон, урожай фантастический, жена в восторге, выдала спич"хочу все чтобы так поливалось". Пришлось срочно осваивать контроллеры. Что было надо:

1. Полив утром 8+ грядок по очереди, две теплицы поливаются всегда, остальные по датчику влажности.

2. минимальное меню, только набор времени полива

3. после старта дисплей гаснет и не включается до сброса.

Нагло спер у  wgaint код таймера в обратную сторону и на его основе сляпал свой код, в качестве дисплея выступает ТМ1638 - знатная штука с 8 кнопками и 2 7-ми сегментными индикаторами. Так как я новичок, стаж мой всего 2 месяца, получится то все вроде получилось. Однако есть пара вопросов к асам. Если не трудно, прошу Вас просветить)). Есть два вопроса:

1. Как быстро переполнится таймер контроллера при круглосуточном использованиии устройства?

2. Как сделать повторный опрос датчика света? У меня выполняется цикл do....while , после выхода из цикла нужно сделать паузу в секунду и вновь опросить датчик. Если условие верно, то включается полив, если нет, то нужно вновь вернутся в цикл do....while и снова ждать. Головой понимаю, как сделать, но не получается(( Просьба сильно не пинать, я только учусь). Заранее спасибо!

//система автополива на 8 грядок, первые две без, а все остальные с датчиком дождя
//устанавливается один раз с записью в епром, чтобы поменять время полива надо нажать кнопку сброс и вновь выставить 
//время полива на нужном реле поливается утром, раз в сутки.
#include <EEPROM.h>
#include <InvertedTM1638.h>
#include <TM1638.h>
#include <TM1638QYF.h>
#include <TM1640.h>
#include <TM16XX.h>
#include <TM16XXFonts.h>
#include <TM1638.h>
// define a module on data pin 8, clock pin 9 and strobe pin 7
TM1638 module(8, 9, 7);
#define irm     A1 //датчик влажности
#define pwr     2 //датчик влажности power
#define light   A0 //датчик света
#define irrig1  12 //полив реле 1
#define irrig2  13 //полив реле 2
#define irrig3  11
#define irrig4  10
#define irrig5  3
#define irrig6  4
#define irrig7  5
#define irrig8  6
unsigned long startTime; //время начала
unsigned long loopTime; //время прошло
unsigned long LimitTime = 0; //таймер
int h=1;//номер реле
int m=1;//количество минут
int s=0;
int x;
int val;
boolean running = false; //Флаг Запуска отсчета
void setup(){
  //установим режимы работы выходов и входов
  pinMode(irrig1,OUTPUT); 
  pinMode(irrig2,OUTPUT); 
  pinMode(irrig3,OUTPUT); 
  pinMode(irrig4,OUTPUT); 
  pinMode(irrig5,OUTPUT); 
  pinMode(irrig6,OUTPUT); 
  pinMode(irrig7,OUTPUT); 
  pinMode(irrig8,OUTPUT); 
  pinMode(pwr,OUTPUT); 
  pinMode(light,INPUT); 
  pinMode(irm,INPUT); 
  digitalWrite (irrig1,HIGH);
  digitalWrite (irrig2,HIGH);
  digitalWrite (irrig3,HIGH);
  digitalWrite (irrig4,HIGH);
  digitalWrite (irrig5,HIGH);
  digitalWrite (irrig6,HIGH);
  digitalWrite (irrig7,HIGH);
  digitalWrite (irrig8,HIGH);
  digitalWrite (pwr,HIGH);
EEPROM.write(1,1); 
EEPROM.write(2,1);
EEPROM.write(3,1);
EEPROM.write(4,1);
EEPROM.write(5,1);
EEPROM.write(6,1);
EEPROM.write(7,1);
EEPROM.write(8,1);
  module.setupDisplay(true, 1);
  module.setLEDs(0x0000);  // тушим свет
  module.clearDisplay();
  //приветствие на 3 сек
  module.setDisplayToString("HELLO");
  delay(3000);
} 

void loop() {
if (running == true){ 
  module.setLEDs(0x0000);  // тушим свет
  module.clearDisplay();
  running = false;
    do {
    val = analogRead (light);//ждем день
  }
  while (val < 600);
  delay (1000);
  running = true;
}
 if (running == true){   
  startTime = millis();
  h = 1;
  m = EEPROM.read (1);
  LimitTime =  m*60000;
  digitalWrite (irrig1,LOW);
  while(loopTime < LimitTime){    // сравниваем время прошло с вр окончания  
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; //вычисляем сколько времени прошло
   }
 running = false;//окончание работы таймера 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig1,HIGH);
    delay (1000);
    running = true;
 }
   if (running == true) {   
  startTime = millis();
  h = 2;
  m = EEPROM.read (2);
  LimitTime =  m*60000;
  digitalWrite (irrig2,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false; 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig2,HIGH);
    digitalWrite (pwr,LOW);//включаем питание датчика влаги(реле)
    delay (1000);
    running = true;
   }
   if (running == true && analogRead (irm)>220) {   //таймер запущен и датчик дождя сухой
  startTime = millis();
  digitalWrite (pwr,HIGH);//выключаем питание датчика влаги(реле)
  h = 3;
  m = EEPROM.read (3);
  LimitTime =  m*60000;
  digitalWrite (irrig3,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false; 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig3,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
   }
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 4;
  m = EEPROM.read (4);
  LimitTime =  m*60000;
  digitalWrite (irrig4,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false;
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig4,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
    
}
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 5;
  m = EEPROM.read (5);
  LimitTime =  m*60000;
  digitalWrite (irrig5,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false;
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig5,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
    
}
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 6;
  m = EEPROM.read (6);
  LimitTime =  m*60000;
  digitalWrite (irrig6,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false; 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig6,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
    
}
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 7;
  m = EEPROM.read (7);
  LimitTime =  m*60000;
  digitalWrite (irrig7,LOW);
  while(loopTime < LimitTime){       
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false;
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig7,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
    
}
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 8;
  m = EEPROM.read (8);
  LimitTime =  m*60000;
  digitalWrite (irrig8,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false;//окончание работы таймера 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig8,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;   
}
if (running == true){ 
  digitalWrite (pwr,HIGH);
  running = false;
    do {
    val = analogRead (light);//ждем ночь
  }
  while (val > 500);
  delay (1000);
  running = true;
}
 if (module.getButtons()==0b00000001){ //вход в меню
      show (); 
      }
  else{
  module.setLEDs(0xFFFF);
  byte btn= module.getButtons(); //опрашиваем кнопки
  switch (btn){
    
  case 1: h++; //1-я добавить номер
  if (h > 8 ){
  h = 1;}
  delay(300);
  show();
  break;
    
  case 2: h--; //2 - убавить номер
  if (h < 1){
    h = 8;}
  delay(300);
  show();
  break;
  
 case 4: m++; //3-я добавить минут
  if (m > 59 ){
  m = 0;}
  delay(300);
  show();
  break;
  
  case 8: m--; //4-я убавить минут
  if (m < 0 ){
  m = 59;}
  delay(300);
  show();
  break;
  
  case 16: // установить значение и записать в память
  module.clearDisplay();
  module.setDisplayToString("SAPIS");
 delay(1000);
 set();
  break;
 
  case 64: //7-я предпоследняя запускае процесс
  module.setLEDs(0x0000);
  module.clearDisplay();
  module.setDisplayToString("StARt");
  s =0;
  delay (1000);
  module.setLEDs(0x0000);
  module.clearDisplay();
  running = true;
  break;
  }
}
}
 void timing()//для показа посекундно
 {
m = s/60;
s = s - m*60;
}  
 void show()//показ на дисплее
 {
x = h/10;
module.setDisplayDigit(x,0,0);
x = h - x*10; 
module.setDisplayDigit(x,1,0);
x = m/10;
module.setDisplayDigit(x,3,0);
x = m - x*10; 
module.setDisplayDigit(x,4,0);
x = s/10;
module.setDisplayDigit(x,6,0);
x = s - x*10; 
module.setDisplayDigit(x,7,0);
module.setDisplayToString("-",false,2);
module.setDisplayToString("-",false,5);
}

 void set()//запись в память
 {
EEPROM.write (h,m); 
x = h/10;
module.setDisplayDigit(x,0,0);
x = h - x*10; 
module.setDisplayDigit(x,1,0);
x = m/10;
module.setDisplayDigit(x,3,0);
x = m - x*10; 
module.setDisplayDigit(x,4,0);
x = s/10;
module.setDisplayDigit(x,6,0);
x = s - x*10; 
module.setDisplayDigit(x,7,0);
module.setDisplayToString("-",false,2);
module.setDisplayToString("-",false,5);
}

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

grey72 пишет:

полив теплиц автоматом на 555 таймерах, работало весь сезон, урожай фантастический ... Пришлось срочно осваивать контроллеры 

и вот тут началось!

Блин, ну работало же! Зачем чинить то, что не сломано?

grey72
Offline
Зарегистрирован: 30.01.2017

а и сейчас все работает))) просто БП у меня 2А , на одновременный полив 8 грядок не хватит ни напора воды, ни денег на 10А блок питания)))

 

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

ХЗ, с одной стороны вроде идея здравая, с другой - такая штука в ЛО или севернее и работать то не будет до июля, а потом мотоциклист фарой в 3 часа ночи датчик засветит. Может RTC прикрутить и всегда знать, что утро наступило?

grey72
Offline
Зарегистрирован: 30.01.2017

Так вот для этого и прошу подсказать !.

Как сделать повторный опрос датчика света? У меня выполняется цикл do....while , после выхода из цикла нужно сделать паузу в секунду и вновь опросить датчик. Если условие верно, то включается полив, если нет, то нужно вновь вернутся в цикл do....while и снова ждать

Я бы не стал писать, если бы сам допер)...

 

grey72
Offline
Зарегистрирован: 30.01.2017

RTC думал прикрутить, но мозг пока еще плохо работает, как я уже говорил, контроллерами занялся 2 месяца как...

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

Так вы из него не выходите - проверьте, если true подняли флаг, подождали, проверили, если false - сбросили флаг и крутимся дальше, если true и флаг поднят, сбрасываем флаг и выходим с победой.
А жучок решит на датчике отдохнуть - решим, что ночь пришла?
 

grey72
Offline
Зарегистрирован: 30.01.2017

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

grey72
Offline
Зарегистрирован: 30.01.2017

но в данной схеме уже заложено ожидание в течении двух секунд после засветки датчика,

А поподробнее про флаг нельзя?

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

Дополнительная булева переменная flag или как Вам нравится. Принимает true-false и используется для хранения предыдущего состояния (в данном случае).

Что то вроде этого должно получится, running  и используем вместо флага.

   running = true;
 do {
    val = analogRead (light);//ждем день
    if (val > 600) { running = false; }
   
    delay(1000);
    val = analogRead (light);
    if (val < 600) { running = true; }
    
  }
  while (running);
  delay (1000); //А зачем этот delay?
  running = true;

 

grey72
Offline
Зарегистрирован: 30.01.2017

Спасибо, буду пробовать!

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

По нормальному конечно надо подтянуть навыки, использовать WDT (устройство само круглосуточно работает и если повиснет вы это нескоро узнаете) и ликвидировать основную массу делеев. Работать и с ними будет, но не кошерно.

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

И не могу понять, как Вы в меню попадаете с таким долгоиграющим кодом?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

grey72 пишет:

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

Диода шунтирующего реле нет, а на деле?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

grey72 пишет:

а и сейчас все работает))) просто БП у меня 2А , на одновременный полив 8 грядок не хватит ни напора воды, ни денег на 10А блок питания)))

 

Тысячу рублей на компьютерный блок питания нет? )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, ладно, за 600 рублей трёхсотваттника за глаза хватит.

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

ua6em, ЕвгенийП, вы это, не говорите нам селянам про такие деньжищи. Зажрались в Москвах своих, понимашь. Я так 555 пока и в глаза не видал, 1006 обхожусь.))))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

bwn пишет:

ua6em, ЕвгенийП, вы это, не говорите нам селянам про такие деньжищи. Зажрались в Москвах своих, понимашь. Я так 555 пока и в глаза не видал, 1006 обхожусь.))))

Я в ауле живу, высокогорном, с пенсии уж могу выделить пару тысяч на свои хотелки, пиво не пью, водку тоже, коньяк Арарат 1957 года не достать... а мерседес у меня ногайский...

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

ua6em пишет:

grey72 пишет:

а и сейчас все работает))) просто БП у меня 2А , на одновременный полив 8 грядок не хватит ни напора воды, ни денег на 10А блок питания)))

Тысячу рублей на компьютерный блок питания нет? )))

В принципе, ключевое препятствие упустили, все остальное вторично.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

bwn пишет:

ua6em пишет:

grey72 пишет:

а и сейчас все работает))) просто БП у меня 2А , на одновременный полив 8 грядок не хватит ни напора воды, ни денег на 10А блок питания)))

Тысячу рублей на компьютерный блок питания нет? )))

В принципе, ключевое препятствие упустили, все остальное вторично.

А поливать лучше вечером, когда вода и почва прогреты и линзового эффекта не будет

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

ТС молчит, может капельный у него. Если дождеванием, согласен.

arDubino
Offline
Зарегистрирован: 12.01.2017

поливать утром тоже на каком то форуме научился?!! :)))

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

arDubino, а чем капельный полив плох утром, ночью и днем?

arDubino
Offline
Зарегистрирован: 12.01.2017

bwn пишет:

arDubino, а чем капельный полив плох утром, ночью и днем?

если в теплице наверно ничем.

а так наверно все вопросы к агрономам.

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

Тогда к чему был Ваш пост?

grey72
Offline
Зарегистрирован: 30.01.2017

ua6em пишет:

grey72 пишет:

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

Диода шунтирующего реле нет, а на деле?

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

http://ru.aliexpress.com/item/Sindax-HK4100F-DC12V-SHG-DC-12V-Coil-SPDT-6-Pin-PCB-General-Purpose-Power-Relay-5PCS/32633933096.html?spm=2114.13010708.0.99.OJQbZU

http://ru.aliexpress.com/item/Smart-Electronics-Soil-Moisture-Hygrometer-Detection-Humidity-Sensor-Module-For-arduino-Development-Board-DIY-Robot-Smart/32562744759.html?detailNewVersion=&spm=2114.13010708.0.115.OJQbZU

http://ru.aliexpress.com/item/New-12V-Electric-Solenoid-Valve-Magnetic-DC-N-C-Water-Air-Inlet-Flow-Switch-1-2/32699483604.html?spm=2114.03010208.3.124.ZSvGpA&ws_ab_test=searchweb201556_7,searchweb201602_5_10039_10048_10057_10047_10056_10055_10037_10049_10059_10033_10046_10058_10032_10045_10017_405_404_407_10040_10060,searchweb201603_6&btsid=86e55923-7903-4950-af71-a8b8f1622196

http://ru.aliexpress.com/item/E74-Free-Shipping-10Pcs-Garden-Irrigation-Misting-Micro-Flow-1-4-Hose-Dripper-Drip-Head/32602832113.html?spm=2114.03010208.3.37.1FwUQn&ws_ab_test=searchweb201556_7,searchweb201602_5_10039_10048_10057_10047_10056_10055_10037_10049_10059_10033_10046_10058_10032_10045_10017_405_404_407_10040_10060,searchweb201603_6&btsid=5ae90af7-156a-4757-983d-cafdb98d44cf

grey72
Offline
Зарегистрирован: 30.01.2017

bwn пишет:

Дополнительная булева переменная flag или как Вам нравится. Принимает true-false и используется для хранения предыдущего состояния (в данном случае).

Что то вроде этого должно получится, running  и используем вместо флага.

   running = true;
 do {
    val = analogRead (light);//ждем день
    if (val > 600) { running = false; }
   
    delay(1000);
    val = analogRead (light);
    if (val < 600) { running = true; }
    
  }
  while (running);
  delay (1000); //А зачем этот delay?
  running = true;

 

Огромное спавибо Вам!!

все работает.

прилагаю код, тестировал на столе сутки, сбоев нет...

//система автополива на 8 грядок, первые две без, а все остальные с датчиком дождя
//устанавливается один раз с записью в епром, чтобы поменять время полива надо нажать кнопку сброс и вновь выставить 
//время полива на нужном реле поливается утром, раз в сутки.
#include <EEPROM.h>
#include <InvertedTM1638.h>
#include <TM1638.h>
#include <TM1638QYF.h>
#include <TM1640.h>
#include <TM16XX.h>
#include <TM16XXFonts.h>
#include <TM1638.h>
// define a module on data pin 8, clock pin 9 and strobe pin 7
TM1638 module(8, 9, 7);
#define irm     A1 //датчик влажности
#define pwr     2 //датчик влажности power
#define light   A0 //датчик света
#define irrig1  12 //полив реле 1
#define irrig2  13 //полив реле 2
#define irrig3  11
#define irrig4  10
#define irrig5  3
#define irrig6  4
#define irrig7  5
#define irrig8  6
unsigned long startTime; //время начала
unsigned long loopTime; //время прошло
unsigned long LimitTime = 0; //таймер
int h=1;//номер реле
int m=1;//количество минут
int s=0;
int x;
int val;
boolean running = false; //Флаг Запуска отсчета
boolean flag = false;
void setup(){
  //установим режимы работы выходов и входов
  pinMode(irrig1,OUTPUT); 
  pinMode(irrig2,OUTPUT); 
  pinMode(irrig3,OUTPUT); 
  pinMode(irrig4,OUTPUT); 
  pinMode(irrig5,OUTPUT); 
  pinMode(irrig6,OUTPUT); 
  pinMode(irrig7,OUTPUT); 
  pinMode(irrig8,OUTPUT); 
  pinMode(pwr,OUTPUT); 
  pinMode(light,INPUT); 
  pinMode(irm,INPUT); 
  digitalWrite (irrig1,HIGH);
  digitalWrite (irrig2,HIGH);
  digitalWrite (irrig3,HIGH);
  digitalWrite (irrig4,HIGH);
  digitalWrite (irrig5,HIGH);
  digitalWrite (irrig6,HIGH);
  digitalWrite (irrig7,HIGH);
  digitalWrite (irrig8,HIGH);
  digitalWrite (pwr,HIGH);
EEPROM.write(1,1); 
EEPROM.write(2,1);
EEPROM.write(3,1);
EEPROM.write(4,1);
EEPROM.write(5,1);
EEPROM.write(6,1);
EEPROM.write(7,1);
EEPROM.write(8,1);
  module.setupDisplay(true, 1);
  module.setLEDs(0x0000);  // тушим свет
  module.clearDisplay();
  //приветствие на 3 сек
  module.setDisplayToString("HELLO");
  delay(3000);
} 

void loop() {
if (running == true){ 
   module.clearDisplay();
  module.setDisplayToString("StArtd");//ждем день
do {
   val = analogRead (light);//ждем день
   if (val > 600) { flag = false; }
  
   delay(1000);
   val = analogRead (light);
   if (val < 600) { flag = true; }
   
 }
 while (flag);
  running = true;
}
 if (running == true){   
  startTime = millis();
  h = 1;
  m = EEPROM.read (1);
  LimitTime =  m*60000;
  digitalWrite (irrig1,LOW);
  while(loopTime < LimitTime){    // сравниваем время прошло с вр окончания  
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; //вычисляем сколько времени прошло
   }
 running = false;//окончание работы таймера 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig1,HIGH);
    delay (1000);
    running = true;
 }
   if (running == true) {   
  startTime = millis();
  h = 2;
  m = EEPROM.read (2);
  LimitTime =  m*60000;
  digitalWrite (irrig2,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false; 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig2,HIGH);
    digitalWrite (pwr,LOW);//включаем питание датчика влаги(реле)
    delay (1000);
    running = true;
   }
   if (running == true && analogRead (irm)>220) {   //таймер запущен и датчик дождя сухой
  startTime = millis();
  digitalWrite (pwr,HIGH);//выключаем питание датчика влаги(реле)
  h = 3;
  m = EEPROM.read (3);
  LimitTime =  m*60000;
  digitalWrite (irrig3,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false; 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig3,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
   }
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 4;
  m = EEPROM.read (4);
  LimitTime =  m*60000;
  digitalWrite (irrig4,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false;
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig4,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
    
}
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 5;
  m = EEPROM.read (5);
  LimitTime =  m*60000;
  digitalWrite (irrig5,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false;
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig5,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
    
}
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 6;
  m = EEPROM.read (6);
  LimitTime =  m*60000;
  digitalWrite (irrig6,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false; 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig6,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
    
}
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 7;
  m = EEPROM.read (7);
  LimitTime =  m*60000;
  digitalWrite (irrig7,LOW);
  while(loopTime < LimitTime){       
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false;
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig7,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
    
}
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 8;
  m = EEPROM.read (8);
  LimitTime =  m*60000;
  digitalWrite (irrig8,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false;//окончание работы таймера 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig8,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;   
}
if (running == true){ 
   module.clearDisplay();
  module.setDisplayToString("StArtn");//ждем ночь
  digitalWrite (pwr,HIGH);
do {
   val = analogRead (light);//ждем ночь
   if (val < 600) { flag = false; }
  
   delay(1000);
   val = analogRead (light);
   if (val > 600) { flag = true; }
   
 }
 while (flag);
  running = true;
}
 if (module.getButtons()==0b00000001){ //кнопка прервать 
      show (); 
      }
  else{
  module.setLEDs(0xFFFF);
  byte btn= module.getButtons(); //опрашиваем кнопки
  switch (btn){
    
  case 1: h++; //1-я добавить номер
  if (h > 8 ){
  h = 1;}
  delay(300);
  show();
  break;
    
  case 2: h--; //2 - убавить номер
  if (h < 1){
    h = 8;}
  delay(300);
  show();
  break;
  
 case 4: m++; //3-я добавить минут
  if (m > 59 ){
  m = 0;}
  delay(300);
  show();
  break;
  
  case 8: m--; //4-я убавить минут
  if (m < 0 ){
  m = 59;}
  delay(300);
  show();
  break;
  
  case 16: // установить значение и записать в память
  module.clearDisplay();
  module.setDisplayToString("SAPIS");
 delay(1000);
 set();
  break;
 
  case 64: //7-я предпоследняя запускае процесс
  module.setLEDs(0x0000);
  module.clearDisplay();
  module.setDisplayToString("StARt");
  s =0;
  delay (1000);
  module.setLEDs(0x0000);
  module.clearDisplay();
  running = true;
  break;
  }
}
}
 void timing()//для показа посекундно
 {
m = s/60;
s = s - m*60;
}  
 void show()//показ на дисплее
 {
x = h/10;
module.setDisplayDigit(x,0,0);
x = h - x*10; 
module.setDisplayDigit(x,1,0);
x = m/10;
module.setDisplayDigit(x,3,0);
x = m - x*10; 
module.setDisplayDigit(x,4,0);
x = s/10;
module.setDisplayDigit(x,6,0);
x = s - x*10; 
module.setDisplayDigit(x,7,0);
module.setDisplayToString("-",false,2);
module.setDisplayToString("-",false,5);
}

 void set()//запись в память
 {
EEPROM.write (h,m); 
x = h/10;
module.setDisplayDigit(x,0,0);
x = h - x*10; 
module.setDisplayDigit(x,1,0);
x = m/10;
module.setDisplayDigit(x,3,0);
x = m - x*10; 
module.setDisplayDigit(x,4,0);
x = s/10;
module.setDisplayDigit(x,6,0);
x = s - x*10; 
module.setDisplayDigit(x,7,0);
module.setDisplayToString("-",false,2);
module.setDisplayToString("-",false,5);
}

 

grey72
Offline
Зарегистрирован: 30.01.2017

простите, ошибка!

//система автополива на 8 грядок, первые две без, а все остальные с датчиком дождя
//устанавливается один раз с записью в епром, чтобы поменять время полива надо нажать кнопку сброс и вновь выставить 
//время полива на нужном реле поливается утром, раз в сутки.
#include <EEPROM.h>
#include <InvertedTM1638.h>
#include <TM1638.h>
#include <TM1638QYF.h>
#include <TM1640.h>
#include <TM16XX.h>
#include <TM16XXFonts.h>
#include <TM1638.h>
// define a module on data pin 8, clock pin 9 and strobe pin 7
TM1638 module(8, 9, 7);
#define irm     A1 //датчик влажности
#define pwr     2 //датчик влажности power
#define light   A0 //датчик света
#define irrig1  12 //полив реле 1
#define irrig2  13 //полив реле 2
#define irrig3  11
#define irrig4  10
#define irrig5  3
#define irrig6  4
#define irrig7  5
#define irrig8  6
unsigned long startTime; //время начала
unsigned long loopTime; //время прошло
unsigned long LimitTime = 0; //таймер
int h=1;//номер реле
int m=1;//количество минут
int s=0;
int x;
int val;
boolean running = false; //Флаг Запуска отсчета
boolean flag = false;
void setup(){
  //установим режимы работы выходов и входов
  pinMode(irrig1,OUTPUT); 
  pinMode(irrig2,OUTPUT); 
  pinMode(irrig3,OUTPUT); 
  pinMode(irrig4,OUTPUT); 
  pinMode(irrig5,OUTPUT); 
  pinMode(irrig6,OUTPUT); 
  pinMode(irrig7,OUTPUT); 
  pinMode(irrig8,OUTPUT); 
  pinMode(pwr,OUTPUT); 
  pinMode(light,INPUT); 
  pinMode(irm,INPUT); 
  digitalWrite (irrig1,HIGH);
  digitalWrite (irrig2,HIGH);
  digitalWrite (irrig3,HIGH);
  digitalWrite (irrig4,HIGH);
  digitalWrite (irrig5,HIGH);
  digitalWrite (irrig6,HIGH);
  digitalWrite (irrig7,HIGH);
  digitalWrite (irrig8,HIGH);
  digitalWrite (pwr,HIGH);
EEPROM.write(1,1); 
EEPROM.write(2,1);
EEPROM.write(3,1);
EEPROM.write(4,1);
EEPROM.write(5,1);
EEPROM.write(6,1);
EEPROM.write(7,1);
EEPROM.write(8,1);
  module.setupDisplay(true, 1);
  module.setLEDs(0x0000);  // тушим свет
  module.clearDisplay();
  //приветствие на 3 сек
  module.setDisplayToString("HELLO");
  delay(3000);
} 

void loop() {
if (running == true){ 
   module.clearDisplay();
do {
   val = analogRead (light);//ждем день
   if (val > 600) { flag = false; }
  
   delay(1000);
   val = analogRead (light);
   if (val < 600) { flag = true; }
   
 }
 while (flag);
  running = true;
}
 if (running == true){   
  startTime = millis();
  h = 1;
  m = EEPROM.read (1);
  LimitTime =  m*60000;
  digitalWrite (irrig1,LOW);
  while(loopTime < LimitTime){    // сравниваем время прошло с вр окончания  
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; //вычисляем сколько времени прошло
   }
 running = false;//окончание работы таймера 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig1,HIGH);
    delay (1000);
    running = true;
 }
   if (running == true) {   
  startTime = millis();
  h = 2;
  m = EEPROM.read (2);
  LimitTime =  m*60000;
  digitalWrite (irrig2,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false; 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig2,HIGH);
    digitalWrite (pwr,LOW);//включаем питание датчика влаги(реле)
    delay (1000);
    running = true;
   }
   if (running == true && analogRead (irm)>220) {   //таймер запущен и датчик дождя сухой
  startTime = millis();
  digitalWrite (pwr,HIGH);//выключаем питание датчика влаги(реле)
  h = 3;
  m = EEPROM.read (3);
  LimitTime =  m*60000;
  digitalWrite (irrig3,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false; 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig3,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
   }
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 4;
  m = EEPROM.read (4);
  LimitTime =  m*60000;
  digitalWrite (irrig4,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false;
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig4,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
    
}
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 5;
  m = EEPROM.read (5);
  LimitTime =  m*60000;
  digitalWrite (irrig5,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false;
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig5,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
    
}
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 6;
  m = EEPROM.read (6);
  LimitTime =  m*60000;
  digitalWrite (irrig6,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false; 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig6,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
    
}
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 7;
  m = EEPROM.read (7);
  LimitTime =  m*60000;
  digitalWrite (irrig7,LOW);
  while(loopTime < LimitTime){       
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false;
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig7,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
    
}
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 8;
  m = EEPROM.read (8);
  LimitTime =  m*60000;
  digitalWrite (irrig8,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false;//окончание работы таймера 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig8,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;   
}
if (running == true){ 
  digitalWrite (pwr,HIGH);
do {
   val = analogRead (light);//ждем ночь
   if (val < 600) { flag = false; }
  
   delay(1000);
   val = analogRead (light);
   if (val > 600) { flag = true; }
   
 }
 while (flag);
  running = true;
}
 if (module.getButtons()==0b00000001){ //кнопка прервать 
      show (); 
      }
  else{
  module.setLEDs(0xFFFF);
  byte btn= module.getButtons(); //опрашиваем кнопки
  switch (btn){
    
  case 1: h++; //1-я добавить номер
  if (h > 8 ){
  h = 1;}
  delay(300);
  show();
  break;
    
  case 2: h--; //2 - убавить номер
  if (h < 1){
    h = 8;}
  delay(300);
  show();
  break;
  
 case 4: m++; //3-я добавить минут
  if (m > 59 ){
  m = 0;}
  delay(300);
  show();
  break;
  
  case 8: m--; //4-я убавить минут
  if (m < 0 ){
  m = 59;}
  delay(300);
  show();
  break;
  
  case 16: // установить значение и записать в память
  module.clearDisplay();
  module.setDisplayToString("SAPIS");
 delay(1000);
 set();
  break;
 
  case 64: //7-я предпоследняя запускае процесс
  module.setLEDs(0x0000);
  module.clearDisplay();
  module.setDisplayToString("StARt");
  s =0;
  delay (1000);
  module.setLEDs(0x0000);
  module.clearDisplay();
  running = true;
  break;
  }
}
}
 void timing()//для показа посекундно
 {
m = s/60;
s = s - m*60;
}  
 void show()//показ на дисплее
 {
x = h/10;
module.setDisplayDigit(x,0,0);
x = h - x*10; 
module.setDisplayDigit(x,1,0);
x = m/10;
module.setDisplayDigit(x,3,0);
x = m - x*10; 
module.setDisplayDigit(x,4,0);
x = s/10;
module.setDisplayDigit(x,6,0);
x = s - x*10; 
module.setDisplayDigit(x,7,0);
module.setDisplayToString("-",false,2);
module.setDisplayToString("-",false,5);
}

 void set()//запись в память
 {
EEPROM.write (h,m); 
x = h/10;
module.setDisplayDigit(x,0,0);
x = h - x*10; 
module.setDisplayDigit(x,1,0);
x = m/10;
module.setDisplayDigit(x,3,0);
x = m - x*10; 
module.setDisplayDigit(x,4,0);
x = s/10;
module.setDisplayDigit(x,6,0);
x = s - x*10; 
module.setDisplayDigit(x,7,0);
module.setDisplayToString("-",false,2);
module.setDisplayToString("-",false,5);
}

СПАСИБО!

теперь все точно)))

grey72
Offline
Зарегистрирован: 30.01.2017

ЕвгенийП пишет:

Да, ладно, за 600 рублей трёхсотваттника за глаза хватит.

проблема в том, что уже при одновременном поливе всего двух теплиц, время полива приходилось увеличивать почти  в полтора раза, так что техзадание говорило однозначно - поочередное поливание грядок. Клапан ест 0,8 А, что не есть гуд. Применив поочередный полив я выиграл в деньгах прилично. Ато на мерседес не хватает, только на хаммер)))))

grey72
Offline
Зарегистрирован: 30.01.2017

И все же повторюсь

1. Как быстро переполнится таймер контроллера при круглосуточном использованиии устройства?

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

grey72 пишет:

1. Как быстро переполнится таймер контроллера при круглосуточном использованиии устройства?

какой из таймеров?

*если экономить время таймера, то лет на 300 может хватить. О_О

grey72
Offline
Зарегистрирован: 30.01.2017

на сезон хватит?

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

grey72 пишет:

на сезон хватит?

ты не ответил на вопрос.

grey72
Offline
Зарегистрирован: 30.01.2017

Клапауций 823 пишет:

grey72 пишет:

1. Как быстро переполнится таймер контроллера при круглосуточном использованиии устройства?

какой из таймеров?

*если экономить время таймера, то лет на 300 может хватить. О_О

я новичок!!!

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

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

grey72 пишет:

я новичок!!!

да, хоть пень - зачем мне это знать?

grey72 пишет:

вопрос звучал про используемый мной)

какой таймер ты используешь?

grey72
Offline
Зарегистрирован: 30.01.2017

Клапауций 823 пишет:

grey72 пишет:

я новичок!!!

да, хоть пень - зачем мне это знать?

grey72 пишет:

вопрос звучал про используемый мной)

какой таймер ты используешь?

//система автополива на 8 грядок, первые две без, а все остальные с датчиком дождя
//устанавливается один раз с записью в епром, чтобы поменять время полива надо нажать кнопку сброс и вновь выставить 
//время полива на нужном реле поливается утром, раз в сутки.
#include <EEPROM.h>
#include <InvertedTM1638.h>
#include <TM1638.h>
#include <TM1638QYF.h>
#include <TM1640.h>
#include <TM16XX.h>
#include <TM16XXFonts.h>
#include <TM1638.h>
// define a module on data pin 8, clock pin 9 and strobe pin 7
TM1638 module(8, 9, 7);
#define irm     A1 //датчик влажности
#define pwr     2 //датчик влажности power
#define light   A0 //датчик света
#define irrig1  12 //полив реле 1
#define irrig2  13 //полив реле 2
#define irrig3  11
#define irrig4  10
#define irrig5  3
#define irrig6  4
#define irrig7  5
#define irrig8  6
unsigned long startTime; //время начала
unsigned long loopTime; //время прошло
unsigned long LimitTime = 0; //таймер
int h=1;//номер реле
int m=1;//количество минут
int s=0;
int x;
int val;
boolean running = false; //Флаг Запуска отсчета
boolean flag = false;
void setup(){
  //установим режимы работы выходов и входов
  pinMode(irrig1,OUTPUT); 
  pinMode(irrig2,OUTPUT); 
  pinMode(irrig3,OUTPUT); 
  pinMode(irrig4,OUTPUT); 
  pinMode(irrig5,OUTPUT); 
  pinMode(irrig6,OUTPUT); 
  pinMode(irrig7,OUTPUT); 
  pinMode(irrig8,OUTPUT); 
  pinMode(pwr,OUTPUT); 
  pinMode(light,INPUT); 
  pinMode(irm,INPUT); 
  digitalWrite (irrig1,HIGH);
  digitalWrite (irrig2,HIGH);
  digitalWrite (irrig3,HIGH);
  digitalWrite (irrig4,HIGH);
  digitalWrite (irrig5,HIGH);
  digitalWrite (irrig6,HIGH);
  digitalWrite (irrig7,HIGH);
  digitalWrite (irrig8,HIGH);
  digitalWrite (pwr,HIGH);
EEPROM.write(1,1); 
EEPROM.write(2,1);
EEPROM.write(3,1);
EEPROM.write(4,1);
EEPROM.write(5,1);
EEPROM.write(6,1);
EEPROM.write(7,1);
EEPROM.write(8,1);
  module.setupDisplay(true, 1);
  module.setLEDs(0x0000);  // тушим свет
  module.clearDisplay();
  //приветствие на 3 сек
  module.setDisplayToString("HELLO");
  delay(3000);
} 

void loop() {
if (running == true){ 
  module.setLEDs(0x0000);
   module.clearDisplay();
do {
   val = analogRead (light);//ждем день
   if (val > 600) { flag = false; }
  
   delay(1000);
   val = analogRead (light);
   if (val < 600) { flag = true; }
   
 }
 while (flag);
  running = true;
}
 if (running == true){   
  startTime = millis();
  h = 1;
  m = EEPROM.read (1);
  LimitTime =  m*60000;
  digitalWrite (irrig1,LOW);
  while(loopTime < LimitTime){    // сравниваем время прошло с вр окончания  
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; //вычисляем сколько времени прошло
   }
 running = false;//окончание работы таймера 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig1,HIGH);
    delay (1000);
    running = true;
 }
   if (running == true) {   
  startTime = millis();
  h = 2;
  m = EEPROM.read (2);
  LimitTime =  m*60000;
  digitalWrite (irrig2,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false; 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig2,HIGH);
    digitalWrite (pwr,LOW);//включаем питание датчика влаги(реле)
    delay (1000);
    running = true;
   }
   if (running == true && analogRead (irm)>220) {   //таймер запущен и датчик дождя сухой
  startTime = millis();
  digitalWrite (pwr,HIGH);//выключаем питание датчика влаги(реле)
  h = 3;
  m = EEPROM.read (3);
  LimitTime =  m*60000;
  digitalWrite (irrig3,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false; 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig3,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
   }
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 4;
  m = EEPROM.read (4);
  LimitTime =  m*60000;
  digitalWrite (irrig4,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false;
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig4,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
    
}
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 5;
  m = EEPROM.read (5);
  LimitTime =  m*60000;
  digitalWrite (irrig5,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false;
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig5,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
    
}
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 6;
  m = EEPROM.read (6);
  LimitTime =  m*60000;
  digitalWrite (irrig6,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false; 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig6,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
    
}
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 7;
  m = EEPROM.read (7);
  LimitTime =  m*60000;
  digitalWrite (irrig7,LOW);
  while(loopTime < LimitTime){       
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false;
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig7,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;
    
}
 if (running == true && analogRead (irm)>220) {   
  startTime = millis();
  digitalWrite (pwr,HIGH);
  h = 8;
  m = EEPROM.read (8);
  LimitTime =  m*60000;
  digitalWrite (irrig8,LOW);
  while(loopTime < LimitTime){      
   s = (LimitTime - loopTime)/1000;
   delay(500); 
   loopTime = millis() - startTime; 
   }
 running = false;//окончание работы таймера 
    loopTime = 0;
    LimitTime = 0;
    s = 0;
    digitalWrite (irrig8,HIGH);
    digitalWrite (pwr,LOW);
    delay (1000);
    running = true;   
}
if (running == true){ 
  digitalWrite (pwr,HIGH);
do {
   val = analogRead (light);//ждем ночь
   if (val < 600) { flag = false; }
  
   delay(1000);
   val = analogRead (light);
   if (val > 600) { flag = true; }
   
 }
 while (flag);
 module.setLEDs(0x0000);
  running = true;
}
 if (module.getButtons()==0b00000001){ //кнопка прервать 
      show (); 
      }
  else{
  module.setLEDs(0xFFFF);
  byte btn= module.getButtons(); //опрашиваем кнопки
  switch (btn){
    
  case 1: h++; //1-я добавить номер
  if (h > 8 ){
  h = 1;}
  delay(300);
  show();
  break;
    
  case 2: h--; //2 - убавить номер
  if (h < 1){
    h = 8;}
  delay(300);
  show();
  break;
  
 case 4: m++; //3-я добавить минут
  if (m > 59 ){
  m = 0;}
  delay(300);
  show();
  break;
  
  case 8: m--; //4-я убавить минут
  if (m < 0 ){
  m = 59;}
  delay(300);
  show();
  break;
  
  case 16: // установить значение и записать в память
  module.clearDisplay();
  module.setDisplayToString("SAPIS");
 delay(1000);
 set();
  break;
 
  case 64: //7-я предпоследняя запускае процесс
  module.setLEDs(0x0000);
  module.clearDisplay();
  module.setDisplayToString("StARt");
  s =0;
  delay (1000);
  module.setLEDs(0x0000);
  module.clearDisplay();
  running = true;
  break;
  }
}
}
 void timing()//для показа посекундно
 {
m = s/60;
s = s - m*60;
}  
 void show()//показ на дисплее
 {
x = h/10;
module.setDisplayDigit(x,0,0);
x = h - x*10; 
module.setDisplayDigit(x,1,0);
x = m/10;
module.setDisplayDigit(x,3,0);
x = m - x*10; 
module.setDisplayDigit(x,4,0);
x = s/10;
module.setDisplayDigit(x,6,0);
x = s - x*10; 
module.setDisplayDigit(x,7,0);
module.setDisplayToString("-",false,2);
module.setDisplayToString("-",false,5);
}

 void set()//запись в память
 {
EEPROM.write (h,m); 
x = h/10;
module.setDisplayDigit(x,0,0);
x = h - x*10; 
module.setDisplayDigit(x,1,0);
x = m/10;
module.setDisplayDigit(x,3,0);
x = m - x*10; 
module.setDisplayDigit(x,4,0);
x = s/10;
module.setDisplayDigit(x,6,0);
x = s - x*10; 
module.setDisplayDigit(x,7,0);
module.setDisplayToString("-",false,2);
module.setDisplayToString("-",false,5);
}

 

 
Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

это не таймер контроллера.

grey72
Offline
Зарегистрирован: 30.01.2017

значит, сезон проработает? сброс производить ежемесячно не надо? 

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

grey72 пишет:

значит, сезон проработает? сброс производить ежемесячно не надо? 

значит, - ты не ответил на мой вопрос.

lean_74
Offline
Зарегистрирован: 22.12.2015

От Dimax это выглядит так:

volatile uint8_t minut=0;
volatile uint8_t chas=0;
volatile uint8_t sec=0;

void setup(){
Serial.begin(9600);
TCCR1A=(1<<WGM11); //режим14 FAST PWM 
TCCR1B=(1<<CS12)|(1<<WGM13)|(1<<WGM12); //делить частоту CPU на 256
ICR1=62499;  // (16000000MHz /div256) -1 = 1 раз в секунду
TIMSK1=(1<<TOIE1); //разрешить прерывание
}

ISR (TIMER1_OVF_vect) { 
sec++ ; //инкремент переменной каждую секунду
if (sec>59){sec=0; minut++; }
if (minut>59){minut=0; chas++; }
if (chas>23){chas=0;}
}

void loop(){
Serial.print(chas);
Serial.write(':');
Serial.print(minut);
Serial.write(':');
Serial.print(sec);
Serial.println();
}

 

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

lean_74 пишет:

От Dimax это выглядит так:

как это называется?

lean_74
Offline
Зарегистрирован: 22.12.2015

Клапауций 823 пишет:

как это называется?

Таймер 1 ?

grey72
Offline
Зарегистрирован: 30.01.2017

Вот спасибо!

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

Не придется....

Буду учить матчасть)))

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

grey72 пишет:

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

кто тебе такое сказал?

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

grey72 пишет:

Буду учить матчасть)))

Самое верное решение.))))

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

lean_74 пишет:

Клапауций 823 пишет:

как это называется?

Таймер 2 ?

мы тут в угадайки играем?

lean_74
Offline
Зарегистрирован: 22.12.2015

TIMER1_OVF_vect

lean_74
Offline
Зарегистрирован: 22.12.2015

А это Ваш любимый второй:

//

volatile unsigned long t = 0;

ISR (TIMER2_OVF_vect) {++t;} // обработка событий по прерыванию счётчика

void setup() {
///////////////////////////////////////////////////////////////////
cli(); // запрет прерываний глобально
TIMSK &= ~(_BV(TOIE2) | _BV(OCIE2)); // отключение прерывания Таймера 2
ASSR |= _BV(AS2); // перевод Таймера 2 в асинхронный режим тактирования от кварцевого резонатора 32768Гц
TCNT2 = 0x00; // начальная инициализация счётчика
TCCR2 = 0x05; // установка коэффициента деления 128
OCR2  = 0x00; // совпадение с частотой 1 Гц
while (ASSR & (_BV(TCN2UB) | _BV(OCR2UB) | _BV(TCR2UB))); // ждём готовности таймера
TIMSK |= _BV(TOIE2); // разрешаем прерывание от Таймера 2
sei(); // разрешаем прерывания глобально
///////////////////////////////////////////////////////////////////

}

void loop() {}

 

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

lean_74 пишет:

А это Ваш любимый второй:

здесь:

аппаратный таймер 2 переполняется каждую секунду.

переменная t переполнится через 136 лет.

arDubino
Offline
Зарегистрирован: 12.01.2017

bwn пишет:

Тогда к чему был Ваш пост?

специально для умственноограниченных.

кактусы НЕ поливать :))))))

 

з.ы.

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

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

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