質問するログイン新規登録

質問編集履歴

1

この2つのコードを使ってLCDの日付けと時刻を表示させたいのです。

2021/01/31 06:27

投稿

DMR
DMR

スコア6

title CHANGED
File without changes
body CHANGED
@@ -1,1 +1,153 @@
1
- LCD(SO1602AWWB-UC-WB-U)」を持っています。これを使ってRTC(DS1307)とシリアル通信でLCDに表示させる方法が分かりません。
1
+ LCD(SO1602AWWB-UC-WB-U)」を持っています。これを使ってRTC(DS1307)とシリアル通信でLCDに表示させる方法が分かりません。
2
+
3
+ ```#include <Wire.h>
4
+ int DS1307_ADDRESS=0x68;
5
+ int val=0;
6
+ byte command;
7
+
8
+ void setTime(){
9
+ byte hour=(Serial.read()<<4);
10
+ hour=hour+(Serial.read()&0x0F);
11
+ byte minute=(Serial.read()<<4);
12
+ minute=minute+(Serial.read()&0x0F);
13
+ byte sec=(Serial.read()<<4);
14
+ sec=sec+(Serial.read()&0x0F);
15
+ Wire.beginTransmission(DS1307_ADDRESS);
16
+ Wire.write(val);
17
+ Wire.write(sec);
18
+ Wire.write(minute);
19
+ Wire.write(hour);
20
+ Wire.endTransmission();
21
+ }
22
+
23
+ void setDay(){
24
+ byte year=(Serial.read()<<4);
25
+ year=year+(Serial.read()&0x0F);
26
+ byte month=(Serial.read()<<4);
27
+ month=month+(Serial.read()&0x0F);
28
+ byte day=(Serial.read()<<4);
29
+ day=day+(Serial.read()&0x0F);
30
+ byte day_of_week=(Serial.read()&0x0F);
31
+ Wire.beginTransmission(DS1307_ADDRESS);
32
+ Wire.write(0x03);
33
+ Wire.write(day_of_week);
34
+ Wire.write(day);
35
+ Wire.write(month);
36
+ Wire.write(year);
37
+ Wire.endTransmission();
38
+ }
39
+ void printTime(){
40
+ Wire.beginTransmission(DS1307_ADDRESS);
41
+ Wire.write(val);
42
+ Wire.endTransmission();
43
+ Wire.requestFrom(DS1307_ADDRESS,7);
44
+ byte r_sec=Wire.read();
45
+ byte r_minute=Wire.read();
46
+ byte r_hour=Wire.read();
47
+ byte r_day_of_week=Wire.read();
48
+ byte r_date=Wire.read();
49
+ byte r_month=Wire.read();
50
+ byte r_year=Wire.read();
51
+ Serial.print(r_year,HEX);
52
+ Serial.print("/");
53
+ Serial.print(r_month,HEX);
54
+ Serial.print("/");
55
+ Serial.print(r_date,HEX);
56
+ Serial.print(" ");
57
+ Serial.print(r_hour,HEX);
58
+ Serial.print(":");
59
+ Serial.print( r_minute,HEX);
60
+ Serial.print(":");
61
+ Serial.print( r_sec,HEX);
62
+ Serial.print(" smtwtfs= ");
63
+ Serial.println(r_day_of_week,HEX);
64
+
65
+ }
66
+
67
+ void setup() {
68
+ Serial.begin(9600);
69
+ Wire.begin();
70
+ Serial.flush();
71
+ }
72
+
73
+ void loop() {
74
+ if(Serial.available()){
75
+ command=Serial.read();
76
+ if(command==0x74){
77
+ setTime();
78
+ }
79
+ Serial.println(command);
80
+ if(command==0x64){
81
+ setDay();
82
+ }
83
+ }
84
+ printTime();
85
+ delay(2000);
86
+
87
+
88
+ }
89
+
90
+
91
+ ```#include <Wire.h>
92
+ #define OLED_ADRS 0x3C //SA0=L(SA0=H の場合は 0x3D)
93
+ int DisplayON = 0x0F,
94
+ ClearDisplay = 0x01,
95
+ ReturnHome = 0x02;
96
+ void setup() {
97
+ Wire.begin(); //Wire ライブラリを初期化し、I2C マスタとしてバスに接続
98
+ init_oled();
99
+ }
100
+ void loop() {
101
+ char moji[] = "I2C OLED WHITE12345";
102
+ for(int i = 0; i < 20; i++) {
103
+ writeData(moji[i]);
104
+ }
105
+
106
+ writeCommand(0x20+0x80); //2 行目の先頭
107
+
108
+ for(int i = 0; i < 20; i++) {
109
+ writeData(i+0xB1);
110
+ }
111
+ contrast_max(); //輝度を最大に設定
112
+ while(1){}
113
+ }
114
+ //----main end----
115
+ void writeData(byte t_data)
116
+ {
117
+ Wire.beginTransmission(OLED_ADRS);
118
+ Wire.write(0x40);
119
+ Wire.write(t_data);
120
+ Wire.endTransmission();
121
+ delay(1);
122
+ }
123
+ void writeCommand(byte t_command)
124
+ {
125
+ Wire.beginTransmission(OLED_ADRS);
126
+ Wire.write(0x00);
127
+ Wire.write(t_command);
128
+ Wire.endTransmission();
129
+ delay(10);
130
+ }
131
+ void contrast_max(){
132
+ writeCommand(0x2a);//RE=1
133
+ writeCommand(0x79);//SD=1
134
+ writeCommand(0x81);//コントラストセット
135
+ writeCommand(0xFF);//輝度MAX
136
+ writeCommand(0x78);//SD を0にもどす
137
+ writeCommand(0x28); //2C=高文字 28=ノーマル
138
+ delay(100);
139
+ }
140
+ void init_oled()
141
+ {
142
+ delay(100);
143
+ writeCommand(ClearDisplay); // Clear Display
144
+ delay(20);
145
+ writeCommand(ReturnHome); // ReturnHome
146
+ delay(2);
147
+ writeCommand(DisplayON); // Send Display on command
148
+ delay(2);
149
+ writeCommand(ClearDisplay); // Clear Display
150
+ delay(20);
151
+ }
152
+ コード
153
+ ```