我慢できない人ら
勉強は大事です
環2の事故
Wi-Fiで車載バッテリーモニター (ソースコードと回路) 








/*
* クソ恐ろしく簡単なコードなのだが、著作権は放棄しない www あっきー@660
*
* 車両鉛battery電圧監視、定時刻通信
* for dicordにメッセージ送信
*
* AD1で入力、最大でも2.5Vまでしか入力できないので分圧抵抗を使用
* 測定対象の電圧 (最大15V)
* │
* ┌┴┐
* │ │ R1 = 10 kΩ
* └┬┘
* ├─────── ➔ ESP32-C3 のアナログ入力ピン (最大2.5V)
* ┌┴┐
* │ │ R2 = 2.0 kΩ
* └┬┘
* │
*──────┴─────── ➔ ESP32-C3 の GND
*/
#include <WiFi.h>
#include <HTTPClient.h>
#include <time.h>
#include <esp_sntp.h>
//
// global
//
const int VOLTAGE_ILLEGAL_ERROR = 1;
//
// Wi-Fi設定
// 2.4GHz帯のみ接続可能
//
const char* ssid = "自分の家のWi-Fi-SSIDをいれてね";
const char* password = "機器のパスワード"; // まぁ、ソース上は平文だけどメンドクサイのでこれでカンベンして頂きたい
//
// 時間日時関係
//
static struct tm timeinfo;
const int JST = 3600 * 9;
const char* ntpServer1 = "ntp.nict.jp";
const char* ntpServer2 = "time.google.com";
const char* ntpServer3 = "ntp.jst.mfeed.ad.jp";
//
// Discord Webhook URL
//
const char* webhook_url = "ここにDiscordのwebhook urlアドレスを入力";
//
// 使用するアナログピン(ESP32-C3のADC1_CH1 = GPIO1)
//
#define ANALOG_PIN A0 // 使用するアナログピンに合わせる
//
// スリープ時間(マイクロ秒単位:1時間 = 3600秒 = 3600,000,000us)
//
#define TIME_TO_SLEEP 3600000000ULL
//
// prototype
//
void sendDiscordMessage(String message);
void GetLocalTime();
void timeavailable(struct timeval *t);
//
// setup
//
void setup() {
Serial.begin(115200);
delay(500); // シリアル初期化待ち
Serial.println("\nESP32-C3起動");
//
// アナログ値(AD0)の読み取り
// ESP32-C3のデフォルトの分解能は12bit(0〜4095)
// ADCのアッテネータを11dBに設定 (最大約2.5V〜2.6V)
//
Serial.println("\n電圧読み込み中");
analogReadResolution(12);
float adc_value = analogReadMilliVolts(ANALOG_PIN);
float pin_voltage = adc_value / 1000.0; // Vに変換
//
// 分圧比(6倍)を掛けて、元の測定電圧を復元
// 分圧比 = (R1 + R2) / R2 = (10 + 2) / 2 = 6.0
//
float actual_voltage = pin_voltage * 6.0;
//
// 実際のマルチテスター電圧との差を入力
//
actual_voltage += 0.08;
//
// Wi-Fi接続の開始
//
Serial.print("\nWiFi接続中 ");
Serial.println(ssid);
WiFi.begin(ssid, password);
//
// 接続完了を待つ(最大20秒のタイムアウトを設定)
//
int timeout_counter = 0;
Serial.print("\nWiFi接続待機中 ");
while (WiFi.status() != WL_CONNECTED && timeout_counter < 40) {
delay(500); // 500msec x 40cycle = 20sec
Serial.print(".");
timeout_counter++;
}
//
// Wi-Fi接続に成功した場合のみ送信処理を実行
//
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nWiFi接続完了");
//
// timeサーバーに接続して現在時間読み込み
//
Serial.println("\n現時間読み込み中");
sntp_set_time_sync_notification_cb( timeavailable );
configTime(JST, 0, ntpServer1, ntpServer2, ntpServer3); // timeサーバーセット
GetLocalTime();// 日時読み出し
//
// 電圧判別
//
Serial.println("\n電圧および時刻判定中");
int level = 0; // 異常レベル 0は正常 0以外は異常
String msg;
if( actual_voltage >= 0.0 && actual_voltage <= 9.5) {
msg = "車載鉛バッテリーが大変危険な状態";
level = VOLTAGE_ILLEGAL_ERROR;
}
if( actual_voltage > 9.5 && actual_voltage <= 11.0 ) {
msg = "車載鉛バッテリーが危険な状態";
level = VOLTAGE_ILLEGAL_ERROR;
}
if( actual_voltage > 11.0 && actual_voltage <= 12.0 ) {
msg = "鉛バッテリーに至急充電してください";
level = VOLTAGE_ILLEGAL_ERROR;
}
if( actual_voltage > 12.0 && actual_voltage <= 12.3 ) {
msg = "車載鉛バッテリーに補充電が必要";
}
if( actual_voltage > 12.3 && actual_voltage <= 12.5 ) {
msg = "車載鉛バッテリーは早めの補充電が必要";
}
if( actual_voltage > 12.5 && actual_voltage <= 13.1 ) {
msg = "車載鉛バッテリーの電圧は正常範囲です";
}
if( actual_voltage > 13.1 && actual_voltage <= 15.0 ) {
msg = "車載鉛バッテリーの電圧が高いため点検が必要";
}
//
// 送信するメッセージ文字列を作成
//
String message = "バッテリー状況の定期報告\\n";
message += "現在の電圧"+String(actual_voltage,2) +"[V]\\n";
message += msg + "\\n";
message += String(timeinfo.tm_year)+"年"+String(timeinfo.tm_mon)+"月"+String(timeinfo.tm_mday)+"日\\n";
message += String(timeinfo.tm_hour)+"時"+String(timeinfo.tm_min)+"分"+String(timeinfo.tm_sec)+"秒\\n";;
//
// 時間読み出しがおかしかった場合
//
if(timeinfo.tm_year == 1900 ) { // 時間がネットより正確に読み出しできなかったら
Serial.println("\n時間が不明のため、電圧情報を送信開始");
sendDiscordMessage(message);
} else {
//
// 8時〜23時までの間はこれで送信する
//
if( timeinfo.tm_hour >= 8 && timeinfo.tm_hour <= 23 ) {
Serial.println("\n8〜23時は無条件で電圧情報を送信開始");
sendDiscordMessage(message);
} else {
//
// ただし、0〜7時までで電圧が12.0V以下なら警告する
//
if( level == VOLTAGE_ILLEGAL_ERROR) {
Serial.println("\n0〜7時は基本電圧送信しないが電圧が著し異常なため送信開始");
sendDiscordMessage("緊急モード\\n" + message);
}
}
}
} else {
//
// WiFi connrect error
//
Serial.println("\nWiFiに接続できなかった");
}
//
// とくに意味はない www
//
Serial.println("Deep Sleepまで30秒待ってから開始");
sleep(30000);
//
// Deep Sleepのタイマー設定と移行
//
Serial.println("ディープスリープ開始、復帰は1時間後の予定");
Serial.flush(); // シリアル出力の完了を待つ
//
//deep sleep開始
//
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP);
esp_deep_sleep_start();
}
//
// setup後にすぐDeep Sleepに入るため、loop内の処理は実行されない
//
void loop() {
}
//
// Discordへメッセージを送信する関数
//
void sendDiscordMessage(String message) {
HTTPClient http;
//
// Webhook URLを設定
//
http.begin(webhook_url);
http.addHeader("Content-Type", "application/json");
//
// JSON形式のデータを生成
//
String json_payload = "{\"content\": \"" + message + "\"}";
//
// POSTリクエストを送信
//
int httpResponseCode = http.POST(json_payload);
//
//
//
if (httpResponseCode > 0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode); // 204なら送信成功だよーん
} else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
http.end(); // リソース解放
}
//
// local time 読み込み
//
void GetLocalTime()
{
timeinfo = {0}; // すべてのメンバを0に初期化
//
// 現在時間読み込み
//
if(!getLocalTime(&timeinfo)){
Serial.println("時刻の取得に失敗しました");
return;
}
timeinfo.tm_year += 1900; // 定数加算
timeinfo.tm_mon += 1; // 定数加算
Serial.println("現在時間");
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}
//
// Callback function
//
void timeavailable(struct timeval *t)
{
Serial.println("GNTPから時刻調整を行いました");
}
//-----------------------------------
// EOF
//-----------------------------------
バッテリーのその後 & WiFi 車載バッテリー監視 













|
ワロタ w カテゴリ:その他(カテゴリ未設定) 2022/07/24 20:12:57 |
![]() |
![]() |
ダイハツ コペン 大人の為の1:1プラモデルです。 車検/整備/改造/パーツ製作/燃調セッティングまです ... |
![]() |
トヨタ ハリアーハイブリッド 特にない |
![]() |
ホンダ バモスホビオ 仕事で使用する荷物などの運搬に・・・ もちろん走りの5MT それも珍しい8PRモデル ... |