2025年 08月 27日
電子工作はChatGPT任せ
|

改善ポイント
1.delay() を撤廃 → millis() タイマー方式
→ WiFi タスクが止まらない。
2.Ambient送信のエラーチェック追加
→ 失敗時にログを出す。
3.WiFi再接続処理の強化
→ WiFi.disconnect(); WiFi.begin(...) で復帰を試み、再接続できたら client.stop(); ambient.begin(...) を再初期化。
4.保険として12時間ごとに自動リセット
→ 長期運用で固まるのを防ぐ。
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFi.h>
#include <Ambient.h>
const char* ssid = "Buffalo-G-3DD8";
const char* password = "******";
WiFiClient client;
Ambient ambient;
unsigned int channelId = ****; // AmbientのチャネルID
const char* writeKey = "******"; // ライトキー
#define VENTI_FAN 32
#define LED_GREEN 26
#define ONE_WIRE_BUS 33
#define SENSER_BIT 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
unsigned long lastCheck = 0;
const unsigned long checkInterval = 10000; // WiFi状態確認 10秒ごと
unsigned long lastSend = 0;
const unsigned long sendInterval = 30000; // データ送信 30秒ごと
const unsigned long autoResetTime = 1000UL*60UL*60UL*4; // 4時間ごとにリセット
void setup() {
pinMode(VENTI_FAN, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
Serial.begin(115200);
sensors.setResolution(SENSER_BIT);
WiFi.begin(ssid, password);
Serial.println("Connecting to WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected. IP: " + WiFi.localIP().toString());
ambient.begin(channelId, writeKey, &client);
}
void loop() {
unsigned long now = millis();
// ---- WiFiの状態監視 ----
if (now - lastCheck > checkInterval) {
lastCheck = now;
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi disconnected. Reconnecting...");
WiFi.disconnect();
WiFi.begin(ssid, password);
unsigned long start = millis();
while (WiFi.status() != WL_CONNECTED && millis() - start < 10000) {
delay(500);
Serial.print(".");
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nWiFi reconnected.");
client.stop(); // 古い接続をクリア
ambient.begin(channelId, writeKey, &client);
} else {
Serial.println("\nWiFi reconnect failed.");
}
}
}
// ---- データ送信 ----
if (now - lastSend > sendInterval) {
lastSend = now;
sensors.requestTemperatures();
float temp = sensors.getTempCByIndex(0);
Serial.println("Temp: " + String(temp));
ambient.set(1, temp);
if (!ambient.send()) {
Serial.println("Ambient send failed!");
} else {
Serial.println("Ambient send OK.");
}
// 温度に応じてファン制御
if (temp > 28) {
digitalWrite(VENTI_FAN, HIGH);
digitalWrite(LED_GREEN, HIGH);
} else {
digitalWrite(VENTI_FAN, LOW);
digitalWrite(LED_GREEN, LOW);
}
}
// 以下は無視
// ---- 保険:12時間ごとに再起動 ----
// if (now > autoResetTime) {
// Serial.println("Auto reset to prevent freeze.");
// ESP.restart();
// }
}
スケッチ(Arduinoのプログラム)だけじゃなく、電子回路の設計も何をしたいのか明確に伝えたらすぐさま応えてくれる。以前なら検索しまくって何日もかかった事が一瞬で出来しまう。頭を捻る部分はAI任せで自分は電子部品の組立作業だけ。趣味の電子工作の楽しみが半減してしまうような・・・?
※結局はソフトじゃなくてハードの問題だった・・・ESP-32 Wi-Fi通信エラー改善に続く
by ainame60
| 2025-08-27 15:53
| DIY・電子工作
|
Comments(0)

