質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
IDE

IDE、統合開発環境((Integrated Development Environment)とは、テキストエディタ以上の機能を提供して、ソフトウェア開発を効率をあげるコンピュータプログラムを指す。

Arduino

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

Q&A

解決済

5回答

2971閲覧

【Arduino IDE】ESP32でNTP時計を製作したい... 初心者ですみません

namiki11

総合スコア1

IDE

IDE、統合開発環境((Integrated Development Environment)とは、テキストエディタ以上の機能を提供して、ソフトウェア開発を効率をあげるコンピュータプログラムを指す。

Arduino

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

0グッド

0クリップ

投稿2021/05/23 16:08

前提・実現したいこと

ESP32というボードで7セグを使用したNTP時計を製作中です
Arduino IDEでキット付属のコードを書いたのですが、以下のようなエラーが出てしまいます。
自力で数時間悩みながら誤字を直したりとしましたが、原因がつかめないのでこちらに失礼させていただきました。

■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ
sketch_may23b:6:1: error: 'int_flg' does not name a type
int_flg = 0;
^
C:\Users\a\Documents\Arduino\sketch_may23b\sketch_may23b.ino: In function 'int NumParse(int, int)':
sketch_may23b:77:12: error: 'Numver' was not declared in this scope
return Numver / 10;
^
C:\Users\a\Documents\Arduino\sketch_may23b\sketch_may23b.ino: In function 'void loop()':
sketch_may23b:85:9: error: invalid conversion from 'time_t ()(time_t) {aka long int ()(long int)}' to 'int' [-fpermissive]
info1 = time Info.tm_sec;
^
sketch_may23b:85:16: error: expected ';' before 'Info'
info1 = time Info.tm_sec;
^
sketch_may23b:86:9: error: invalid conversion from 'time_t ()(time_t) {aka long int ()(long int)}' to 'int' [-fpermissive]
info2 = time Info.tm_min;
^
sketch_may23b:86:16: error: expected ';' before 'Info'
info2 = time Info.tm_min;
^
sketch_may23b:87:9: error: invalid conversion from 'time_t ()(time_t) {aka long int ()(long int)}' to 'int' [-fpermissive]
info3 = time Info.tm_hour;
^
sketch_may23b:87:16: error: expected ';' before 'Info'
info3 = time Info.tm_hour;
^
sketch_may23b:90:7: error: '_flg' was not declared in this scope
if (_flg == 0){

該当のソースコード

、#include<WiFi.h>

const char *ssid = "ssid";
const char *passworld = "pass";

int_flg = 0;

struct tm timeInfo;
int info1, info2, info3;

//LEDレイアウトを定義
boolean Num_Array[10][7] = {
{1, 1, 1, 1, 1, 1, 0}, //0
{0, 1, 1, 0, 0, 0, 0}, //1
{1, 1, 0, 1, 1, 0, 1}, //2
{1, 1, 1, 1, 0, 0, 1}, //3
{0, 1, 1, 0, 0, 1, 1}, //4
{1, 0, 1, 1, 0, 1, 1}, //5
{1, 0, 1, 1, 1, 1, 1}, //6
{1, 1, 1, 0, 0, 1, 0}, //7
{1, 1, 1, 1, 1, 1, 1}, //8
{1, 1, 1, 1, 0, 1, 1}, //9
};

void NumPrint(int Number) {
digitalWrite(33, -Num_Array[Number][0]);
digitalWrite(32, -Num_Array[Number][1]);
digitalWrite(19, -Num_Array[Number][2]);
digitalWrite(38, -Num_Array[Number][3]);
digitalWrite(4, -Num_Array[Number][4]);
digitalWrite(25, -Num_Array[Number][5]);
digitalWrite(26, -Num_Array[Number][6]);
}

void setup() {
Serial.begin(115200);

WiFi.mode(WIFI_STA);
WiFi.disconnect();

if (WiFi.begin(ssid, passworld) != WL_DISCONNECTED) {
ESP.restart();
}

while (WiFi.status() != WL_CONNECTED) {
delay(1000);
}

Serial.println("Connected to the WiFi network!");

configTime(9 * 3600L, 0, "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp"); //NTPの設定

pinMode(32, OUTPUT);
pinMode(33, OUTPUT);
pinMode(19, OUTPUT);
pinMode(18, OUTPUT);
pinMode(4, OUTPUT);
pinMode(25, OUTPUT);
pinMode(26, OUTPUT);

pinMode(21, OUTPUT);
pinMode(27, OUTPUT);

pinMode(13, OUTPUT); //GND1
pinMode(14, OUTPUT); //GND2
pinMode(16, OUTPUT); //GND3
pinMode(17, OUTPUT); //GND4
pinMode(22, OUTPUT); //GND5
pinMode(23, OUTPUT); //GND6
}

int NumParse(int Number, int s){
if (s == 1){
return Number % 10;
}
else if (s == 2){
return Numver / 10;
}

return 0;
}

void loop(){
getLocalTime(&timeInfo);//時刻を取得
info1 = time Info.tm_sec;
info2 = time Info.tm_min;
info3 = time Info.tm_hour;

//flg変数を
if (_flg == 0){
digitalWrite(14, LOW);
digitalWrite(13, HIGH);
digitalWrite(17, HIGH);
digitalWrite(16, HIGH);
digitalWrite(23, HIGH);
digitalWrite(22, HIGH);
_flg = 1;
NumPrint(NumParse(info3, 1)); //1桁目の表示
}
else if (_flg == 1){
digitalWrite(14, HIGH);
digitalWrite(13, LOW);
digitalWrite(17, HIGH);
digitalWrite(16, HIGH);
digitalWrite(23, HIGH);
digitalWrite(22, HIGH);
_flg = 2;
NumPrint(NumParse(info3, 2)); //2桁目の表示
}
else if (_flg == 2){
digitalWrite(14, HIGH);
digitalWrite(13, HIGH);
digitalWrite(17, LOW);
digitalWrite(16, HIGH);
digitalWrite(23, HIGH);
digitalWrite(22, HIGH);
_flg = 3;
NumPrint(NumParse(info2, 1)); //3桁目の表示
}
else if (_flg == 3){
digitalWrite(14, HIGH);
digitalWrite(13, HIGH);
digitalWrite(17, HIGH);
digitalWrite(16, LOW);
digitalWrite(23, HIGH);
digitalWrite(22, HIGH);
_flg = 4;
NumPrint(NumParse(info2, 2)); //4桁目の表示
}
else if (_flg == 4){
digitalWrite(14, HIGH);
digitalWrite(13, HIGH);
digitalWrite(17, HIGH);
digitalWrite(16, HIGH);
digitalWrite(23, LOW);
digitalWrite(22, HIGH);
_flg = 5;
NumPrint(NumParse(info1, 1)); //5桁目の表示
}
else if (_flg == 5){
digitalWrite(14, HIGH);
digitalWrite(13, HIGH);
digitalWrite(17, HIGH);
digitalWrite(16, HIGH);
digitalWrite(23, HIGH);
digitalWrite(22, LOW);
_flg = 0;
NumPrint(NumParse(info1, 2)); //6桁目の表示
}

delay(1);

}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

Arduino IDE 1.8.15

ここにより詳細な情報を記載してください。

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

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

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

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

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

nac_tnk

2021/05/23 16:58

もう少しじゃない。自分で頑張った方が良いよ。 メッセージが出てくれるバグなんて大した作業じゃない。 おおよそ。 スペルミス、必要なスペースが無い、なぜかスペースが入っている、 というものだね。
namiki11

2021/05/23 22:08

おっしゃる通りですね... 自分の為にも今度からは自己解決で頑張ります。 ご指摘ありがとうございました
guest

回答5

0

もう解決済み&質問とはちょっと違う所だけど、どっちかっていうと、こっちの方が気になっていたので書いておきます。

digitalWrite(33, -Num_Array[Number][0]);

この「-」の意味は?
多分、アノードコモンの7セグを使っているので、反転させるつもりで書いたのだろうと「推測」したのだけども、
-では何の意味も持ちません。
0の場合はマイナスを付けても0です。なのでLOW出力です。
1の場合は-1になりますけど、これはHIGH出力です。

反転したいのなら
!Num_Array[Number][0]
そうでないのなら-は取りましょう。

※ESP32の出力能力はmaxで12mAです。推奨は6mAとも言われています。
で、6桁のダイナミック点灯だと光る時間は1/6になりますから、結構条件が悪いです。
なので、回路はどうなっているのか?アノードコモンの7セグで+側をPNPトランジスタで制御しているのなら良いのですけど・・・
(そのあたりはトランジスタを使っているのか、或いはトランジスタアレイか、でも論理が反転します)

あと、7セグ表示のロジックが良くないです。

NumPrint(NumParse(info3, 1)); //1桁目の表示
}
else if (_flg == 1){
digitalWrite(14, HIGH);
digitalWrite(13, LOW);//※
digitalWrite(17, HIGH);//※
digitalWrite(16, HIGH);//※
digitalWrite(23, HIGH);//※
digitalWrite(22, HIGH);> //※
_flg = 2;//※
NumPrint(NumParse(info3, 2)); //2桁目の表示
}

これは1桁目の表示が終わり、2桁目を表示させる部分を切り取ったものですけど、
13番ピン=2桁目をオン(LOW)にしてるのですけど、その時のセグメントは1桁目の文字形です。
つまり※を付けている部分の時間は2桁目に1桁目の数字を写している事になります。(通称ゴースト)
ESP32は処理が早いですけど、こういった事は避けた方が賢明です。

それと、配列を使った方が良いです。現状、全部ピン番号なので解り難いですし、ミスを起こしやすいです。

int seg[7]={32,33,19,18,4,25,26};
int dig[6]={14,13,17,16,23,22};
int info[3];

for(inti=0;i<7;i++)pinMode(seg[i],OUTPUT);
for(inti=0;i<6;i++)pinMode(dig[i],OUTPUT);

void NumPrint(int Number) {
for(inti=0;i<7;i++)digitalWrite(seg[i], !Num_Array[Number][i]);
}

void loop(){
getLocalTime(&timeInfo);//時刻を取得
info[0] = timeInfo.tm_sec;
info[1] = timeInfo.tm_min;
info[2] = timeInfo.tm_hour;

digitalWrite(dig[_flg],HIGH);//今まで表示していた桁をオフ
_flg=(_flg+1)%6;//次の桁
NumPrint(NumParse(info[_flg/2], _flg%2));//セグメントを数字形に
digitalWrite(dig[_flg],LOW);//数字表示
delay(1);
}

※該当する箇所のみ抜粋

そして、今回のこのNTP時計の根本的な問題ですけど、
getLocalTime(&timeInfo);
がどの位の時間がかかるのか?という事が考えられていません。

通常数十ms?の時間がかかると思います。なので、7セグのダイナミック点灯とは両立しません。
7セグ表示はタイマ割り込みを使った方が良いです。
それにWIFIが繋がりにくい状況では時計がフリーズしてしまいます。

更に言うなら、このように1ms毎に時間を問い合わせる、というのは
時刻を提供しているサーバの迷惑にならないか?という事です。

そのような事を踏まえてスケッチを作り直した方が良いと思います。

投稿2021/05/24 07:27

nac_tnk

総合スコア463

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

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

namiki11

2021/05/24 07:47

キット基板についてきた説明書の文字列を打ち込んで使用するものだったので、あまり気にしなかったのですが、結構よろしくない点が出てくるのですね... 確かに毎秒問い合わせはサーバー負荷でご迷惑になりそうなので変えてみようと思います。 非常に参考になりました コメントありがとうございました。
guest

0

ベストアンサー

sketch_may23b:6:1: error: 'int_flg' does not name a type

変数の宣言は
型名 変数名 [= 初期値]です。
さて、プログラムの他の部分を見ると、_flg というシンボルがあります。そこから想像すると
int_flg=0;ではなく、int _flg=0; なんじゃないかと。

ketch_may23b:77:12: error: 'Numver' was not declared in this scope

numverという綴りに違和感ありませんでしたか? Numberでしょう。

sketch_may23b:85:9: error: invalid conversion from 'time_t (*)(time_t*) {aka long int (*)(long int*)}' to 'int' [-fpermissive]
今度はtimeInfoが泣き別れしています。timeという関数名かと思って処理しようとしたけど無理、とのこと。
info1 = time Info.tm_sec;

sketch_may23b:90:7: error: '_flg' was not declared in this scope
これは最初の変数宣言が成立していなかったから_flgが変数名として登録されていなかったことによるもの。最初を直せば消えるエラー。

講評するなら、

誤字を直したり

が雑。でも、C/C++の基本をもう少し勉強すれば見つかる誤りでもあるでしょう。

投稿2021/05/23 22:56

編集2021/05/23 22:59
thkana

総合スコア7639

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

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

namiki11

2021/05/24 07:48

無事に解決しました。 スペルミスや空白が抜けていた、空白が要らないのについているなど... 初歩的なミスの数々でした。この機会に一から勉強してみようと思います。 ありがとうございました。
guest

0

int_flg = 0;

まず最初だけ
この変数の定義がありません

まあ、おそらく、
int int_flg = 0;
ということだと思いますが

投稿2021/05/23 21:29

y_waiwai

総合スコア87774

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

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

namiki11

2021/05/24 07:48

無事に解決しました。 スペルミスや空白が抜けていた、空白が要らないのについているなど... 初歩的なミスの数々でした。この機会に一から勉強してみようと思います。 ありがとうございました。
guest

0

Friday Night Funkin は、主人公 BF を操作して、他のキャラクターと競い合いながらガールフレンド GF のハートを勝ち取ろうとするリズム ゲームです。 ゲームは複数のラウンドで構成され、徐々に難易度が上がっていきます。適切なビートを打って、挑戦的な敵を克服する必要があります。 このゲームは美しい音楽とグラフィックを備えており、すぐに多くのプレイヤーの注目を集めました。

投稿2023/08/18 10:38

dryfirewood

総合スコア2

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

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

0

みなさんのおかげで無事に解決しました。
スペルミスや空白が抜けていた、空白が要らないのについているなど...
初歩的なミスの数々でした。この機会に一から勉強してみようと思います。

ありがとうございました。

投稿2021/05/24 07:28

namiki11

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問