2 有用
1 下载

物联网邮箱卫士

文件列表(压缩包大小 238.16K)

免费

概述

需要的元件

  • ESP8266 WiFi模块(ESP-01)

  • ESP programmer(USB到ESP8266适配器)

  • 微动开关 SCH48

  • Mini 360 DC / DC降压转换器

原理及流程

介绍

为了在我打开邮箱盖后收到一封电子邮件。我使用了基于ESP8266的ESP-01S模块,该模块可以连接WLAN并发送电子邮件。

下载(软件,原理图,布局)

GitHub储存库中也提供了BlackBerry程序,你也可以直接在下载区下载,电路图和本例程的布局(图像和EAGLE文件)。

这是用于设置发送电子邮件所需的SMTP2GO帐户的链接。

#include <ESP8266WiFi.h>

const char *wifi_ssid         = "YOUR-WIFI-NAME";
const char *wifi_pass         = "YOUR-WIFI-PASSWORD";

const char *mail_server       = "mail.smtp2go.com";
const int   mail_port         = 2525;
const char *mail_user_base64  = "YOUR-BASE64-SMTP2GO-USERNAME";
const char *mail_pass_base64  = "YOUR-BASE64-SMTP2GO-PASSWORD";

const char *mail_sender       = "YOUR-MAIL-SENDER";                                   // E-mail address that's shown as sender

const char *mail_recipients[] = { "YOUR-MAIL-RECIPIENT-1", "YOUR-MAIL-RECIPIENT-2" }; // Array of one or more e-mail recipients
const char *mail_subject      = "IoT mailbox guard";
const char *mail_body         = "The mailbox was opened.";

WiFiClient espClient;

void setup() {

  Serial.end();
  Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
  Serial.println();

  blink();
  
  Serial.println();
  Serial.print("Connecting to WiFi: ");
  Serial.println(wifi_ssid);
  WiFi.begin(wifi_ssid, wifi_pass);
  
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println();

  Serial.println();
  Serial.println("IP: ");
  Serial.println(WiFi.localIP());

  for (int i = 0; i < sizeof(mail_recipients) / sizeof(const char *); i++) {
  
    if (sendEmail(mail_recipients[i])) {
      Serial.println();
      Serial.println("E-Mail sent successfully.");
    } else {
      Serial.println();
      Serial.println("Error!");
    }

  }

  Serial.println();
  Serial.println("Pulling RX LOW.");
  Serial.println("Application done.");

  blink();

  // LED ON
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);

  // RX LOW
  pinMode(3, FUNCTION_3);
  pinMode(3, OUTPUT);
  digitalWrite(3, LOW);

}

void loop() {
}

bool sendEmail(const char *recipient) {

  Serial.println();
  Serial.println("Connecting to mail server");

  if (espClient.connect(mail_server, mail_port) != 1) return false;

  if (!emailResp()) return false;

  Serial.println();
  Serial.println("Sending EHLO");
  espClient.println("EHLO www.example.com");
  if (!emailResp()) return false;

/*
  Serial.println();
  Serial.println("Sending TTLS");
  espClient.println("STARTTLS");
  if (!emailResp()) return false;
*/

  Serial.println();
  Serial.println("Sending AUTH LOGIN");
  espClient.println("AUTH LOGIN");
  if (!emailResp()) return false;

  Serial.println();
  Serial.println("Sending username");
  espClient.println(mail_user_base64);
  if (!emailResp()) return false;

  Serial.println();
  Serial.println("Sending password");
  espClient.println(mail_pass_base64);
  if (!emailResp()) return false;

  Serial.println();
  Serial.println(F("Sending sender"));
  espClient.print("MAIL From: ");
  espClient.println(mail_sender);
  if (!emailResp()) return false;

  Serial.println();
  Serial.println("Sending recipient");
  espClient.print("RCPT To: ");
  espClient.println(recipient);
  if (!emailResp()) return false;

  Serial.println();
  Serial.println("Sending data");
  espClient.println("DATA");
  if (!emailResp()) return false;

  espClient.print("To: ");
  espClient.println(recipient);

  espClient.print("From: ");
  espClient.println(mail_sender);
  
  espClient.print("Subject: ");
  espClient.println(mail_subject);
  
  espClient.println("Content-Transfer-Encoding: 8bit");
  espClient.println("Content-Type: text/html; charset=\"UTF-8\"");

  espClient.println();
  
  espClient.println(mail_body);

  espClient.println(".");
  
  if (!emailResp()) return false;

  Serial.println();
  Serial.println("Ending session");
  espClient.println("QUIT");
  if (!emailResp()) return false;

  espClient.stop();
  return true;

}

