<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[forum.rcl-radio.ru &mdash; 4-х канальное реле времени (Arduino)]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=251&amp;type=atom" />
	<updated>2020-12-27T06:36:58Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/viewtopic.php?id=251</id>
		<entry>
			<title type="html"><![CDATA[4-х канальное реле времени (Arduino)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=2715#p2715" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>#include &lt;Wire.h&gt; 
#include &lt;SPI.h&gt;
#include &lt;PCD8544.h&gt;
#include &lt;DS3231.h&gt;
#include &lt;EEPROM.h&gt;
 DS3231 clock;RTCDateTime DateTime;
 PCD8544 lcd; // RST,CE,DC,DIN,CLK   VCC,BL,GND (3,4,5,6,7   +3.3V,200 OM +3.3V, GND)
 char * mes[12]{&quot;/)&amp;&quot;,&quot;,e&amp;&quot;,&quot;Map$&quot;,&quot;A;p&quot;,&quot;Ma]&quot;,&quot;^_)`&quot;,&quot;^_{`&quot;,&quot;A&amp;}&quot;,&quot;Ce)&quot;,&quot;Ok$&quot;,&quot;Ho*&quot;,&quot;#ek&quot;};
 char * den[8]{&quot;&quot;,&quot;!o)&quot;,&quot;B$p&quot;,&quot;Cp(&quot;,&quot;&#039;$&amp;&quot;,&quot;!*$&quot;,&quot;C@[&quot;,&quot;Bck&quot;};
 int i,n,ok,menu,x,w,mem,d_mem,t,n_d,ind0,ind1,ind2,ind3;
 int m0_on[8],h0_on[8],m0_of[8],h0_of[8];
 int m1_on[8],h1_on[8],m1_of[8],h1_of[8];
 int m2_on[8],h2_on[8],m2_of[8],h2_of[8];
 int m3_on[8],h3_on[8],m3_of[8],h3_of[8];
 static const byte gradus[] = { B00000110,B00001001,B00001001,B00000110,B00000000 };// градус
 
 void setup(){
  Serial.begin(9600);Wire.begin();clock.begin();
  //  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча 
  lcd.begin(84, 48);lcd.setContrast(70);//  контрастность 0-127
  pinMode(A0,INPUT); // menu
  pinMode(A1,INPUT); // +
  pinMode(A2,INPUT); // -
  pinMode(A3,INPUT); // ok
  pinMode(9,OUTPUT);pinMode(10,OUTPUT);pinMode(11,OUTPUT);pinMode(12,OUTPUT);// выходы реле
  lcd.createChar(0, gradus);
  for(d_mem=0;d_mem&lt;8;d_mem++){mem++;m0_on[d_mem]=EEPROM.read(mem);}
  for(d_mem=0;d_mem&lt;8;d_mem++){mem++;h0_on[d_mem]=EEPROM.read(mem);}
  for(d_mem=0;d_mem&lt;8;d_mem++){mem++;m0_of[d_mem]=EEPROM.read(mem);}
  for(d_mem=0;d_mem&lt;8;d_mem++){mem++;h0_of[d_mem]=EEPROM.read(mem);} 
  for(d_mem=0;d_mem&lt;8;d_mem++){mem++;m1_on[d_mem]=EEPROM.read(mem);}
  for(d_mem=0;d_mem&lt;8;d_mem++){mem++;h1_on[d_mem]=EEPROM.read(mem);}
  for(d_mem=0;d_mem&lt;8;d_mem++){mem++;m1_of[d_mem]=EEPROM.read(mem);}
  for(d_mem=0;d_mem&lt;8;d_mem++){mem++;h1_of[d_mem]=EEPROM.read(mem);}
  for(d_mem=0;d_mem&lt;8;d_mem++){mem++;m2_on[d_mem]=EEPROM.read(mem);}
  for(d_mem=0;d_mem&lt;8;d_mem++){mem++;h2_on[d_mem]=EEPROM.read(mem);}
  for(d_mem=0;d_mem&lt;8;d_mem++){mem++;m2_of[d_mem]=EEPROM.read(mem);}
  for(d_mem=0;d_mem&lt;8;d_mem++){mem++;h2_of[d_mem]=EEPROM.read(mem);}
  for(d_mem=0;d_mem&lt;8;d_mem++){mem++;m3_on[d_mem]=EEPROM.read(mem);}
  for(d_mem=0;d_mem&lt;8;d_mem++){mem++;h3_on[d_mem]=EEPROM.read(mem);}
  for(d_mem=0;d_mem&lt;8;d_mem++){mem++;m3_of[d_mem]=EEPROM.read(mem);}
  for(d_mem=0;d_mem&lt;8;d_mem++){mem++;h3_of[d_mem]=EEPROM.read(mem);}
  if(EEPROM.read(100)==255){for(mem=0;mem&lt;120;mem++){EEPROM.update(mem,0);}}// если ячейка памяти №100 равна 255 установить все значения реле времени на 0 (код работает только при первом включении)
  mem=0;
 }
 
 void loop(){
 ///////////////////////////// дата время ///////////////////////////////
  DateTime=clock.getDateTime();// опрос времени
  lcd.setCursor(0,0);
  lcd.print(clock.dateFormat(&quot;H:i:s &quot;, DateTime));// выводим часы, минуты и секунды
  lcd.print(&quot; &quot;);for(i=0;i&lt;8;i++){if(DateTime.dayOfWeek==i){lcd.print(den[i]);}}lcd.print(&quot; &quot;);// день недели
  lcd.setCursor(0,1);lcd.print(&quot;  &quot;);lcd.print(DateTime.day);lcd.print(&quot; &quot;); // дата
  for(i=0;i&lt;13;i++){if(DateTime.month==i){lcd.print(mes[i-1]);}}lcd.print(&quot; &quot;); // месяц
  lcd.print(DateTime.year);lcd.print(&quot; &quot;); // год
  lcd.setCursor(0,2);lcd.print(&quot;--------------&quot;);
 ////////////////////////////////////////////////////////////////////////
 
 if(analogRead(A0)&gt;900){menu++;w=1;mem=0;ok=0;n=0;lcd.clear();if(menu&gt;4||menu&lt;0){menu=0;}} // перебор реле 1...4 
 x++; if(x&gt;1){x=0;} // мигание регулировки параметров
 /////////////////////////////////////// Реле 1 /////////////////////////
 if(menu==1){ 
   if(analogRead(A3)&gt;900){ok++;}if(ok&gt;4){ok=0;} ///// кнопка ОК - перебор параметров реле
   if(analogRead(A1)&gt;900&amp;&amp;ok==0){n++;}if(analogRead(A2)&gt;900&amp;&amp;ok==0){n--;}if(n&gt;7||n&lt;1){n=1;} //// день недели 1...7
   lcd.setCursor(0,3);lcd.print(&quot; Pe{e 1  &quot;);if(x==0&amp;&amp;ok==0){lcd.print(&quot;   &quot;);}else{lcd.print(den[n]);}lcd.print(&quot; &quot;); // вывод дня недели
 
   if(analogRead(A1)&gt;900&amp;&amp;ok==1){m0_on[n]++;}if(analogRead(A2)&gt;900&amp;&amp;ok==1){m0_on[n]--;}if(m0_on[n]&gt;59||m0_on[n]&lt;0){m0_on[n]=0;}
   if(analogRead(A1)&gt;900&amp;&amp;ok==2){h0_on[n]++;}if(analogRead(A2)&gt;900&amp;&amp;ok==2){h0_on[n]--;}if(h0_on[n]&gt;23||h0_on[n]&lt;0){h0_on[n]=0;}
   if(analogRead(A1)&gt;900&amp;&amp;ok==3){m0_of[n]++;}if(analogRead(A2)&gt;900&amp;&amp;ok==3){m0_of[n]--;}if(m0_of[n]&gt;59||m0_of[n]&lt;0){m0_of[n]=0;}
   if(analogRead(A1)&gt;900&amp;&amp;ok==4){h0_of[n]++;}if(analogRead(A2)&gt;900&amp;&amp;ok==4){h0_of[n]--;}if(h0_of[n]&gt;23||h0_of[n]&lt;0){h0_of[n]=0;}
 
   lcd.setCursor(0,4);lcd.print(&quot; &quot;);
   if(x==0&amp;&amp;ok==2){lcd.print(&quot;  &quot;);}else{if(h0_on[n]&lt;10){lcd.print(&quot;0&quot;);}lcd.print(h0_on[n]);}lcd.print(&quot;:&quot;);
   if(x==0&amp;&amp;ok==1){lcd.print(&quot;  &quot;);}else{if(m0_on[n]&lt;10){lcd.print(&quot;0&quot;);}lcd.print(m0_on[n]);}lcd.print(&quot;  &quot;); 
   if(x==0&amp;&amp;ok==4){lcd.print(&quot;  &quot;);}else{if(h0_of[n]&lt;10){lcd.print(&quot;0&quot;);}lcd.print(h0_of[n]);}lcd.print(&quot;:&quot;);
   if(x==0&amp;&amp;ok==3){lcd.print(&quot;  &quot;);}else{if(m0_of[n]&lt;10){lcd.print(&quot;0&quot;);}lcd.print(m0_of[n]);}
   lcd.setCursor(0,5);str6();}
 ///////////////////////////////////////////////////////////////////////
 /////////////////////////////////////// Реле 2 /////////////////////////
 if(menu==2){ 
   if(analogRead(A3)&gt;900){ok++;}if(ok&gt;4){ok=0;} ///// кнопка ОК - перебор параметров реле
   if(analogRead(A1)&gt;900&amp;&amp;ok==0){n++;}if(analogRead(A2)&gt;900&amp;&amp;ok==0){n--;}if(n&gt;7||n&lt;1){n=1;} //// день недели 1...7
   lcd.setCursor(0,3);lcd.print(&quot; Pe{e 2  &quot;);if(x==0&amp;&amp;ok==0){lcd.print(&quot;   &quot;);}else{lcd.print(den[n]);}lcd.print(&quot; &quot;); // вывод дня недели
 
   if(analogRead(A1)&gt;900&amp;&amp;ok==1){m1_on[n]++;}if(analogRead(A2)&gt;900&amp;&amp;ok==1){m1_on[n]--;}if(m1_on[n]&gt;59||m1_on[n]&lt;0){m1_on[n]=0;}
   if(analogRead(A1)&gt;900&amp;&amp;ok==2){h1_on[n]++;}if(analogRead(A2)&gt;900&amp;&amp;ok==2){h1_on[n]--;}if(h1_on[n]&gt;23||h1_on[n]&lt;0){h1_on[n]=0;}
   if(analogRead(A1)&gt;900&amp;&amp;ok==3){m1_of[n]++;}if(analogRead(A2)&gt;900&amp;&amp;ok==3){m1_of[n]--;}if(m1_of[n]&gt;59||m1_of[n]&lt;0){m1_of[n]=0;}
   if(analogRead(A1)&gt;900&amp;&amp;ok==4){h1_of[n]++;}if(analogRead(A2)&gt;900&amp;&amp;ok==4){h1_of[n]--;}if(h1_of[n]&gt;23||h1_of[n]&lt;0){h1_of[n]=0;}
 
   lcd.setCursor(0,4);lcd.print(&quot; &quot;);
   if(x==0&amp;&amp;ok==2){lcd.print(&quot;  &quot;);}else{if(h1_on[n]&lt;10){lcd.print(&quot;0&quot;);}lcd.print(h1_on[n]);}lcd.print(&quot;:&quot;);
   if(x==0&amp;&amp;ok==1){lcd.print(&quot;  &quot;);}else{if(m1_on[n]&lt;10){lcd.print(&quot;0&quot;);}lcd.print(m1_on[n]);}lcd.print(&quot;  &quot;); 
   if(x==0&amp;&amp;ok==4){lcd.print(&quot;  &quot;);}else{if(h1_of[n]&lt;10){lcd.print(&quot;0&quot;);}lcd.print(h1_of[n]);}lcd.print(&quot;:&quot;);
   if(x==0&amp;&amp;ok==3){lcd.print(&quot;  &quot;);}else{if(m1_of[n]&lt;10){lcd.print(&quot;0&quot;);}lcd.print(m1_of[n]);}
   lcd.setCursor(0,5);str6();}
 ///////////////////////////////////////////////////////////////////////
 /////////////////////////////////////// Реле 3 /////////////////////////
 if(menu==3){ 
   if(analogRead(A3)&gt;900){ok++;}if(ok&gt;4){ok=0;} ///// кнопка ОК - перебор параметров реле
   if(analogRead(A1)&gt;900&amp;&amp;ok==0){n++;}if(analogRead(A2)&gt;900&amp;&amp;ok==0){n--;}if(n&gt;7||n&lt;1){n=1;} //// день недели 1...7
   lcd.setCursor(0,3);lcd.print(&quot; Pe{e 3  &quot;);if(x==0&amp;&amp;ok==0){lcd.print(&quot;   &quot;);}else{lcd.print(den[n]);}lcd.print(&quot; &quot;); // вывод дня недели
 
   if(analogRead(A1)&gt;900&amp;&amp;ok==1){m2_on[n]++;}if(analogRead(A2)&gt;900&amp;&amp;ok==1){m2_on[n]--;}if(m2_on[n]&gt;59||m2_on[n]&lt;0){m2_on[n]=0;}
   if(analogRead(A1)&gt;900&amp;&amp;ok==2){h2_on[n]++;}if(analogRead(A2)&gt;900&amp;&amp;ok==2){h2_on[n]--;}if(h2_on[n]&gt;23||h2_on[n]&lt;0){h2_on[n]=0;}
   if(analogRead(A1)&gt;900&amp;&amp;ok==3){m2_of[n]++;}if(analogRead(A2)&gt;900&amp;&amp;ok==3){m2_of[n]--;}if(m2_of[n]&gt;59||m2_of[n]&lt;0){m2_of[n]=0;}
   if(analogRead(A1)&gt;900&amp;&amp;ok==4){h2_of[n]++;}if(analogRead(A2)&gt;900&amp;&amp;ok==4){h2_of[n]--;}if(h2_of[n]&gt;23||h2_of[n]&lt;0){h2_of[n]=0;}
 
   lcd.setCursor(0,4);lcd.print(&quot; &quot;);
   if(x==0&amp;&amp;ok==2){lcd.print(&quot;  &quot;);}else{if(h2_on[n]&lt;10){lcd.print(&quot;0&quot;);}lcd.print(h2_on[n]);}lcd.print(&quot;:&quot;);
   if(x==0&amp;&amp;ok==1){lcd.print(&quot;  &quot;);}else{if(m2_on[n]&lt;10){lcd.print(&quot;0&quot;);}lcd.print(m2_on[n]);}lcd.print(&quot;  &quot;); 
   if(x==0&amp;&amp;ok==4){lcd.print(&quot;  &quot;);}else{if(h2_of[n]&lt;10){lcd.print(&quot;0&quot;);}lcd.print(h2_of[n]);}lcd.print(&quot;:&quot;);
   if(x==0&amp;&amp;ok==3){lcd.print(&quot;  &quot;);}else{if(m2_of[n]&lt;10){lcd.print(&quot;0&quot;);}lcd.print(m2_of[n]);}
   lcd.setCursor(0,5);str6();}
 ///////////////////////////////////////////////////////////////////////
 /////////////////////////////////////// Реле 4 /////////////////////////
 if(menu==4){ 
   if(analogRead(A3)&gt;900){ok++;}if(ok&gt;4){ok=0;} ///// кнопка ОК - перебор параметров реле
   if(analogRead(A1)&gt;900&amp;&amp;ok==0){n++;}if(analogRead(A2)&gt;900&amp;&amp;ok==0){n--;}if(n&gt;7||n&lt;1){n=1;} //// день недели 1...7
   lcd.setCursor(0,3);lcd.print(&quot; Pe{e 4  &quot;);if(x==0&amp;&amp;ok==0){lcd.print(&quot;   &quot;);}else{lcd.print(den[n]);}lcd.print(&quot; &quot;); // вывод дня недели
 
   if(analogRead(A1)&gt;900&amp;&amp;ok==1){m3_on[n]++;}if(analogRead(A2)&gt;900&amp;&amp;ok==1){m3_on[n]--;}if(m3_on[n]&gt;59||m3_on[n]&lt;0){m3_on[n]=0;}
   if(analogRead(A1)&gt;900&amp;&amp;ok==2){h3_on[n]++;}if(analogRead(A2)&gt;900&amp;&amp;ok==2){h3_on[n]--;}if(h3_on[n]&gt;23||h3_on[n]&lt;0){h3_on[n]=0;}
   if(analogRead(A1)&gt;900&amp;&amp;ok==3){m3_of[n]++;}if(analogRead(A2)&gt;900&amp;&amp;ok==3){m3_of[n]--;}if(m3_of[n]&gt;59||m3_of[n]&lt;0){m3_of[n]=0;}
   if(analogRead(A1)&gt;900&amp;&amp;ok==4){h3_of[n]++;}if(analogRead(A2)&gt;900&amp;&amp;ok==4){h3_of[n]--;}if(h3_of[n]&gt;23||h3_of[n]&lt;0){h3_of[n]=0;}
 
   lcd.setCursor(0,4);lcd.print(&quot; &quot;);
   if(x==0&amp;&amp;ok==2){lcd.print(&quot;  &quot;);}else{if(h3_on[n]&lt;10){lcd.print(&quot;0&quot;);}lcd.print(h3_on[n]);}lcd.print(&quot;:&quot;);
   if(x==0&amp;&amp;ok==1){lcd.print(&quot;  &quot;);}else{if(m3_on[n]&lt;10){lcd.print(&quot;0&quot;);}lcd.print(m3_on[n]);}lcd.print(&quot;  &quot;); 
   if(x==0&amp;&amp;ok==4){lcd.print(&quot;  &quot;);}else{if(h3_of[n]&lt;10){lcd.print(&quot;0&quot;);}lcd.print(h3_of[n]);}lcd.print(&quot;:&quot;);
   if(x==0&amp;&amp;ok==3){lcd.print(&quot;  &quot;);}else{if(m3_of[n]&lt;10){lcd.print(&quot;0&quot;);}lcd.print(m3_of[n]);}
   lcd.setCursor(0,5);str6();}
 ///////////////////////////////////////////////////////////////////////
 
 //////////////////// управление реле //////////////////////////////////
   t=DateTime.hour*100+DateTime.minute; // текущее время, например: 1026 = 10 часов 26 минут
   n_d=DateTime.dayOfWeek; // текущий день недели 1...7 вос...пон
  if(t&gt;=(h0_on[n_d]*100+m0_on[n_d])&amp;&amp;t&lt;(h0_of[n_d]*100+m0_of[n_d])&amp;&amp;(h0_on[n_d]*100+m0_on[n_d])!=(h0_of[n_d]*100+m0_of[n_d])){digitalWrite(9,HIGH);ind0=1;} else{digitalWrite(9,LOW);ind0=0;}
  if(t&gt;=(h1_on[n_d]*100+m1_on[n_d])&amp;&amp;t&lt;(h1_of[n_d]*100+m1_of[n_d])&amp;&amp;(h1_on[n_d]*100+m1_on[n_d])!=(h1_of[n_d]*100+m1_of[n_d])){digitalWrite(10,HIGH);ind1=1;}else{digitalWrite(10,LOW);ind1=0;}
  if(t&gt;=(h2_on[n_d]*100+m2_on[n_d])&amp;&amp;t&lt;(h2_of[n_d]*100+m2_of[n_d])&amp;&amp;(h2_on[n_d]*100+m2_on[n_d])!=(h2_of[n_d]*100+m2_of[n_d])){digitalWrite(11,HIGH);ind2=1;}else{digitalWrite(11,LOW);ind2=0;}
  if(t&gt;=(h3_on[n_d]*100+m3_on[n_d])&amp;&amp;t&lt;(h3_of[n_d]*100+m3_of[n_d])&amp;&amp;(h3_on[n_d]*100+m3_on[n_d])!=(h3_of[n_d]*100+m3_of[n_d])){digitalWrite(12,HIGH);ind3=1;}else{digitalWrite(12,LOW);ind3=0;}
 //////////////////////////////////////////////////////////////////////
 
  delay(100);
 
  if(menu==0){ 
    lcd.setCursor(0,3);if(ind0==0){lcd.print(&quot; P1 OFF&quot;);}else{lcd.print(&quot; P1 ON &quot;);}if(ind1==0){lcd.print(&quot; P2 OFF &quot;);}else{lcd.print(&quot; P2 ON  &quot;);}
    lcd.setCursor(0,4);if(ind2==0){lcd.print(&quot; P3 OFF&quot;);}else{lcd.print(&quot; P3 ON &quot;);}if(ind3==0){lcd.print(&quot; P4 OFF &quot;);}else{lcd.print(&quot; P4 ON  &quot;);}
    lcd.setCursor(0,5);lcd.print(&quot; Te~;ep. &quot;);lcd.print(clock.readTemperature(),1);lcd.write(0);lcd.print(&quot;C&quot;);
  }
 
///////////////////////////////// EEPROM //////////////////////////////  
  if(w==1){
    for(d_mem=0;d_mem&lt;8;d_mem++){mem++;EEPROM.update(mem,m0_on[d_mem]);}
    for(d_mem=0;d_mem&lt;8;d_mem++){mem++;EEPROM.update(mem,h0_on[d_mem]);}  
    for(d_mem=0;d_mem&lt;8;d_mem++){mem++;EEPROM.update(mem,m0_of[d_mem]);}
    for(d_mem=0;d_mem&lt;8;d_mem++){mem++;EEPROM.update(mem,h0_of[d_mem]);}   
    for(d_mem=0;d_mem&lt;8;d_mem++){mem++;EEPROM.update(mem,m1_on[d_mem]);}
    for(d_mem=0;d_mem&lt;8;d_mem++){mem++;EEPROM.update(mem,h1_on[d_mem]);}  
    for(d_mem=0;d_mem&lt;8;d_mem++){mem++;EEPROM.update(mem,m1_of[d_mem]);}
    for(d_mem=0;d_mem&lt;8;d_mem++){mem++;EEPROM.update(mem,h1_of[d_mem]);}   
    for(d_mem=0;d_mem&lt;8;d_mem++){mem++;EEPROM.update(mem,m2_on[d_mem]);}
    for(d_mem=0;d_mem&lt;8;d_mem++){mem++;EEPROM.update(mem,h2_on[d_mem]);}  
    for(d_mem=0;d_mem&lt;8;d_mem++){mem++;EEPROM.update(mem,m2_of[d_mem]);}
    for(d_mem=0;d_mem&lt;8;d_mem++){mem++;EEPROM.update(mem,h2_of[d_mem]);}   
    for(d_mem=0;d_mem&lt;8;d_mem++){mem++;EEPROM.update(mem,m3_on[d_mem]);}
    for(d_mem=0;d_mem&lt;8;d_mem++){mem++;EEPROM.update(mem,h3_on[d_mem]);}  
    for(d_mem=0;d_mem&lt;8;d_mem++){mem++;EEPROM.update(mem,m3_of[d_mem]);}
    for(d_mem=0;d_mem&lt;8;d_mem++){mem++;EEPROM.update(mem,h3_of[d_mem]);}
    w=0;}
 
    if(DateTime.hour==0&amp;&amp;DateTime.minute==0&amp;&amp;DateTime.second==0){lcd.clear();}// сбор экрана каждые сутки в 0ч 0м 0с
 
}///// loop
 
 void str6(){lcd.print(&quot; Bk{    B?k{&quot;);}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2020-12-27T06:36:58Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=2715#p2715</id>
		</entry>
</feed>
