|
Atmega16是一款低成本的8位微控制器,与之前版本的微控制器相比,其GPIO数量更多。它具有所有常用的通信协议,如UART、USART、SPI和I2C。由于其广泛的社区支持和简单性,它在机器人、汽车和自动化行业中具有广泛的应用。
Atmega16不支持任何无线通信协议,如Wi-Fi和蓝牙,这限制了其在某些领域内的应用领域,如物联网。为了克服这种限制,可以连接支持无线协议的其他控制器。有许多控制器支持无线协议,如被广泛使用的ESP8266等。
在本篇文章中,我们将Atmega16微控制器与ESP8266 NodeMCU进行连接,使其通过互联网进行无线通信。 ESP8266 NodeMCU是广泛使用的WiFi模块,具有完善的社区支持和易于使用的库。 ESP8266 NodeMCU也可以使用Arduino IDE轻松实现编程。在本文中,将使用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.3V,这意味着如果ESP8266 NodeMCU正在发送3.3V,那么Atmega16可以将其作为逻辑电平'1'。因此,无需使用逻辑电平转换即可进行通信。您也可以使用5到3.3V的逻辑电平转换器。
所需的组件 ● ESP8266 NodeMCU模块 ● Atmega16微控制器 ● 16Mhz晶体振荡器 ● 按钮 ● 跳线 ● 面包板 ● USBASP v2.0
电路原理图
设置SMTP2GO服务器以发送电子邮件 在开始编程之前,我们需要一个SMTP服务器来通过ESP8266发送邮件。网上有很多SMTP服务器。在这里,smtp2go.com将用作SMTP服务器。
因此,在编写代码之前,将需要SMTP用户名和密码。要获取这两个凭据,请按照以下步骤操作,其中包括设置SMTP服务器以成功发送电子邮件。
第1步: - 点击“Try SMTP2GO Free”注册一个免费帐户。
第2步: - 将弹出一个窗口,您需要输入一些凭据,如姓名、电子邮件ID和密码。
第3步: - 注册后,您将在输入的电子邮件中收到激活请求。从电子邮件中的验证链接激活您的帐户,然后使用您的电子邮件ID和密码登录。
第4步: - 登录后,您将获得SMTP用户名和SMTP密码。请记住或将这些内容复制到记事本中以供进一步使用。之后点击“Finish”。
第5步: - 现在在左侧访问栏上,单击“Settings”,然后单击“Users”。在这里,您可以看到有关SMTP服务器和PORT端口的信息。通常如下:
编码用户名和密码 现在我们必须使用ASCII字符集更改base64编码格式的用户名和密码。要以base64编码格式转换电子邮件和密码,请使用名为BASE64ENCODE(https://www.base64encode.org/)的网站。复制编码的用户名和密码,以供进一步使用:
完成这些步骤后,接下来编程ESP8266 NodeMCU和Atmega16控制器。
编程AVR微控制器Atmega16和ESP8266 编程将包括两个程序,一个用于Atmega16作为指令发送器,另一个用于ESP8266 NodeMCU作为指令接收器。这两个程序的完整代码都在本文的末尾给出。 Arduino IDE和USBasp编程器用于烧写ESP8266程序,Atmel Studio用于烧写Atmega16程序。
将按钮和LED与Atmega16连接,当我们按下按钮时,Atmega16将向NodeMCU发送指令,NodeMCU将相应地发送电子邮件。 LED将显示数据传输的状态。那么让我们开始编程Atmega16,然后是ESP8266 NodeMCU。
编程ATmega16用于发送电子邮件 首先定义工作主频并包括所有必需的库。使用的库在Atmel Studio安装包中。 - #define F_CPU 16000000UL
- #include<avr/io.h>
- #include<util/delay.h>
- #include <stdlib.h>
- #include <stdio.h>
复制代码在此之后,必须定义波特率以便与ESP8266通信。请注意,两个控制器(即Atmega16和NodeMCU)的波特率必须一样。在本文中,波特率为9600。 - #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
复制代码两个寄存器UBRRL和UBRRH将用于加载波特率值。波特率的低8位将加载到UBRRL中,波特率的高8位将加载到UBRRH中。为简单起见,请使用UART初始化函数,其中波特率将按值传递。 UART初始化函数包括: 1. 在寄存器UCSRB中设置发送和接收位。 2. 在寄存器UCSRC中选择8位字符大小。 3. 在UBRRL和UBRRH寄存器中加载波特率的低位和高位。 - void 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寄存器。 char将仅在函数中传递。 - void UART_TxChar(char c)
- {
- while (! (UCSRA & (1<<UDRE)));
- UDR = c;
- }
复制代码而在传输多个字符时,使用如下所示的函数来发送字符串。 - void UART_sendString(char *str)
- {
- unsigned char s=0;
- while (str[s]!=0)
- {
- UART_TxChar(str[s]);
- s++;
- }
- }
复制代码
在main()函数中,调用UART_init()函数来启动传输。并通过向NodeMCU发送TEST字符串进行回声测试。 - 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接收命令和使用One SMTP服务器发送电子邮件。 首先,包括WIFI库,因为将使用互联网来发送电子邮件。定义WIFI ssid和密码,并且保证正确连接。还定义了SMTP服务器。 - #include <ESP8266WiFi.h>
- const char* ssid = "xxxxxxxxxxxx";
- const char* password = "xxxxxxxxxxx";
- char server[] = "mail.smtp2go.com";
复制代码
在setup()函数中,将波特率设置为9600,和Atmega16的波特率保持一致,然后连接到WIFI并显示IP地址。 - Serial.begin(9600);
- Serial.print("Connecting To: ");
- Serial.println(ssid);
- WiFi.begin(ssid, password);
- while (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[index1] = inChar;
- index1++;
- inData[index1] = '\0';
- }
- variable.toUpperCase();
- for (byte i = 0 ; i < 6 ; i++) {
- variable.concat(String(inData[i]));
- }
- Serial.print("variable is = "); Serial.println(variable);
- Serial.print("indata is = "); Serial.println(inData);
- delay(20);
- }
- String string = String(variable);
复制代码如果匹配接收命令,则通过调用sendEmail()函数向收件人发送电子邮件。 - if (string == "SEND") {
- sendEmail();
- Serial.print("Mail sent to:"); Serial.println(" The recipient");
- Serial.println("");
- }
复制代码设置SMTP服务器非常重要,如果不这样做,就不能发送任何电子邮件。另请注意,在通信时,设置两个控制器的波特率一样。
因此,以上就是ESP8266如何与AVR微控制器连接以实现物联网通信。本文使用的完整代码如下:
main.rar
(2.48 KB, 下载次数: 17)
|