LCD(SO1602AWWB-UC-WB-U)」を持っています。これを使ってRTC(DS1307)とシリアル通信でLCDに表示させる方法が分かりません。
int DS1307_ADDRESS=0x68; int val=0; byte command; void setTime(){ byte hour=(Serial.read()<<4); hour=hour+(Serial.read()&0x0F); byte minute=(Serial.read()<<4); minute=minute+(Serial.read()&0x0F); byte sec=(Serial.read()<<4); sec=sec+(Serial.read()&0x0F); Wire.beginTransmission(DS1307_ADDRESS); Wire.write(val); Wire.write(sec); Wire.write(minute); Wire.write(hour); Wire.endTransmission(); } void setDay(){ byte year=(Serial.read()<<4); year=year+(Serial.read()&0x0F); byte month=(Serial.read()<<4); month=month+(Serial.read()&0x0F); byte day=(Serial.read()<<4); day=day+(Serial.read()&0x0F); byte day_of_week=(Serial.read()&0x0F); Wire.beginTransmission(DS1307_ADDRESS); Wire.write(0x03); Wire.write(day_of_week); Wire.write(day); Wire.write(month); Wire.write(year); Wire.endTransmission(); } void printTime(){ Wire.beginTransmission(DS1307_ADDRESS); Wire.write(val); Wire.endTransmission(); Wire.requestFrom(DS1307_ADDRESS,7); byte r_sec=Wire.read(); byte r_minute=Wire.read(); byte r_hour=Wire.read(); byte r_day_of_week=Wire.read(); byte r_date=Wire.read(); byte r_month=Wire.read(); byte r_year=Wire.read(); Serial.print(r_year,HEX); Serial.print("/"); Serial.print(r_month,HEX); Serial.print("/"); Serial.print(r_date,HEX); Serial.print(" "); Serial.print(r_hour,HEX); Serial.print(":"); Serial.print( r_minute,HEX); Serial.print(":"); Serial.print( r_sec,HEX); Serial.print(" smtwtfs= "); Serial.println(r_day_of_week,HEX); } void setup() { Serial.begin(9600); Wire.begin(); Serial.flush(); } void loop() { if(Serial.available()){ command=Serial.read(); if(command==0x74){ setTime(); } Serial.println(command); if(command==0x64){ setDay(); } } printTime(); delay(2000); } ```#include <Wire.h> #define OLED_ADRS 0x3C //SA0=L(SA0=H の場合は 0x3D) int DisplayON = 0x0F, ClearDisplay = 0x01, ReturnHome = 0x02; void setup() { Wire.begin(); //Wire ライブラリを初期化し、I2C マスタとしてバスに接続 init_oled(); } void loop() { char moji[] = "I2C OLED WHITE12345"; for(int i = 0; i < 20; i++) { writeData(moji[i]); } writeCommand(0x20+0x80); //2 行目の先頭 for(int i = 0; i < 20; i++) { writeData(i+0xB1); } contrast_max(); //輝度を最大に設定 while(1){} } //----main end---- void writeData(byte t_data) { Wire.beginTransmission(OLED_ADRS); Wire.write(0x40); Wire.write(t_data); Wire.endTransmission(); delay(1); } void writeCommand(byte t_command) { Wire.beginTransmission(OLED_ADRS); Wire.write(0x00); Wire.write(t_command); Wire.endTransmission(); delay(10); } void contrast_max(){ writeCommand(0x2a);//RE=1 writeCommand(0x79);//SD=1 writeCommand(0x81);//コントラストセット writeCommand(0xFF);//輝度MAX writeCommand(0x78);//SD を0にもどす writeCommand(0x28); //2C=高文字 28=ノーマル delay(100); } void init_oled() { delay(100); writeCommand(ClearDisplay); // Clear Display delay(20); writeCommand(ReturnHome); // ReturnHome delay(2); writeCommand(DisplayON); // Send Display on command delay(2); writeCommand(ClearDisplay); // Clear Display delay(20); } コード
で、しつもんはなんでしょうか
秋月の説明書
https://akizukidenshi.com/download/ds/akizuki/so1602awwb-uc-wb-u_akizuki_manu.pdf
がありますが、読んでも分からなかった、ということですか?
「説明書にはXXXと書いてあるが、YYYYが理由でそのようにならない」とかの形式で質問して下さい。
説明書を読んでないなら、読んで下さい。
LCDのサンプルプログラムがこれで
#include <Wire.h>
#define OLED_ADRS 0x3C //SA0=L(SA0=H の場合は 0x3D)
int DisplayON = 0x0F,
ClearDisplay = 0x01,
ReturnHome = 0x02;
void setup() {
Wire.begin(); //Wire ライブラリを初期化し、I2C マスタとしてバスに接続
init_oled();
}
void loop() {
char moji[] = "I2C OLED WHITE12345";
for(int i = 0; i < 20; i++) {
writeData(moji[i]);
}
writeCommand(0x20+0x80); //2 行目の先頭
for(int i = 0; i < 20; i++) {
writeData(i+0xB1);
}
contrast_max(); //輝度を最大に設定
while(1){}
}
//----main end----
void writeData(byte t_data)
{
Wire.beginTransmission(OLED_ADRS);
Wire.write(0x40);
Wire.write(t_data);
Wire.endTransmission();
delay(1);
}
void writeCommand(byte t_command)
{
Wire.beginTransmission(OLED_ADRS);
Wire.write(0x00);
Wire.write(t_command);
Wire.endTransmission();
delay(10);
}
void contrast_max(){
writeCommand(0x2a);//RE=1
writeCommand(0x79);//SD=1
writeCommand(0x81);//コントラストセット
writeCommand(0xFF);//輝度MAX
writeCommand(0x78);//SD を0にもどす
writeCommand(0x28); //2C=高文字 28=ノーマル
delay(100);
}
void init_oled()
{
delay(100);
writeCommand(ClearDisplay); // Clear Display
delay(20);
writeCommand(ReturnHome); // ReturnHome
delay(2);
writeCommand(DisplayON); // Send Display on command
delay(2);
writeCommand(ClearDisplay); // Clear Display
delay(20);
}
RTCのコードがこちらです。
#include <Wire.h>
int DS1307_ADDRESS=0x68;
int val=0;
byte command;
void setTime(){
byte hour=(Serial.read()<<4);
hour=hour+(Serial.read()&0x0F);
byte minute=(Serial.read()<<4);
minute=minute+(Serial.read()&0x0F);
byte sec=(Serial.read()<<4);
sec=sec+(Serial.read()&0x0F);
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(val);
Wire.write(sec);
Wire.write(minute);
Wire.write(hour);
Wire.endTransmission();
}
void setDay(){
byte year=(Serial.read()<<4);
year=year+(Serial.read()&0x0F);
byte month=(Serial.read()<<4);
month=month+(Serial.read()&0x0F);
byte day=(Serial.read()<<4);
day=day+(Serial.read()&0x0F);
byte day_of_week=(Serial.read()&0x0F);
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(0x03);
Wire.write(day_of_week);
Wire.write(day);
Wire.write(month);
Wire.write(year);
Wire.endTransmission();
}
void printTime(){
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(val);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS,7);
byte r_sec=Wire.read();
byte r_minute=Wire.read();
byte r_hour=Wire.read();
byte r_day_of_week=Wire.read();
byte r_date=Wire.read();
byte r_month=Wire.read();
byte r_year=Wire.read();
Serial.print(r_year,HEX);
Serial.print("/");
Serial.print(r_month,HEX);
Serial.print("/");
Serial.print(r_date,HEX);
Serial.print(" ");
Serial.print(r_hour,HEX);
Serial.print(":");
Serial.print( r_minute,HEX);
Serial.print(":");
Serial.print( r_sec,HEX);
Serial.print(" smtwtfs= ");
Serial.println(r_day_of_week,HEX);
}
void setup() {
Serial.begin(9600);
Wire.begin();
Serial.flush();
}
void loop() {
if(Serial.available()){
command=Serial.read();
if(command==0x74){
setTime();
}
Serial.println(command);
if(command==0x64){
setDay();
}
}
printTime();
delay(2000);
}
この2つのコードを使ってLCDに日付と時刻を表示したいです。
聞きたいことがあるなら、質問に追記しましょう
編集できますよ。
コードは、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
逆に質問になりますけど、秋月LCDのサンプルは問題無く動くのでしょうか?
また、RTCのそのスケッチも問題なく動くのでしょうか?
はい。各々単独ではちゃんと動きます。
それならミックスにしても不具合は出なさそうですけど。
(勿論Wire.begin();は1回で)
単純に表示の仕方が判らないのでしょうか?
それとも更新間隔とか、作り方の問題でしょうか?
表示の仕方と作り方がわかりません。お願いします。
回答2件
あなたの回答
tips
プレビュー