bool emailResp() {
  
  byte responseCode;
  byte readByte;
  int loopCount = 0;

  while (!espClient.available()) {
    delay(1);
    loopCount++;
    if (loopCount > 20000) {
      espClient.stop();
      Serial.println("Timeout!");
      return false;
    }
  }

  responseCode = espClient.peek();
  while (espClient.available()) {
    readByte = espClient.read();
    Serial.write(readByte);
  }

  return responseCode < '4';

}

void blink() {

  // LED ON
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
  delay(25);

  // LED OFF
  digitalWrite(2, HIGH);
  pinMode(2, INPUT);
  delay(25);
  
}

iot-mailbox-guard-sch_S57Zx4O27P

iot-mailbox-guard-brd_FxmRS1U47s

电源和激活

一旦打开信箱活门的启动销就会激活微动开关,然后一个9 V电池模块和一个DC / DC降压转换器(3.3 V)就会为电路供电。

我设计了一个软锁存电路可以切断整个ESP-01S电路,所以它本身的工作完成后,在空闲状态下几乎不消耗功率。但尽管如此,我仍然需要确定9 V电源模块的确切使用寿命,我的一块9V电源已经使用了5个月,当它变成7V时才需要更换。ESP-01S可以工作在3.3 V 70 mA,发送电子邮件大约需要10秒钟。(如果WLAN接收受到干扰,则会在20秒后汇报超时,并再次禁用电路)

调节销是一根碳棒,它穿过一根黄铜管,并通过一个小的胶粘端头固定,以防止滑出。我滴加了一滴机油且使用带有长杆的微动开关来制动,制动所需的力相对较小。因此,信箱盖在“盖关闭”状态下可以安全地操作开关。附加电路仅在释放开关时才产生短路电流脉冲,从而激活软锁存电路。

外置天线

金属邮箱类似于法拉第笼,因此ESP-01S上的小型印刷天线没有良好的覆盖范围,所以我利用一个老化的闲置Linksys WRT54GL路由器,我利用了它的两根天线。

20200314_232024-scaled

_20200314_234259_ceikhkTJ4l

_20200314_234338_NfMm3hUwml

为此,我切断了印刷天线的导体,将其焊接至外部天线的同轴电缆,并用一些环氧树脂将其固定。这充分增加了发送电子邮件的范围(与图片相反,在图片中,我仅焊接了两根短漆包铜线作为临时外部天线)。

原型

我在面包板上做了第一个版本,而上面显示版本的电路是在DIY CNC上做的。

20200309_161211-scaled

安装

20200320_180949-scaled

我将铝块用作板和邮箱壁之间的垫片,用双面胶带将所有物品固定在正确的位置,当信箱盖关闭时,信箱盖会将碳棒完全推入。

ESP-01S的功能

我出于调试目的需要使用TX引脚时,以及使用RX引脚关闭软锁存电路,并且在启动时GPIO0引脚和GPIO2引脚上都发生了错误:

GPIO0a

gpio0b_xPnAd2qE05

GPIO0显然输出一个方波信号为675赫兹。

GPIO2a

gpio2b_A22l4cEt4y

GPIO2似乎正在发送一些数据。在电源切换的时候,这种现象是错误的。

由于GPIO0和GPIO2引脚的状态决定了模块的启动模式(引导或闪烁),因此我将两个引脚都通过一个上拉电阻拉至HIGH,以确保安全。同时,我也将ENABLE和RESET引脚连接至高电平。

请看下载区的代码,以了解如何将RX引脚用作普通GPIO。

最后

所有需要的文件在下载区均可找到。

via:https://www.hackster.io/shredengineer/iot-mailbox-guard-ab33c1

理工酷提示:

如果遇到文件不能下载或其他产品问题,请添加管理员微信:ligongku001,并备注:产品反馈

评论(0)

0/250