Arduino UNO R4 WiFi で外気温を測る ③ Webクライアントの7セグLEDに温度を表示

 前回までで、2台のマイコン・ボードを用いて外気温などを測りました。

  • Arduino UNO R4 WiFi  センサBME280で気圧、温度、湿度を測定し、Webサーバを運用
  • Arduino UNO R4 WiFi  ①をアクセスするWebClientを動かして、センサ・データを受け取る

 ここでは、②のマイコン・ボードに4桁の7セグメントLEDをつないで、受け取った温度を表示します。①のマイコン・ボードはPCとは別電源で動作させています。

環境

  • Arduino IDE;2.3.9
  • Windows11;25H2
  • Arduino UNO R4 WiFi 1.5.1 PCはマザーボードのUSBポートから直接つなぐ。

4桁の7セグメントLED

 利用する7セグメントLEDはアマゾンで購入したLEDディスプレイ 4桁 0.56インチです。コントローラはHT16K33で、4ピンのI2Cバスで接続します。4ピンのピンヘッダが同梱されていますが、別途入手したQWIICの4ピン・コネクタ(SCL、SDA、GND、Vcc)をはんだ付けしました。

 7セグメントLEDで使えるコントローラにはHT16K33以外にもあります。時計の表示により適したものや、もっと多桁表示にすることのできるコントローラもあります。

4桁の7セグメントLED用コントローラHT16K33のライブラリを利用

 HT16K33ライブラリを検索します。

 いくつも発見できますが、詳細情報を読んで、floatの実数をそのまま表示できる機能のあるライブラリを探します。数値を表示するだけならライブラリを使わなくてもスケッチでたやすく記述できますが、小数点のdotを表示する処理が面倒です。

 サンプルのdemo1.inoを読み込み、以下の部分を修正します。

11行目;

HT16K33 seg(0x70, &Wire1);
 
 25,26行目;
 
  Wire1.begin();
  Wire1.setClock(100000);
 
 実行します。
 

WebClientとHT16K33ライブラリを合体

 Webサーバのデータを読み込むところと、7セグメントLEDを表示する二つのスケッチを合体させます。

#include <math.h>
#include "WiFiS3.h"
#include <Arduino_JSON.h> JSONVar temperature, pressure, humidity; float Temperature, Pressure, Humidity; uint8_t buf[256] ; #include "arduino_secrets.h" char ssid[] = SECRET_SSID; // your network SSID (name) char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP) #include "HT16K33.h" HT16K33 seg(0x70, &Wire1); int status = WL_IDLE_STATUS; IPAddress server(192,168,111,103); // numeric IP for Google (no DNS) WiFiClient client; /* -------------------------------------------------------------------------- */ void setup() { /* -------------------------------------------------------------------------- */ //Initialize serial and wait for port to open: Serial.begin(9600); delay(3000); Serial.println("\nstart WebClient received JSON HT16K33"); Wire1.begin(); Wire1.setClock(100000); seg.begin(); seg.displayOn(); seg.displayClear(); // check for the WiFi module: if (WiFi.status() == WL_NO_MODULE) { Serial.println("Communication with WiFi module failed!"); // don't continue while (true); } String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) { Serial.println("Please upgrade the firmware"); } // attempt to connect to WiFi network: while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(ssid, pass); // wait 10 seconds for connection: delay(10000); } printWifiStatus(); Serial.println("\nStarting connection to server..."); // if you get a connection, report back via serial: if (client.connect(server, 80)) { Serial.println("connected to server"); // Make a HTTP request: client.println("GET /search?q=arduino HTTP/1.1"); client.println("Host: www.google.com"); client.println("Connection: close"); client.println(); } } String strbuf; void read_response() { while (client.available()) { while (true){ client.read(buf, sizeof(buf)); // Serial.print("read 1line: ");Serial.println((char*)buf); // 1line read strbuf = String((char*)buf); int kakko = strbuf.indexOf("{"); //Serial.println("find { ");Serial.println(kakko); if (kakko != -1){ break; } } String kakkoikou = strbuf.substring(strbuf.indexOf("{")); //Serial.println(kakkoikou); //Serial.println(kakkoikou.length()); kakkoikou.toCharArray((char*)buf, kakkoikou.length()); JSONVar senserObject = JSON.parse((const char*)buf); Serial.print("senserObject: ");Serial.println(senserObject); if (isnan((double) senserObject["temperature"])) { break; } Temperature = (double) senserObject["temperature"]; Pressure = (double) senserObject["pressure"]; Humidity = (double) senserObject["humidity"]; Serial.print("\nTemperature = "); Serial.println(Temperature); Serial.print("Pressure = "); Serial.println(Pressure); Serial.print("Humidity = "); Serial.println(Humidity); } } void loop() { seg.displayClear(); delay(1000); read_response(); seg.displayFloat(Temperature); // if the server's disconnected, stop the client: if (!client.connected()) { Serial.println(); Serial.println("disconnecting from server."); client.stop(); // do nothing forevermore: while (true); } } void printWifiStatus() { // print the SSID of the network you're attached to: Serial.print("connected SSID: "); Serial.println(WiFi.SSID()); // print your board's IP address: IPAddress ip = WiFi.localIP(); //Serial.print("IP Address: "); //Serial.println(ip); // print the received signal strength: long rssi = WiFi.RSSI(); //Serial.print("signal strength (RSSI):"); //Serial.print(rssi); //Serial.println(" dBm"); }

 実行しました。

seg.displayFloat(Temperature);

で、読み取った実数の温度をそのまま表示できました。

前へ

Arduino UNO R4 WiFi で外気温を測る ② Webサーバに温度、湿度、気圧を表示