IoT回転灯プロジェクト 停止ボタンなどを付けてみる
ども、今日も電子工作頑張っています。
と言うことで今日も元気に電子工作の作業録を書きます。
本日のプロジェクトは、「回転灯プロジェクト」
目標は「回転停止ボタンを追加する」
そう、回転灯はウザい。通知してくれるのは良いけれども、確認したってのぉーって場合に停止ボタンが欲しいわけです。
普通のロジックを考えると、確認しても即時に回転灯は停止しない。次回の読み込みにて処理するわけですから
どんだけ即時性を求めても、30秒。常識の範囲で10分が通例でしょうから(短いとサーバー負荷スゴいよね。)
その間隔で回転しているのは辛い…
だったら、停止ボタンが必要だ!
と言うことで今回は停止ボタンを追加しました。
回路、バーン
14番ピンにタクトスイッチを指して、反対側に3.5Vを掛けています。
そのままだったら、押したらHighの状態で継続されるので(これで少し悩んだ)
14番ピンとGNDを接続します。間に…抵抗(何オームか忘れた)を入れています。
はい、シンプルですね。
構築したソースのキモ部分です。
loop()の頭に入れて、末にあった処理待ちのdelayを消しました。
long delays = (millis() - runtime); if(delays < 10000 ){ // if (digitalRead(SWITCH_PIN) == HIGH) { // ボタンを押したら通知を停止 digitalWrite(LIGHT_PIN, LOW); } // スリープ delay(500); return; } runtime = millis();こいつもシンプルです。
delaysで処理待ちの時間を待って、その間にSWITCH_PN(14pin)の監視を行う。
もし、押された (HIGH)なら、点灯をやめる(LIGHT_PIN = LOW)んで、0.5秒末っと
10秒以上経過すると、現在時刻を掘り込んで続きのWebデータを取りに行きます。
今回は、こんな感じのシンプル系の開発でした。
次回は、ボタンを押されると、サーバに停止パケットを投げる処理です。
== ネタ ==
先日中華産のarduino NANO互換を買いましたw
[amazonjs asin=”B01CZQANN0″ locale=”JP” title=”HiLetgo Mini USB Nano V3.0 ATmega328P CH340G 5V 16M マイクロコントローラーボード Arduinoと互換”]
まさかの330円(送料込み)w ネタ的に買ってまだ通電していませんが、どうでしょうw
最後に今回の最新ソース
/* * This sketch sends data via HTTP GET requests to data.sparkfun.com service. * * You need to get streamId and privateKey at data.sparkfun.com and paste them * below. Or just customize this script to talk to other HTTP servers. * */ #include <ESP8266WiFi.h> #define LIGHT_PIN 13 #define SWITCH_PIN 14 const char* ssid = "***********"; const char* password = "***********"; const char* host = "***********"; void setup() { Serial.begin(115200); // 回転灯の制御pinを出力にする。 pinMode(LIGHT_PIN, OUTPUT); pinMode(SWITCH_PIN,INPUT) ; delay(10); // We start by connecting to a WiFi network Serial.println("\n"); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } unsigned long runtime = 0; void loop() { // 回転灯を点灯させるかの判断フラグ boolean turnOn = false; long delays = (millis() - runtime); if(delays < 10000 ){ // if (digitalRead(SWITCH_PIN) == HIGH) { // ボタンを押したら通知を停止 digitalWrite(LIGHT_PIN, LOW); } // スリープ delay(500); return; } runtime = millis(); // return; Serial.print("connecting to "); Serial.println(host); // Use WiFiClient class to create TCP connections WiFiClient client; if (!client.connect(host, 80)) { Serial.println("connection failed"); return; } // We now create a URI for the request String url = "/service/revolvinglight/light"; Serial.print("Requesting URL: "); Serial.println(url); // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); unsigned long timeout = millis(); while (client.available() == 0) { if (millis() - timeout > 5000) { Serial.println(">>> Client Timeout !"); client.stop(); return; } } // Read all the lines of the reply from server and print them to Serial String text = ""; while(client.available()){ String line = client.readStringUntil('\r'); text += line; } // Content-Type: text/plain String conent = (text.substring(text.lastIndexOf("Content-Type") + 24 + 2)); Serial.print(conent); if(conent.equals("1")){ turnOn = true; } Serial.println("closing connection"); if(turnOn){ // 点灯処理 Serial.println("turn on"); digitalWrite(LIGHT_PIN, HIGH); }else{ // 点灯処理 Serial.println("turn off"); digitalWrite(LIGHT_PIN, LOW); } }