<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[forum.rcl-radio.ru &mdash; ЧАСЫ НА VDF1602 + DS3231 + DS18B20]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=523&amp;type=atom" />
	<updated>2022-10-26T08:22:48Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/viewtopic.php?id=523</id>
		<entry>
			<title type="html"><![CDATA[ЧАСЫ НА VDF1602 + DS3231 + DS18B20]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=6902#p6902" />
			<content type="html"><![CDATA[<p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2022/10/ff185312dbc731f8c7b93ded1a81ab04.gif" alt="http://forum.rcl-radio.ru/uploads/images/2022/10/ff185312dbc731f8c7b93ded1a81ab04.gif" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2022/10/42a101a464bcb346183a37133bbee793.png" alt="http://forum.rcl-radio.ru/uploads/images/2022/10/42a101a464bcb346183a37133bbee793.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2022/10/a5153068bfee7672ed4b28a814a290cc.png" alt="http://forum.rcl-radio.ru/uploads/images/2022/10/a5153068bfee7672ed4b28a814a290cc.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2022/10/f8cac1aea2cf89b70deedb19339c1119.png" alt="http://forum.rcl-radio.ru/uploads/images/2022/10/f8cac1aea2cf89b70deedb19339c1119.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2022/10/b83cdd6b030b496060101a8c2662cd75.png" alt="http://forum.rcl-radio.ru/uploads/images/2022/10/b83cdd6b030b496060101a8c2662cd75.png" /></span> </p><br /><br /><div class="codebox"><pre><code>#include &lt;DS3231.h&gt;// http://rcl-radio.ru/wp-content/uploads/2022/08/DS3231.zip 
#include &lt;OneWire.h&gt;            // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
#define ADDR    0b1101000
#define CPU_F   16000000
#define SCL_F   100000
OneWire  ds(8); // Вход датчика 18b20

unsigned long times;
int t_izm,brig_a;
int set_time,set_alarm,year,day, mont, date, hour, minut, secon;
int hh_a,mm_a;
bool alarm;
byte alarm_on;
byte hh,mm;

#define SET_ALARM  PB2
#define SET_TIME   PB1
#define SET_UP     PC0
#define SET_DW     PC1
#define BRIG       PC3   
#define BUZZER     PC2

int t_kall = -20;
 
void setup() {
  PORTB |=(1&lt;&lt;SET_ALARM)|(1&lt;&lt;SET_TIME);
  PORTC |=(1&lt;&lt;SET_UP)|(1&lt;&lt;SET_DW);
  DDRC |= (1&lt;&lt;BUZZER);
  ADMUX |= (1&lt;&lt;REFS0)|(1 &lt;&lt; MUX1) | (1 &lt;&lt; MUX0);
  ADCSRA |= (1&lt;&lt;ADEN) | (1&lt;&lt;ADSC) | (1&lt;&lt;ADFR) | (1&lt;&lt;ADIF);
  ADCSRA |= (1&lt;&lt;ADPS2) | (1&lt;&lt;ADPS1) | (1&lt;&lt;ADPS0);// Division Factor 128
  PORTC |= (1 &lt;&lt; BRIG);
  lcdInit();
  lcdWrite(0, 31, 17, 17, 17, 17, 17, 17, 0);  //П
  lcdWrite(8, 17, 17, 17, 31, 1, 1, 1, 0);     //Ч
  lcdWrite(16, 31, 16, 16, 30, 17, 17, 30, 0); //Б
  lcdWrite(24, 4, 14, 14, 14, 31, 4, 0, 0);// alarm
  TWBR = (((CPU_F)/(SCL_F)-16 )/2) ;
  TWSR = 0;
  hh_a=EEPROM_read(0);
  mm_a=EEPROM_read(1);
  alarm=EEPROM_read(2);
 // // set_tim(21,3,5,3,0,4,0);// год 00-99,ДН 1-пн 7-вс, месяц 1-12, дата 1-31, час 0-23, минуты 0-59, секунды 0-59
  Brightness(100);
  lcdCurs(0,1);lcdString(&quot;ALEXANDER&quot;);
  lcdCurs(1,1);lcdString(&quot;LIMAN&quot;);
  _delay_ms(2000);
  lcdClear();
}
 
void loop() {
  if(millis()-times&gt;10000&amp;&amp;set_time==0){times=millis();while((ADCSRA &amp; (1 &lt;&lt; ADIF)) == 0);brig_a = (ADCL|ADCH &lt;&lt; 8);t_izm = dsRead(0)+t_kall;}
  
  if(brig_a&lt;=200){Brightness(100);}
  if(brig_a&gt;200&amp;&amp;brig_a&lt;=400){Brightness(75);}
  if(brig_a&gt;400&amp;&amp;brig_a&lt;=600){Brightness(50);}
  if(brig_a&gt;600){Brightness(25);}

  if(((PINC &gt;&gt; SET_UP) &amp; 1) == 0&amp;&amp;set_alarm==0&amp;&amp;set_time==0  &amp;&amp; alarm_on==0){alarm=1;EEPROM_write(2,alarm);_delay_ms(200);}
  if(((PINC &gt;&gt; SET_DW) &amp; 1) == 0&amp;&amp;set_alarm==0&amp;&amp;set_time==0  &amp;&amp; alarm_on==0){alarm=0;EEPROM_write(2,alarm);_delay_ms(200);}
  
  if(hh_a*100+mm_a!=hh*100+mm){alarm_on=0;}
  if(hh_a*100+mm_a==hh*100+mm &amp;&amp; alarm==1 &amp;&amp; alarm_on==0){alarm_on=1;}
  
  if(hh_a*100+mm_a==hh*100+mm &amp;&amp; alarm==1 &amp;&amp; alarm_on==1){
    for(int b=0;b&lt;200;b++){
    PORTC |=(1&lt;&lt;BUZZER);_delay_us(200);
    PORTC &amp;=~(1&lt;&lt;BUZZER);_delay_us(200);
    }}

  if(((PINC &gt;&gt; SET_UP) &amp; 1) == 0 &amp;&amp; alarm_on==1){alarm_on=2;_delay_ms(200);}
  if(((PINC &gt;&gt; SET_DW) &amp; 1) == 0 &amp;&amp; alarm_on==1){alarm_on=2;_delay_ms(200);}  

    

  if(((PINB &gt;&gt; SET_TIME) &amp; 1) == 0&amp;&amp;set_alarm==0){set_time++;if(set_time&gt;7){set_time=0;}lcdClear(); _delay_ms(200);}
  if(((PINB &gt;&gt; SET_ALARM) &amp; 1) == 0&amp;&amp;set_time==0){set_alarm++;if(set_alarm&gt;2){set_alarm=0;}lcdClear(); _delay_ms(200);}

  if(set_alarm==1){
    lcdCurs(0,0);lcdString(&quot;ALARM HOUR &quot;);lcdChar(hh_a/10+&#039;0&#039;);lcdChar(hh_a%10+&#039;0&#039;);
     if(((PINC &gt;&gt; SET_UP) &amp; 1) == 0){hh_a++;if(hh_a&gt;23){hh_a=23;}EEPROM_write(0,hh_a);_delay_ms(100);}
     if(((PINC &gt;&gt; SET_DW) &amp; 1) == 0){hh_a--;if(hh_a&lt;0){hh_a=0;}EEPROM_write(0,hh_a);_delay_ms(100);}
  }
  if(set_alarm==2){
    lcdCurs(0,0);lcdString(&quot;ALARM MIN &quot;);lcdChar(mm_a/10+&#039;0&#039;);lcdChar(mm_a%10+&#039;0&#039;);
     if(((PINC &gt;&gt; SET_UP) &amp; 1) == 0){mm_a++;if(mm_a&gt;59){mm_a=59;}EEPROM_write(1,mm_a);_delay_ms(100);}
     if(((PINC &gt;&gt; SET_DW) &amp; 1) == 0){mm_a--;if(mm_a&lt;0){mm_a=0;}EEPROM_write(1,mm_a);_delay_ms(100);}
  }  
  
  byte ss =  (i2c_read(ADDR,0) &amp; 0x0F) + (((i2c_read(ADDR,0) &amp; 0x70) &gt;&gt; 4) * 10);
       mm =  (i2c_read(ADDR,1) &amp; 0x0F) + (((i2c_read(ADDR,1) &amp; 0x70) &gt;&gt; 4) * 10);
       hh = ((i2c_read(ADDR,2) &amp; 0x0F) + ((i2c_read(ADDR,2) &amp; 0x70) &gt;&gt; 4) * 10);
  byte wesk =  (i2c_read(ADDR,3) &amp; 0x0F);
  byte dd = ((i2c_read(ADDR,4) &amp; 0x0F) + ((i2c_read(ADDR,4) &amp; 0x70) &gt;&gt; 4) * 10);
  byte mn = ((i2c_read(ADDR,5) &amp; 0x0F) + ((i2c_read(ADDR,5) &amp; 0x70) &gt;&gt; 4) * 10);
  byte yy = ((i2c_read(ADDR,6) &amp; 0x0F) + ((i2c_read(ADDR,6) &amp; 0x70) &gt;&gt; 4) * 10);
  year=yy;mont=mn;date=dd;hour=hh;minut=mm;secon=ss,day=wesk;

  if(set_time==1){
    lcdCurs(0,0);lcdString(&quot;SET HOUR  &quot;);lcdChar(hour/10+&#039;0&#039;);lcdChar(hour%10+&#039;0&#039;);
     if(((PINC &gt;&gt; SET_UP) &amp; 1) == 0){hour++;if(hour&gt;23){hour=23;}set_t();}
     if(((PINC &gt;&gt; SET_DW) &amp; 1) == 0){hour--;if(hour&lt;0){hour=0;}set_t();}
  }
  if(set_time==2){
    lcdCurs(0,0);lcdString(&quot;SET MIN   &quot;);lcdChar(minut/10+&#039;0&#039;);lcdChar(minut%10+&#039;0&#039;);
     if(((PINC &gt;&gt; SET_UP) &amp; 1) == 0){minut++;if(minut&gt;59){minut=59;}set_t();}
     if(((PINC &gt;&gt; SET_DW) &amp; 1) == 0){minut--;if(minut&lt;0){minut=0;}set_t();}
  }  
  if(set_time==3){
    lcdCurs(0,0);lcdString(&quot;SET SEC   &quot;);lcdChar(secon/10+&#039;0&#039;);lcdChar(secon%10+&#039;0&#039;);
     if(((PINC &gt;&gt; SET_UP) &amp; 1) == 0){secon=0;set_t();}
     if(((PINC &gt;&gt; SET_DW) &amp; 1) == 0){secon=0;set_t();}
  }  
  if(set_time==4){
    lcdCurs(0,0);lcdString(&quot;SET DATE  &quot;);lcdChar(date/10+&#039;0&#039;);lcdChar(date%10+&#039;0&#039;);
     if(((PINC &gt;&gt; SET_UP) &amp; 1) == 0){date++;if(date&gt;31){date=31;}set_t();}
     if(((PINC &gt;&gt; SET_DW) &amp; 1) == 0){date--;if(date&lt;1){date=1;}set_t();}
  }     
  if(set_time==5){
    lcdCurs(0,0);lcdString(&quot;SET DAY OF WEEK&quot;);
    lcdCurs(1,0);
     switch(wesk){
       case 1: lcdChar(0);lcdChar(0x48);break;
       case 2: lcdChar(0x42);lcdChar(0x54);break;
       case 3: lcdChar(0x43);lcdChar(0x50);break;
       case 4: lcdChar(1);lcdChar(0x54);break;
       case 5: lcdChar(0);lcdChar(0x54);break;
       case 6: lcdChar(0x43);lcdChar(2);break;
       case 7: lcdChar(0x42);lcdChar(0x43);break;
  }
     if(((PINC &gt;&gt; SET_UP) &amp; 1) == 0){day++;if(day&gt;7){day=7;}set_t();}
     if(((PINC &gt;&gt; SET_DW) &amp; 1) == 0){day--;if(day&lt;1){day=1;}set_t();}
  }   
  if(set_time==6){
    lcdCurs(0,0);lcdString(&quot;SET MONTH &quot;);lcdChar(mont/10+&#039;0&#039;);lcdChar(mont%10+&#039;0&#039;);
     if(((PINC &gt;&gt; SET_UP) &amp; 1) == 0){mont++;if(mont&gt;12){mont=12;}set_t();}
     if(((PINC &gt;&gt; SET_DW) &amp; 1) == 0){mont--;if(mont&lt;1){mont=1;}set_t();}
  } 
  if(set_time==7){
    lcdCurs(0,0);lcdString(&quot;SET YEAR  &quot;);lcdChar(year/10+&#039;0&#039;);lcdChar(year%10+&#039;0&#039;);
     if(((PINC &gt;&gt; SET_UP) &amp; 1) == 0){year++;if(year&gt;100){year=100;}set_t();}
     if(((PINC &gt;&gt; SET_DW) &amp; 1) == 0){year--;if(year&lt;22){year=22;}set_t();}
  }      
  

  if(set_time==0&amp;&amp;set_alarm==0){
  lcdCurs(0,0); 
  lcdChar(hh/10+&#039;0&#039;);lcdChar(hh%10+&#039;0&#039;);lcdChar(0x3A);
  lcdChar(mm/10+&#039;0&#039;);lcdChar(mm%10+&#039;0&#039;);lcdChar(0x3A);
  lcdChar(ss/10+&#039;0&#039;);lcdChar(ss%10+&#039;0&#039;);
  lcdCurs(1,0); 
  lcdChar(dd/10+&#039;0&#039;);lcdChar(dd%10+&#039;0&#039;);lcdString(&quot;/&quot;);
  lcdChar(mn/10+&#039;0&#039;);lcdChar(mn%10+&#039;0&#039;);lcdString(&quot; &quot;);
 switch(wesk){
  case 1: lcdChar(0);lcdChar(0x48);break;
  case 2: lcdChar(0x42);lcdChar(0x54);break;
  case 3: lcdChar(0x43);lcdChar(0x50);break;
  case 4: lcdChar(1);lcdChar(0x54);break;
  case 5: lcdChar(0);lcdChar(0x54);break;
  case 6: lcdChar(0x43);lcdChar(2);break;
  case 7: lcdChar(0x42);lcdChar(0x43);break;
  }
  lcdCurs(1,10);lcdChar(t_izm/100+&#039;0&#039;);lcdChar(t_izm/10%10+&#039;0&#039;);lcdChar(0x2E);lcdChar(t_izm%10+&#039;0&#039;);lcdChar(223); lcdString(&quot;C &quot;);
  lcdCurs(0,10);lcdChar(hh_a/10+&#039;0&#039;);lcdChar(hh_a%10+&#039;0&#039;);lcdString(&quot;:&quot;);lcdChar(mm_a/10+&#039;0&#039;);lcdChar(mm_a%10+&#039;0&#039;);
  lcdCurs(0,15);if(alarm==1){lcdChar(3);}else{lcdChar(0x20);}
  }
  
  _delay_ms(100);
  
}

void set_t(){set_tim(year,day,mont,date,hour,minut,secon); _delay_ms(100);}
void lcdSend(bool rs, byte data) {
    if(rs==0){PORTD |= (1 &lt;&lt; 2);} else{PORTD &amp;= ~(1 &lt;&lt; 2);}//RS
    del();
    if(((data &gt;&gt; 7) &amp; 1) ==1){PORTD |= (1 &lt;&lt; 7);}else{PORTD &amp;= ~(1 &lt;&lt; 7);}
    if(((data &gt;&gt; 6) &amp; 1) ==1){PORTD |= (1 &lt;&lt; 6);}else{PORTD &amp;= ~(1 &lt;&lt; 6);}
    if(((data &gt;&gt; 5) &amp; 1) ==1){PORTD |= (1 &lt;&lt; 5);}else{PORTD &amp;= ~(1 &lt;&lt; 5);}
    if(((data &gt;&gt; 4) &amp; 1) ==1){PORTD |= (1 &lt;&lt; 4);}else{PORTD &amp;= ~(1 &lt;&lt; 4);}
    e_pin();
    if(((data &gt;&gt; 3) &amp; 1) ==1){PORTD |= (1 &lt;&lt; 7);}else{PORTD &amp;= ~(1 &lt;&lt; 7);}
    if(((data &gt;&gt; 2) &amp; 1) ==1){PORTD |= (1 &lt;&lt; 6);}else{PORTD &amp;= ~(1 &lt;&lt; 6);}
    if(((data &gt;&gt; 1) &amp; 1) ==1){PORTD |= (1 &lt;&lt; 5);}else{PORTD &amp;= ~(1 &lt;&lt; 5);}
    if(((data &gt;&gt; 0) &amp; 1) ==1){PORTD |= (1 &lt;&lt; 4);}else{PORTD &amp;= ~(1 &lt;&lt; 4);}
    e_pin();
}
 
void lcd(uint8_t cmd) {lcdSend(true, cmd);}
void lcdChar(const char chr) {lcdSend(false, (uint8_t)chr);}
void lcdString(const char* str) {while(*str != &#039;\0&#039;) {del();lcdChar(*str);str++;}}
void del(){_delay_ms(1);}
void e_pin(){PORTD |= (1 &lt;&lt; 3);del();PORTD &amp;= ~(1 &lt;&lt; 3);}
void lcdCurs(byte str, byte mesto){
  if(str==0){lcd(0b10000000+mesto);}
  if(str==1){lcd(0b11000000+mesto);}
  }
void lcdWrite(byte addr_w, byte wr1,byte wr2,byte wr3,byte wr4,byte wr5,byte wr6,byte wr7,byte wr8){
     lcd(0b01000000|addr_w);lcdChar(wr1);lcdChar(wr2);lcdChar(wr3);lcdChar(wr4);lcdChar(wr5);lcdChar(wr6);lcdChar(wr7);lcdChar(wr8);}  
void lcdInit(){ 
    DDRD |= (1 &lt;&lt; 2) | (1 &lt;&lt; 3)| (1 &lt;&lt; 4) | (1 &lt;&lt; 5) | (1 &lt;&lt; 6) | (1 &lt;&lt; 7); 
    _delay_ms(100);
    lcd(0x03);_delay_us(4500);
    lcd(0x03);_delay_us(4500);
    lcd(0x03);_delay_us(200);
    
    lcd(0b00000010);del();
    lcd(0b00001100);del();
    lcdClear();
  } 
void lcdClear(){lcd(0b00000001);} 
 

float dsRead(byte x) {
  byte data[2], addr[8][8], kol = 0;
  while (ds.search(addr[kol])) {  // поиск датчиков, определение адреса и кол-ва датчиков
    kol++;
  } 
  ds.reset_search();  // Сброс поиска датчика
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0x44, 0);  // Измерение температуры с переносом данных в память
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0xBE);     // Обращение памяти
  for (byte i=0; i&lt;9; i++) data[i]=ds.read();
  int raw=(data[1]&lt;&lt;8)|data[0];
  float value = (float)raw / 1.60; return value; // Расчет температуры и вывод
}

void Brightness(byte brig){
  switch(brig){
    case 25 : lcd(0b00101011);break;
    case 50 : lcd(0b00101010);break;
    case 75 : lcd(0b00101001);break;
    case 100 : lcd(0b00101000);break;
    }
  }

byte i2c_read(byte i2c_addr, byte i2c_reg){
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_addr &lt;&lt; 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_reg;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT))); 
   TWDR = (i2c_addr &lt;&lt; 1) | 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   byte i2c_data = TWDR;  
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO); // СТОП
   return i2c_data;
  }

void i2c_write(byte i2c_addr, byte i2c_reg, byte i2c_dat){
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_addr &lt;&lt; 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_reg;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_dat;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO); // СТОП
  }  

void set_tim(byte years, byte days, byte monts, byte datas, byte hours ,byte minute, byte second){
    i2c_write(ADDR,0x00,(second/10&lt;&lt;4)+second%10);
    i2c_write(ADDR,0x01,(minute/10&lt;&lt;4)+minute%10); 
    i2c_write(ADDR,0x02,(hours/10&lt;&lt;4)+hours%10);
    i2c_write(ADDR,0x04,(datas/10&lt;&lt;4)+datas%10);
    i2c_write(ADDR,0x05,(monts/10&lt;&lt;4)+monts%10);
    i2c_write(ADDR,0x06,(years/10&lt;&lt;4)+years%10);
    i2c_write(ADDR,0x03,days);
  }   

unsigned char EEPROM_read(unsigned int uiAddress){
   while(EECR &amp; (1&lt;&lt;EEWE));
     EEAR = uiAddress;
     EECR |= (1&lt;&lt;EERE);
     return EEDR;
}
 
void EEPROM_write(unsigned int uiAddress, unsigned char ucData){
  while(EECR &amp; (1&lt;&lt;EEWE));
    EEAR = uiAddress;
    EEDR = ucData;
    EECR |= (1&lt;&lt;EEMWE);
    EECR |= (1&lt;&lt;EEWE);
}  </code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2022-10-26T08:22:48Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=6902#p6902</id>
		</entry>
</feed>
