- 开始之前要记住的事情
- 所需组件
- 电路原理图
- 设置SMTP2GO服务器发送电子邮件
- 编程AVR单片机Atmega16和ESP8266
- 编程ATmega16发送电子邮件
- 编程ESP8266 NodeMCU
Atmega16是低成本的8位微控制器,并且比其先前版本的微控制器具有更多的GPIO。它具有所有常用的通信协议,例如UART,USART,SPI和I2C。由于其广泛的社区支持和简便性,它在机器人技术,汽车和自动化行业具有广泛的应用。
Atmega16不支持Wi-Fi和Bluetooth等任何无线通信协议,这限制了其在IoT等领域的应用范围。为了克服该限制,可以连接具有无线协议的其他控制器。有许多支持无线协议的控制器,例如广泛使用的ESP8266,
今天,我们将Atmega16与ESP8266 NodeMCU接口 ,使其通过Internet无线通信。ESP8266 NodeMCU是广泛使用的WiFi模块,具有社区支持和易于使用的库。ESP8266 NodeMCU也可以通过Arduino IDE轻松编程。ESP8266可以与任何微控制器接口:
在本教程中,将使用ESP8266 NodeMCU模块和Atmega16发送电子邮件。该指令由Atmega16给出,ESP8266收到指令后,会向选定的电子邮件接收者发送电子邮件。ATmega16和ESP8266 NodeMCU将通过UART串行通信进行通信。虽然可以使用任何通信协议来连接ATmega16和ESP8266 NodeMCU,例如SPI,I2C或UART。
开始之前要记住的事情
请注意,本项目中使用的Atmega16微控制器工作在5V逻辑电平,而ESP8266 NodeMCU工作在3.3V逻辑电平。这两个微控制器的逻辑电平不同,这可能会导致Atmega16与ESP8266 NodeMCU之间的某些通信错误,或者如果不保持适当的逻辑电平,也可能会导致数据丢失。
然而,在浏览完这两个微控制器的数据表后,我们发现我们可以在没有任何逻辑电平偏移的情况下进行连接,因为ESP8266 NodeMCU的所有引脚都可以承受高达6V的电压。因此,采用5V逻辑电平很好。此外,Atmega16的数据表明确指出,高于2V的电压电平被视为逻辑电平'1',并且ESP8266 NodeMCU的运行电压为3.3 V,这意味着如果ESP8266 NodeMCU传输3.3V,则Atmega16可以将其视为逻辑电平'1'。因此,无需使用逻辑电平转换即可进行通信。尽管您可以自由使用5V至3.3V的逻辑电平转换器。
在此处查看所有与ESP8266相关的项目。
所需组件
- ESP8266 NodeMCU模块
- Atmega16单片机IC
- 16Mhz晶体振荡器
- 两个100nF电容器
- 两个22pF电容器
- 按钮
- 跳线
- 面包板
- USBASP v2.0
- LED(任何颜色)
电路原理图
设置SMTP2GO服务器发送电子邮件
在开始编程之前,我们需要一个SMTP服务器通过ESP8266发送邮件。在线有很多SMTP服务器可用。在这里,smtp2go.com将用作SMTP服务器。
因此,在编写代码之前,将需要SMTP用户名和密码。要获得这两个凭据,请按照以下步骤进行操作,该步骤将涵盖设置SMTP服务器以成功发送电子邮件。
步骤1:-单击“免费试用SMTP2GO”以注册一个免费帐户。
步骤2:-将会弹出一个窗口,您需要在其中输入一些凭据,例如名称,电子邮件ID和密码。
步骤3:-注册后,您将在输入的电子邮件中收到激活请求。从电子邮件中的验证链接激活您的帐户,然后使用您的电子邮件ID和密码登录。
步骤4:-登录后,您将获得SMTP用户名和SMTP密码。记住这些或将其复制到您的记事本中以备将来使用。在此之后,单击“完成”。
步骤5:-现在,在左侧访问栏中,单击“设置”,然后单击“用户”。在这里,您可以查看有关SMTP服务器和端口号的信息。通常如下:
编码用户名和密码
现在,我们必须以ASCII字符集更改base64编码格式的用户名和密码。要以base64编码格式转换电子邮件和密码,请使用一个名为BASE64ENCODE(https://www.base64encode.org/)的网站。复制编码的用户名和密码,以备将来使用:
完成这些步骤后,即可对ESP8266 NodeMCU和Atmega16 IC进行编程。
编程AVR单片机Atmega16和ESP8266
编程将包括两个程序,一个用于Atmega16充当指令的发送程序,另一个用于ESP8266 NodeMCU充当指令的接收程序。这两个程序都在本教程的结尾给出。Arduino IDE用于刻录ESP8266和USBasp编程器,而Atmel Studio用于刻录Atmega16。
一个按钮和LED与Atmega16相连,因此当我们按下按钮时,Atmega16将向NodeMCU发送指令,而NodeMCU将相应地发送电子邮件。LED将显示数据传输状态。因此,我们开始对Atmega16进行编程,然后对ESP8266 NodeMCU进行编程。
编程ATmega16发送电子邮件
首先定义工作频率并包括所有必需的库。使用的库随Atmel Studio软件包一起提供。
#定义 F_CPU 16000000UL 的#include 的#include
此后,必须定义波特率以便与ESP8266通讯。请注意,两个控制器(即Atmega16和NodeMCU)的波特率必须相似。在本教程中,波特率为9600。
#定义BAUD_PRESCALE(((( F_CPU /(USART_BAUDRATE * 16UL)))-1)
两个寄存器UBRRL和UBRRH将用于加载波特率值。波特率的低8位将载入UBRRL,波特率的高8位将载入UBRRH。为简单起见,请使用UART初始化功能,其中波特率将按值传递。UART初始化功能将包括:
- 将寄存器UCSRB中的发送和接收位置1。
- 在寄存器UCSRC中选择8位字符大小。
- 在UBRRL和UBRRH寄存器中加载波特率的低位和高位。
无效UART_init(long USART_BAUDRATE) { UCSRB-=(1 << RXEN)-(1 << TXEN); UCSRC-=(1 << URSEL)-(1 << UCSZ0)-(1 << UCSZ1); UBRRL = BAUD_PRESCALE; UBRRH =(BAUD_PRESCALE >> 8); }
下一步将设置传输字符的功能。此步骤包括等待空缓冲区完成,然后将char值加载到UDR寄存器。字符将仅在函数中传递。
void UART_TxChar(char c) { while(!(UCSRA&(1 <
而不是传输字符,而是使函数发送如下所示的字符串。
无效UART_sendString(char * str) { unsigned char s = 0; while(str!= 0) { UART_TxChar(str); s ++; } }
在 main() 函数中,调用 UART_init() 开始传输。并通过将TEST字符串发送到NodeMCU进行回声测试。
UART_init(9600); UART_sendString(“ TEST”);
开始为LED和按钮配置GPIO引脚。
DDRA-=(1 << 0); DDRA&=〜(1 << 1); PORTA-=(1 << 1);
如果未按下按钮,则保持LED点亮;如果按下按钮,则开始向NodeMCU发送“ SEND”命令,并使LED熄灭。
if(bit_is_clear(PINA,1)) { PORTA-=(1 << 0); _delay_ms (20); } else { PORTA&=〜(1 << 0); _delay_ms (50); UART_sendString(“ SEND”); _delay_ms (1200); }
编程ESP8266 NodeMCU
对NodeMCU进行编程包括从Atmega16接收命令以及使用一台SMTP服务器发送电子邮件。
首先,包括WIFI库,因为互联网将用于发送电子邮件。定义您的WIFI ssid和密码以成功连接。还定义SMTP服务器。
#包括
在 setup() 函数中,将类似于Atmega16的波特率设置为9600,然后连接到WIFI并显示IP地址。
Serial.begin(9600); Serial.print(“ Connecting To:”); Serial.println(ssid); WiFi.begin(ssid,密码); 而(WiFi.status()!= WL_CONNECTED) { delay(500); Serial.print(“。”); }
在 loop() 函数中,读取Rx引脚上的接收字节并将其转换为字符串形式。
if(Serial.available()> 0){ while(Serial.available()> 0 && index1 <6) { delay(100); inChar = Serial.read(); inData = inChar; index1 ++; inData ='\ 0'; } variable.toUpperCase(); for(字节i = 0; i <6; i ++){ variable.concat(String(inData)); } Serial.print(“ variable is =”); Serial.println(变量); Serial.print(“ indata is =”); Serial.println(inData); 延迟(20); } String string = String(variable);
如果接收命令匹配,则通过调用sendEmail()函数将电子邮件发送给收件人。
如果(string ==“ SEND”){ sendEmail(); Serial.print(“邮件发送至:”); Serial.println(“收件人”); Serial.println(“”); }
设置SMTP服务器非常重要,如果不这样做,则无法发送电子邮件。另请注意,在通信时,两个控制器的波特率设置应相似。
因此,这就是ESP8266与AVR微控制器接口以使其能够进行IoT通信的方式。还要检查下面给出的工作视频。