nobcha23の日記

PICマイコンやArduinoを使う電子回路遊びを紹介します

ARDUINO+RTC8564+(i2c-LCD)+(i2c-CSM-KEY)のスケッチ

ちびでぃーのというARDUINOのi2cポートへRTC-8564をつなぎ、表示はストロベリーリナックスの16x2のLCDとし、時刻設定用操作スイッチは自作PIC16F1827のi2c接続キャパシティブセンシングキーという組み合わせの時計を試作してます。

自作PIC16F1827のi2c接続キャパシティブセンシングキーにはi2cのLCDスレーブ機能も入ってますが、キーとLCDを同時に動かすと間に合わなかったりするので今回はキーだけ使うことにしましたhttp://chitose6thplant.web.fc2.com/からi2cのメニューに入りPIC16F1827の該当ページに行きます。

で長くなりますが、スケッチです。RTC-8564NBについてはばんとさんのライブラリーを使っております。またストロベリーリナックスのi2cについてもエレキジャックからの引用です。

RTCの時刻設定のところをライブラリー化したいと思ったんですが、見よう見まねでやってる分ではエラー多発となり、今回パスです。



    // i2c RTC-8564NB -> i2c Lcd
    // Using BANT's library by nobcha 05/06/2013
    // RTC8564 http://memo.tank.jp/archives/7734
    // Using MITSUNAGA's library by nobcha 05/06/2013
    // i2c_lcd http://n.mtng.org/ele/arduino/i2c.html
    // nobcha
    // 2013.06.02 debugging
    // rtc_time?? LCD cursor display??    

    #include <I2CLiquidCrystal.h>
    #include <Wire.h>
    #include <RTC8564.h>

    RTC8564 RTC;
    RTC_TIME rtc_time;

    const char* dayofweek[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
    char key_data, key_ref, set_pos;

    char LCD_CUR[7][2]={{0x03,0},{0x06,0},{0x09,0},{0x0C,0},
                       {0x2,1},{0x5,1},{0x8,1}};
    char RTC_VALUE[7][3]  =  {{11,30,05},   // initial,MAX,MIN
			     {10,12,01},
		 	     {10,31,01},
                             {1,06,00},
			     {18,23,00},
			     {59,59,00},
			     {59,59,00} };	
			// year,month,day,hour,minute,second,weekday
    
    // initialize the library
    I2CLiquidCrystal lcd(50, true);

    // | +--- set true if the power suply is 5V, false if it is 3.3V
    // +-------- contrast (0-63)

    void setup(){
      Wire.begin();
      lcd.begin(16,2); // set lib for display size (16x2)
      lcd.clear(); // clear the screen
      RTC.begin();

      /* 2013年5月6日 0時0分0秒に時刻合わせ */
      rtc_time.year = 2013;
      rtc_time.month = 5;
      rtc_time.day = 6;
      rtc_time.hour = 12;
      rtc_time.min = 0;
      rtc_time.sec = 0;
      RTC.adjust( rtc_time );

    }
    
    char Key_get( )
    {
      char key;
      key_ref=0x0;
      Wire.requestFrom(0x38,1);  // scm key:0x70
      key=Wire.read();
      Wire.endTransmission();
      if(key==key_data) key_ref=0x0;
      else key_ref=0x1;
      return key;
    }
    
    // data increment and MAX check
    void data_inc(char set_pos )
    {
      RTC_VALUE[set_pos][0]++;
      if(RTC_VALUE[set_pos][0]>(RTC_VALUE[set_pos][1]))
      {
	RTC_VALUE[set_pos][0]=RTC_VALUE[set_pos][2];
      }
    }

    // data decrement and 0 check
    void data_dec(char set_pos)
    {
      if(RTC_VALUE[set_pos][0]==RTC_VALUE[set_pos][2])
      {
	RTC_VALUE[set_pos][0]=RTC_VALUE[set_pos][1]+1;
      }
      RTC_VALUE[set_pos][0] --;
    }

    // RTC_VALUE loading from rtc_data
    void  rtc_value_load()
    {
      RTC_VALUE[0][0]=(char)(rtc_time.year-2000);
      RTC_VALUE[1][0]=rtc_time.month;
      RTC_VALUE[2][0]=rtc_time.day;
      RTC_VALUE[3][0]=rtc_time.wday;  
      RTC_VALUE[4][0]=rtc_time.hour;
      RTC_VALUE[5][0]=rtc_time.min;
      RTC_VALUE[6][0]=rtc_time.sec;   
    }
    // RTC_VALUE recovering to rtc_data  
    void rtc_value_recover()
    {         
      rtc_time.year=RTC_VALUE[0][0]+2000;
      rtc_time.month=RTC_VALUE[1][0];
      rtc_time.day=RTC_VALUE[2][0];
      rtc_time.wday=RTC_VALUE[3][0];  
      rtc_time.hour=RTC_VALUE[4][0];
      rtc_time.min=RTC_VALUE[5][0];
      rtc_time.sec=RTC_VALUE[6][0]; 
  
    }


// main loop
    void loop(void)
    {
      char buf[32];
      char  key_1;
      if(RTC.now(&rtc_time))
      {
        snprintf(buf,16,"%04u-%02u-%02u(%s)",
        rtc_time.year,
        rtc_time.month,
        rtc_time.day,
        dayofweek[rtc_time.wday]);

        lcd.setCursor(0,0);
        delay(100);
        lcd.print(buf);
        delay(100);
        snprintf(buf,16," %02u:%02u:%02u",
        rtc_time.hour,
        rtc_time.min,
        rtc_time.sec );

        lcd.setCursor(0,1);
        delay(100);
        lcd.print(buf);
      }
      
    key_data=Key_get();
   
    if(key_data!=0)
    { 
      lcd.setCursor(9,1);    
      snprintf(buf,8," k=%02X%02X",
      key_data, key_ref );
      lcd.print(buf);
    }
    if((key_data==0x31)&(key_ref==1))
    {
           
      set_pos=0;		// YEAR->Month->day->hour->minuts->second
      rtc_value_load();

      lcd.blink();
      delay(200);
 
      while(set_pos<7){		// set_pos:5->0
        char line, cur, key_in_data;
        line=LCD_CUR[set_pos][1];
        cur=LCD_CUR[set_pos][0];
        lcd.setCursor(cur,line);
        delay(100);
	key_data=Key_get();

        lcd.setCursor(9,1);    
        snprintf(buf,8," k=%02X%02X",
        key_data, key_ref );
        lcd.print(buf);
        
        if(key_ref==0) key_in_data=0;
        else key_in_data=key_data;
        if(key_in_data==0x32)         // 0x32:increment
        { data_inc(set_pos);}
        else if(key_in_data==0x33)    // 0x33:decrement
        { data_dec(set_pos);}
        else if(key_in_data==0x31)
        {	set_pos++;}
        delay(100);
        rtc_value_recover();
        RTC.adjust( rtc_time );      
                
        snprintf(buf,16,"%04u-%02u-%02u(%s)",
        rtc_time.year,
        rtc_time.month,
        rtc_time.day,
        dayofweek[rtc_time.wday]);

        lcd.setCursor(0,0);
        delay(100);
        lcd.print(buf);
        
        delay(100);
        snprintf(buf,16," %02u:%02u:%02u",
        rtc_time.hour,
        rtc_time.min,
        rtc_time.sec );

        lcd.setCursor(0,1);
        delay(100);
        lcd.print(buf);
      } 
      delay(100);
    }
      lcd.setCursor(9,1);    
      snprintf(buf,8,"         " );
      lcd.print(buf); 
     
      delay(500);
  }
  
// 2013.06.04 22:50 going well