风筝
发表于: 2019-3-5 21:18:24 | 显示全部楼层

Atmega16是一款低成本的8位微控制器,与之前版本的微控制器相比,其GPIO数量更多。它具有所有常用的通信协议,如UART、USART、SPI和I2C。由于其广泛的社区支持和简单性,它在机器人、汽车和自动化行业中具有广泛的应用。


Atmega16不支持任何无线通信协议,如Wi-Fi和蓝牙,这限制了其在某些领域内的应用领域,如物联网。为了克服这种限制,可以连接支持无线协议的其他控制器。有许多控制器支持无线协议,如被广泛使用的ESP8266等。

Interfacing-ESP8266-NodeMCU-with-AVR-Microcontroller-ATmega16.jpg


在本篇文章中,我们将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


电路原理图

Circuit-Diagram-Interfacing-ESP8266-NodeMCU-with-AVR-Microcontroller-ATmega16.png


设置SMTP2GO服务器以发送电子邮件

在开始编程之前,我们需要一个SMTP服务器来通过ESP8266发送邮件。网上有很多SMTP服务器。在这里,smtp2go.com将用作SMTP服务器。


因此,在编写代码之前,将需要SMTP用户名和密码。要获取这两个凭据,请按照以下步骤操作,其中包括设置SMTP服务器以成功发送电子邮件。


第1步: - 点击“Try SMTP2GO Free”注册一个免费帐户。

Setup-SMTP-for-Interfacing-with-ESP8266.png

第2步: - 将弹出一个窗口,您需要输入一些凭据,如姓名、电子邮件ID和密码。

SMTP-Account-for-Interfacing-with-ESP8266.png

第3步: - 注册后,您将在输入的电子邮件中收到激活请求。从电子邮件中的验证链接激活您的帐户,然后使用您的电子邮件ID和密码登录。


第4步: - 登录后,您将获得SMTP用户名和SMTP密码。请记住或将这些内容复制到记事本中以供进一步使用。之后点击“Finish”。

SMTP-Account-Login-Details-for-Interfacing-with-ESP8266.png

第5步: - 现在在左侧访问栏上,单击“Settings”,然后单击“Users”。在这里,您可以看到有关SMTP服务器和PORT端口的信息。通常如下:

Setup-SMTP-Account-Details-for-Interfacing-with-ESP8266.png


编码用户名和密码

现在我们必须使用ASCII字符集更改base64编码格式的用户名和密码。要以base64编码格式转换电子邮件和密码,请使用名为BASE64ENCODE(https://www.base64encode.org/)的网站。复制编码的用户名和密码,以供进一步使用:

Encode-login-Details-for-Interfacing-with-ESP8266.png

完成这些步骤后,接下来编程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。

Testing-ESP8266-NodeMCU-with-AVR-Microcontroller-ATmega16.jpg


编程ATmega16用于发送电子邮件

首先定义工作主频并包括所有必需的库。使用的库在Atmel Studio安装包中。

  1. #define F_CPU 16000000UL
  2. #include<avr/io.h>
  3. #include<util/delay.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
复制代码

在此之后,必须定义波特率以便与ESP8266通信。请注意,两个控制器(即Atmega16和NodeMCU)的波特率必须一样。在本文中,波特率为9600。

  1. #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
复制代码

两个寄存器UBRRLUBRRH将用于加载波特率值。波特率的低8位将加载到UBRRL中,波特率的高8位将加载到UBRRH中。为简单起见,请使用UART初始化函数,其中波特率将按值传递。 UART初始化函数包括:

1.   在寄存器UCSRB中设置发送和接收位。

2.   在寄存器UCSRC中选择8位字符大小。

3.   在UBRRL和UBRRH寄存器中加载波特率的低位和高位。

  1. void UART_init(long USART_BAUDRATE)
  2. {
  3.        UCSRB |= (1 << RXEN) | (1 << TXEN);        
  4.        UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);   
  5.        UBRRL = BAUD_PRESCALE;           
  6.        UBRRH = (BAUD_PRESCALE >> 8);   
  7. }
复制代码

