#include <Arduino.h>
#include <esp_now.h>
#include <WiFi.h>
#include "esp32-hal-log.h"
#include <freertos/FreeRTOS.h> /* FreeRTOSを用いるためのヘッダファイル */
#include <freertos/task.h>
#include "Mailer.h"
#include <esp_pm.h>
const char* wifi_ssid = "**********"; //WiFiのSSID
const char* wifi_pass = "**********"; //WiFiのパスワード
const char* smtp_username = "izumo.lab"; //アカウント名
const char* smtp_password = "bruuqvsbfnglgbcc"; //Mail向けのアプリパスワード
const char* smtp_from_address = "izumo.lab@gmail.com"; //送信元のアドレス
const int smtp_port = 465;
const char* smtp_hostname = "smtp.gmail.com";
const char* to_address = "izumo.papa@gmail.com"; //メッセージを送信するアドレス1
const char* to_address2 = "izumo.mama@gmail.com"; //メッセージを送信するアドレス2
const char* subject = "Door status From ESP32(TEST)"; //メールの件名
const char* content = "Hello, this is ESP32."; //メールの内容
const int LED_RED = 5;
const int LED_GREEN = 19;
bool ledState = false;
bool received = false;
uint8_t doorInfo = 0; //0:unknown 1:open&close 2:open 3:close
uint8_t slaveAddress[] = { 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; // 送信側のMACアドレスに書き換えます
void sleep_ms(uint32_t ms) {
vTaskDelay(ms / portTICK_PERIOD_MS);
}
void reset_wifi() {
WiFi.persistent(false);
WiFi.disconnect();
WiFi.mode(WIFI_OFF);
delay(10);
}
Mailer mail(smtp_username, smtp_password, smtp_from_address, smtp_port, smtp_hostname);
void LED_blink(uint32_t ms){
digitalWrite(LED_RED, HIGH);
sleep_ms(ms);
digitalWrite(LED_RED, LOW);
}
void mailSend(const char* msg){
log_i("Hello, this is ESP32.");
log_i("Connecting to ", wifi_ssid);
reset_wifi();
WiFi.mode(WIFI_STA);
WiFi.begin(wifi_ssid, wifi_pass);
while (WiFi.status() != WL_CONNECTED) {
log_i("wait...");
sleep_ms(1000);
}
log_i("WiFi connected");
log_i("IP Address: %s", WiFi.localIP().toString().c_str());
mail.send(to_address,to_address2, subject, msg);
//WiFiを切断
WiFi.mode(WIFI_OFF);
LED_blink(50);
}
void sendMail(int doorState){
if(doorState==LOW){
mailSend("DoorLock opened.TEST");
//esp_sleep_enable_ext0_wakeup(GPIO_NUM_15, HIGH);
}else{
mailSend("DoorLock closed.TEST");
//esp_sleep_enable_ext0_wakeup(GPIO_NUM_15, LOW);
}
}
void flashLed(int pin) {
digitalWrite(pin, HIGH);
delay(500);
digitalWrite(pin, LOW);
}
void onSend(const uint8_t* mac_addr, esp_now_send_status_t status) {
char macStr[18];
snprintf(macStr, sizeof(macStr), "%02X:%02X:%02X:%02X:%02X:%02X",
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
Serial.println(macStr);
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Success" : "Failed");
}
void onReceive(const uint8_t* mac_addr, const uint8_t* data, int data_len) {
char macStr[18];
snprintf(macStr, sizeof(macStr), "%02X:%02X:%02X:%02X:%02X:%02X",
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
Serial.println();
Serial.printf("Last Packet Recv from: %s\n", macStr);
Serial.printf("Last Packet Recv Data(%d): ", data_len);
for (int i = 0; i < data_len; i++) {
Serial.print(data[i]);
Serial.print(" ");
if (data[i] == 222) {
flashLed(LED_RED);
received = true;
doorInfo = 1; //1:open&close
}
}
}
void espNow_start() {
WiFi.mode(WIFI_STA);
WiFi.disconnect();
if (esp_now_init() == ESP_OK) {
Serial.println("ESP-Now Init Success");
}
flashLed(LED_RED);
esp_now_peer_info_t peerInfo = {}; //ココ重要
memcpy(peerInfo.peer_addr, slaveAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Failed to add peer");
return;
}
esp_now_register_send_cb(onSend);
esp_now_register_recv_cb(onReceive);
}
void setup() {
Serial.begin(115200);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
flashLed(LED_RED);
flashLed(LED_GREEN);
Serial.println(WiFi.macAddress()); // このアドレスを送信側へ登録します
espNow_start();
}
void loop() {
// put your main code here, to run repeatedly:
uint8_t data[2] = { 33,55}; // 送信データ
if(received){
delay(100);
received = false;
esp_err_t result = esp_now_send(slaveAddress, data, sizeof(data));
if (result == ESP_OK) {
Serial.println("Sent with success");
}
else {
Serial.println("Error sending the data");
}
digitalWrite(LED_GREEN, HIGH);
sendMail(doorInfo);
digitalWrite(LED_GREEN, LOW);
doorInfo = 0;
espNow_start();
}
}
コメント
コメントを投稿