【プログラム】ESP-nowからのGMAIL

 #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();

  }

}

コメント