前提・実現したいこと
ArduinoUno、Ethernetシールド、圧力センサ、RTCモジュールを用いて、圧力が加わった時間とネット上に表示したいと考えています。
500以上の圧力が一定時間以上加われば「時間+good morning」、200以下の圧力ならば「時間+good night」と表示する予定です。
「〜年〜月〜日〜:〜:〜
state:Good Morning」
または
「〜年〜月〜日〜:〜:〜
state:Good Night」
とシリアルモニタ&webブラウザ上で確認可能なプログラムを実現したいと思っています。
発生している問題・エラーメッセージ
シリアルモニタでは 「〜年〜月〜日〜:〜:〜 state:Good Morning」 といったように表示されているのですが、指定したipアドレスに接続すると全く何も表示されていません。 一方でEthernetシールドに有線を接続している間は、指定したIPアドレスに接続できます。(文字は一切何も表示されませんが) マイコンボードに書き込む際もエラーが表示されず問題なく書き込みはでき、シリアルモニタで表示したい内容は問題なく確認できるのですが、ネット上では何も表示されないということはLANの処理を誤っているのかとも思うのですが、自分で考えたのですが全くわからないため教えていただけたら幸いです。 ![圧力センサに力を加えるとこのような文字が表示されます。](98b1f553ec72de8ca4e46decc26e0cf0.png)
該当のソースコード
#include <DS3232RTC.h> #include <TimeLib.h> #include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1 }; IPAddress ip(0, 0, 0, 0); //この2つは実際にはちゃんと入力しています EthernetServer server(80); const int unknown=0; const int getup=1; const int sleep=2; //状態が変化してから確定するまでに待機する時間 const int timeToWait=1000; //寝てると判断する閾値 const int thresholdH=500; //起きてると判断する閾値 const int thresholdL = 200; int state=unknown; int nextState=unknown; int lastChange=0; int lastpresState=unknown; void setup() { // put your setup code here, to run once: setTime(14, 27, 0, 16, 11, 2020); RTC.set(now()); Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.println("Ethernet WebServer Example"); // start the Ethernet connection and the server: Ethernet.begin(mac, ip); // Check for Ethernet hardware present if (Ethernet.hardwareStatus() == EthernetNoHardware) { Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :("); while (true) { delay(1); // do nothing, no point running without Ethernet hardware } } if (Ethernet.linkStatus() == LinkOFF) { Serial.println("Ethernet cable is not connected."); } // start the server server.begin(); Serial.print("server is at "); Serial.println(Ethernet.localIP()); } void loop() { // put your main code here, to run repeatedly: tmElements_t tm; RTC.read(tm); //時間の設定 //センサから明るさを読み取る int pres=analogRead(1); //現在の時刻を取得 unsigned long now=millis(); //現在のセンサの状態を表す変数の初期に前回のセンサの状態を代入 int presState=lastpresState; //読み取った値と閾値を比較して現在のセンサの状態をセット if(pres>thresholdH){ presState=getup; } else if(pres<thresholdL){ presState=sleep; } if(lastpresState != presState){ if(presState==getup){ nextState=getup; lastChange=now; } else if(presState==sleep){ nextState=sleep; lastChange=now; } } lastpresState=presState; if((state != nextState)&&((now - lastChange) >timeToWait)){ if(nextState==getup){ Serial.print(tm.Year + 1970, DEC); Serial.print("年"); Serial.print(tm.Month,DEC); Serial.print("月"); Serial.print(tm.Day, DEC); Serial.print("日"); Serial.print(tm.Hour,DEC); Serial.print("時"); Serial.print(tm.Minute,DEC); Serial.print("分"); Serial.println(tm.Second, DEC); Serial.print("STATE:"); Serial.print("GOOD NIGHT\n"); } else if(nextState==sleep){ Serial.print(tm.Year + 1970, DEC); Serial.print("年"); Serial.print(tm.Month,DEC); Serial.print("月"); Serial.print(tm.Day, DEC); Serial.print("日"); Serial.print(tm.Hour,DEC); Serial.print("時"); Serial.print(tm.Minute,DEC); Serial.print("分"); Serial.println(tm.Second, DEC); Serial.print("STATE:"); Serial.print("GOOD MORNING\n"); } state=nextState; } //以下LANの処理 EthernetClient client = server.available(); //クライアントからの測定データの要求の有無を確認 if (client) { Serial.println("new client"); // an http request ends with a blank line boolean currentLineIsBlank = true; while (client.connected()) { //クライアントが接続されている限り if (client.available()) { //クライアントからの読み取りデータがある場合 int c = client.read(); Serial.write(c); // if you've gotten to the end of the line (received a newline // character) and the line is blank, the http request has ended, // so you can send a reply if (c == '\n' && currentLineIsBlank) { // send a standard http response header client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); // the connection will be closed after completion of the response client.println("Refresh: 5"); // refresh the page automatically every 5 sec client.println(); client.println("<!DOCTYPE HTML>"); client.println("<html>"); //センサから圧力を読み取る int pres=analogRead(1); unsigned long now=millis(); int presState=lastpresState; if(pres>thresholdH){ presState=getup; } else if(pres<thresholdL){ presState=sleep; } if(lastpresState != presState){ if(presState==getup){ nextState=getup; lastChange=now; } else if(presState==sleep){ nextState=sleep; lastChange=now; } } lastpresState=presState; if((state != nextState)&&((now - lastChange) >timeToWait)){ if(nextState==getup){ Serial.print(tm.Year + 1970, DEC); Serial.print("年"); Serial.print(tm.Month,DEC); Serial.print("月"); Serial.print(tm.Day, DEC); Serial.print("日"); Serial.print(tm.Hour,DEC); Serial.print("時"); Serial.print(tm.Minute,DEC); Serial.print("分"); Serial.println(tm.Second, DEC); Serial.print("STATE:"); Serial.print("GOOD NIGHT\n"); } else if(nextState==sleep){ Serial.print(tm.Year + 1970, DEC); Serial.print("年"); Serial.print(tm.Month,DEC); Serial.print("月"); Serial.print(tm.Day, DEC); Serial.print("日"); Serial.print(tm.Hour,DEC); Serial.print("時"); Serial.print(tm.Minute,DEC); Serial.print("分"); Serial.println(tm.Second, DEC); Serial.print("STATE:"); Serial.print("GOOD MORNING\n"); } state=nextState; } client.println("</html>"); break; } if (c == '\n') { // you're starting a new line currentLineIsBlank = true; } else if (c != '\r') { // you've gotten a character on the current line currentLineIsBlank = false; } } } // give the web browser time to receive the data delay(100); // close the connection: client.stop(); Serial.println("client disconnected"); } }```
試したこと
void loop内の、「EthernetClient client = server.available();」以下が間違っていると考えたのですが、どこを書き直せばいいのかわかりませんでした。
補足情報(FW/ツールのバージョンなど)
Arduino 1.8.13
DS3232 RTCモジュール
回答1件
あなたの回答
tips
プレビュー