🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

1回答

1304閲覧

r_secを表示させる

m-mikann

総合スコア2

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2021/02/11 06:21

編集2021/02/11 06:34
#define OLED_ADRS 0x3C //SA0=L(SA0=H の場合は 0x3D) int DisplayON = 0x0F, ClearDisplay = 0x01, ReturnHome = 0x02; int DS1307_ADDRESS=0x68; int val=0; byte command; void setup() { Wire.begin(); //Wire ライブラリを初期化し、I2C マスタとしてバスに接続 init_oled(); printTime(); setDay(); setTime(); } void loop() { writeData(r_sec); writeCommand(0x20+0x80); //2 行目の先頭 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 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(); } 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(DS1307)とOLEDディスプレイ(so1602aw)のコードを参考にしてr_secを表示するコードを作ってみたのですがうまくいきません。 何が間違っていますか? #include <Wire.h> #define OLED_ADRS 0x3C //SA0=L(SA0=H の場合は 0x3D) int DisplayON = 0x0F, ClearDisplay = 0x01, ReturnHome = 0x02; int DS1307_ADDRESS=0x68; int val=0; byte command; void setup() { Wire.begin(); //Wire ライブラリを初期化し、I2C マスタとしてバスに接続 init_oled(); printTime(); setDay(); setTime(); } void loop() { writeData(r_sec); writeCommand(0x20+0x80); //2 行目の先頭 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 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(); } 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); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/02/11 06:22

うまくいかないとはどういう動作になるんでしょうか。 また、コードはこのままでは読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
m-mikann

2021/02/11 06:35

OLEDディスプレイにeと表示されます
guest

回答1

0

writeData(r_sec);

writeDataは1バイト(文字)送る命令です。
更に、これは数値であって、文字コードではありません。
なので、

writeData(r_sec/10+'0');
writeData(r_sec%10+'0');

と文字コードを1つずつ送れば良さそう。

※スケッチは、その箇所しか見ていません。

<追記>
もうちょっと読んでおかしかったので追記します。

void printTime() {
//略
byte r_sec=Wire.read();
//略
}

このように、このprintTime内で作ったローカル変数は、この関数内だけ参照出来ます。
この関数が終わった時点で寿命がつきます。
なので、r_sec並びに同じような変数は、グローバル変数(関数外)で作ってください。

投稿2021/02/11 06:53

編集2021/02/11 07:01
nac_tnk

総合スコア494

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m-mikann

2021/02/11 08:59

%10の後ろの’0’はどういう意味になりますか? グローバル変数にするということはloop()関数の中に入れるということですか?
nac_tnk

2021/02/11 09:09

'0'は文字コードの「0」です。(実際の数値は48) 文字コード表を見れば0→9と並んでいます。文字コードの「0」を基準に文字コードを数えています。 > グローバル変数にする 関数外です。 ↑なら int val=0; byte command; 等はグローバル変数ですから、どの関数からでもアクセスできます。
m-mikann

2021/02/11 14:19

もう一つ聞くの忘れてたんですが、/10と%10はどういう意味になりますか? 変数をグローバル変数にして、writeData(r_sec/10+'0');writeData(r_sec%10+'0');を入れてみました。 53と出て数字が更新しません。
nac_tnk

2021/02/11 14:23

ただの演算子です。 / 割る % 割った余り setup関数で取得した時が53秒だったのでしょう。 それ以降取得していません。
m-mikann

2021/02/11 15:55

なぜ10で割って、10で割った余りをもとめるのですか?
nac_tnk

2021/02/11 15:59

たとえば、53秒なら2文字です。 53/10で5 53%10で3 です。で、5のキャラクターコードと3のキャラクターコードをLCDへ送ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問