下一步将设置传输字符的函数。此步骤包括等待空缓冲区完成,然后将char值加载到UDR寄存器。 char将仅在函数中传递。

  1. void UART_TxChar(char c)
  2. {
  3.        while (! (UCSRA & (1<<UDRE)));   
  4.        UDR = c;
  5. }
复制代码

而在传输多个字符时,使用如下所示的函数来发送字符串。

  1. void UART_sendString(char *str)
  2. {
  3.        unsigned char s=0;

  4.        while (str[s]!=0)         
  5.         {
  6.         UART_TxChar(str[s]);
  7.               s++;
  8.           }
  9. }
复制代码

main()函数中,调用UART_init()函数来启动传输。并通过向NodeMCU发送TEST字符串进行回声测试。

  1. UART_init(9600);
  2. UART_sendString("TEST");
复制代码

LED和按钮配置GPIO引脚。

  1. DDRA |= (1<<0);   
  2. DDRA &= ~(1<<1);
  3. PORTA |= (1<<1);
复制代码

如果没有按下按钮,则LED指示灯常亮,如果按下按钮,则开始向NodeMCU发送“SEND”命令,并且LED灯熄灭。

  1. if(bit_is_clear(PINA,1))
  2.               {
  3.                      PORTA |= (1<<0);   
  4.                      _delay_ms(20);
  5.               }
  6.               else
  7.               {
  8.                       PORTA &= ~(1<<0);
  9.                      _delay_ms(50);
  10.                      UART_sendString("SEND");
  11.                      _delay_ms(1200);
  12.               }
复制代码

编程ESP8266 NodeMCU

编程NodeMCU包括从Atmega16接收命令和使用One SMTP服务器发送电子邮件。

首先,包括WIFI库,因为将使用互联网来发送电子邮件。定义WIFI ssid和密码,并且保证正确连接。还定义了SMTP服务器。

  1. #include <ESP8266WiFi.h>
  2. const char* ssid = "xxxxxxxxxxxx";
  3. const char* password = "xxxxxxxxxxx";
  4. char server[] = "mail.smtp2go.com";
复制代码

setup()函数中,将波特率设置为9600,和Atmega16的波特率保持一致,然后连接到WIFI并显示IP地址。

  1. Serial.begin(9600);
  2. Serial.print("Connecting To: ");
  3. Serial.println(ssid);
  4. WiFi.begin(ssid, password);
  5. while (WiFi.status() != WL_CONNECTED)
  6. {
  7. delay(500);  Serial.print(".");
  8. }
复制代码

loop()函数中,读取Rx引脚上的接收字节并将其转换为字符串形式。

  1. if ( Serial.available() > 0 ) {                     
  2.     while (Serial.available() > 0 && index1 < 6)
  3.     {
  4.       delay(100);
  5.       inChar = Serial.read();
  6.       inData[index1] = inChar;
  7.       index1++;
  8.       inData[index1] = '\0';         
  9.     }
  10.     variable.toUpperCase();
  11.     for (byte  i = 0 ; i < 6 ; i++) {
  12.       variable.concat(String(inData[i]));
  13.     }
  14.     Serial.print("variable is = "); Serial.println(variable);
  15.     Serial.print("indata is = "); Serial.println(inData);
  16.     delay(20);
  17.   }
  18. String  string = String(variable);
复制代码

如果匹配接收命令,则通过调用sendEmail()函数向收件人发送电子邮件。

  1.   if (string == "SEND") {
  2.     sendEmail();
  3.     Serial.print("Mail sent to:"); Serial.println(" The recipient");
  4.     Serial.println("");
  5.   }
复制代码

设置SMTP服务器非常重要,如果不这样做,就不能发送任何电子邮件。另请注意,在通信时,设置两个控制器的波特率一样。

Receiving-Email-using-ESP8266-and-ATmega16.jpg


因此,以上就是ESP8266如何与AVR微控制器连接以实现物联网通信。本文使用的完整代码如下: main.rar (2.48 KB, 下载次数: 17)

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 32 | 回复: 41



手机版|

GMT+8, 2024-11-21 18:26 , Processed in 0.068615 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表