当前位置:首页 > > 嵌入式IoT

1. 文章说明2. 硬件电路2.1 外观介绍2.2 引脚分布3. 软件设计3.1 闪灯3.2 按键3.3 PWM3.4 SoftAP3.5 STA模式3.6 AP+STA3.7 Scan WiFi4. 总结

1. 文章说明

本文主要结合上面的工程环境,利用vscode+platformIO物联网开发环境,同时使用当下最流行的开源硬件系统Arduino学习与掌握对硬件的编程方法。对于物联网的江湖世界,Arduino犹如掀起一股浪潮的屠龙宝刀,将继续为这风起云涌的物联网时间贡献力量。文章就是就是采用Arduino。Talk is cheap!

2. 硬件电路

2.1 外观介绍

对于硬件的使用,采用的是NODEMCU。如下图所示

基本上就是这个样子。一句话概括。NodeMCU,是一个开源的物联网平台。淘宝上14元左右即可拿下。

2.2 引脚分布

NodeMCU引脚分布如下图所示。其中用户按键FLASH 为GPIO16,LED为GPIO16。

3. 软件设计

3.1 闪灯

对于最开始的设计,先演示一下闪灯操作。闪灯也是最直观看到程序效果的方法,犹如机器的心跳,能够用眼睛看到程序的运行。这也就是最基本的入门程序。

目的

让开发板上的灯闪烁起来!

程序如下

#define PIN_LED 16 //定义LED void setup() {
 pinMode(PIN_LED,OUTPUT);
} void loop() {
 digitalWrite(PIN_LED,LOW); //低电平点亮 delay(500);
 digitalWrite(PIN_LED,HIGH);
 delay(500);
}

非常的简单,将程序放入VSCode进行编译,然后下载到开发板就可以看到程序正常启动了。当然,这都是非常简单的操作。

3.2 按键

按键作为外部输入设备,可以作为外界的感应给设备。那么究竟如何使用这个按键呢?下面通过按键来进行点灯操作。

扫描方式

扫描就是每隔一定时间去查看一下按键的状态,如果按键达到了需求的状态则进行相关的操作。

#define PIN_LED 16 //定义LED #define KEY_FLASH  0 //定义按键 void setup() {
 Serial.begin(115200);
 Serial.setDebugOutput(true);
 pinMode(PIN_LED,OUTPUT);
 pinMode(KEY_FLASH,INPUT);
} void keyScan() { int k = 0;
 k = digitalRead(KEY_FLASH);
 Serial.println("keyScan:");
 Serial.write(k);
 Serial.println(); if(k == 0)
 {
 digitalWrite(PIN_LED,HIGH);
 } else {
 digitalWrite(PIN_LED,LOW);
 }
} void loop() {
 keyScan();
 delay(500);
}

中断方式

中断就相当于闹钟,平时它什么事情也不做,当按键事件到来时,就触发了相应的操作。

#include "Arduino.h" #define PIN_LED 16 //定义LED #define KEY_FLASH  0 //定义按键 volatile int state = HIGH; void stateChange(); void setup() {
 Serial.begin(74880);
 Serial.setDebugOutput(true);
 pinMode(PIN_LED,OUTPUT);
 pinMode(KEY_FLASH,INPUT);
 attachInterrupt(KEY_FLASH,stateChange,RISING);//下降沿中断 digitalWrite(PIN_LED,HIGH);//低电平点亮 } void stateChange() {
 state = !state;
 Serial.printf("state:%d\n",state);
 digitalWrite(PIN_LED,state);
} void loop() {

}

3.3 PWM

先讲一下什么是PWM,也就是脉冲宽度调制。本来数字电路就是输出高低电平来维持设备的正常工作,PWM就可以输出断断续续的电平,从而通过占空比来调节输出电压。典型的应用就是控制液晶显示屏的背光灯的亮度。或者控制电机的转速和角度。下面我们通过一个示例来讲解PWM的调节。

目标:呼吸灯

呼吸灯就是按照特定的频率明暗变化的闪灯方式,犹如人体肺部吸入和呼出空气一样慢慢的变化。

#define PIN_LED 16 void setup() {
 pinMode(PIN_LED,OUTPUT);
 analogWrite(PIN_LED,0);//信号模拟输出 } void loop() { for(int i = 0; i < 1024; i++)
 {
 analogWrite(PIN_LED,i);
 delay(2);
 } for(int i = 1024; i >= 0; i--)
 {
 analogWrite(PIN_LED,i);
 delay(2);
 }
}

程序如上所述,通过控制输出到LED上的PWM占空比,从而间接调节两端的电压。进一步让其输出明暗的效果。

3.4 SoftAP

既然是联网模块,那么就一定要涉及到网络部分才叫wifi模块。8266的网络支持功能是非常的强大的,这个也是该模块的特点。下面主要讲一下AP与STA。先来说说AP。AP就是Access Point 也就是访问接入点。一般就是网络的创建者,对于家庭或者办公室来说,一个无线路由器就是AP,而其他的外设就是STA。

从原理上来说,我们接下来的实验是要实现一个接入点,也就是路由器一样的功能。

#include  #include  //自定义AP的SSID与密码 const char *ssid = "BA_AP"; const char *password = "bigmagic"; //申明端口 ESP8266WebServer server(80); //设定 web 服务的成功响应信息 void handleRoot() {
 Serial.print("\n123...\n");
 server.send(200, "text/html", "
		

You are connected

"
); } void setup() { delay(1000); Serial.begin(74880); Serial.println(); Serial.print("Configuring access point..."); /*如果使用开放式 AP 模式,可以把下面语句的 password 参数省略 */ WiFi.softAP(ssid, password); //获取 AP 的 IP 地址,存入变量 myIP IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP); //调用 on 方法,给客户端发送响应信息,启动 web 服务,并在串口回显 server.on("/", handleRoot); server.begin(); Serial.println("HTTP server started"); } //循环等待处理客户端的连接 void loop() { delay(100); Serial.print("."); server.handleClient(); }

程序执行后,我们可以用手机收到名称为BA_AP的WIFI信息,同时连接上wifi后浏览器访问192.168.4.1即可看到网页上显示You are connected的信息。同时可以在串口控制台上看到123的输出。

3.5 STA模式

与AP模式相对应,STA就是连接到路由器上的设备。这种模式使用的最多。下图中路由器是AP,其他的手机,电脑,开发板都是属于STA的范畴。

在讲今天的程序之前,可以看看设备是如何联网的。

首先AP在不断的向周围发出信号,也就是信标帧(beacon)。STA如果开启WiFi也会每隔一定的事件发送探测帧(probe)。这样其实有一个问题,就是会有不良的使用者制作WIFI探针。今年的315上报道了WIFI探针的问题。也就是自带WIFI功能的手机,即使在不连接WIFI的情况下,只要开启了WIFI的功能,那么信息就有可能被截获到。

其整个流程如下:

连接WIFI程序如下

#include  //连接AP账号 const char* ssid = "ChinaNet-pUas" const char* password = "zhao565658" void setup()
{
 Serial.begin(115200); 
 delay(10); 
 Serial.println(); 
 Serial.println(); 
 Serial.print("Connecting to "); 
 Serial.println(ssid); 
 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { 
 delay(500); 
 Serial.print("."); 
 } 
 Serial.println(""); 
 Serial.println("WiFi connected"); 
 Serial.println("IP address: "); 
 Serial.println(WiFi.localIP()); 
} void loop() {

}

串口打印信息如下

并且可以在路由器管理中看到设备,表示连接成功。

3.6 AP+STA

8266可以既作为AP也同时可以作为STA,这就需要内部有两个MAC地址。这种方式就像笔记本电脑既可以联网,也可以开启热点一样。作为数据直接转发功能。

3.7 Scan WiFi

8266可以扫描附件的WiFi信息,和手机上扫描热点一样。下面来实现一下这个功能

#include "ESP8266WiFi.h"  void setup() { 
 Serial.begin(115200); //设定 WiFi 为 STA 模式,如果先前已连接上 AP,则与之断开 WiFi.mode(WIFI_STA); 
 WiFi.disconnect(); 
 delay(100); 
 Serial.println("Setup done"); 
} void loop() { 
 Serial.println("scan start"); // WiFi.scanNetworks 可以返回扫描到的无线网络数目 int n = WiFi.scanNetworks(); 
 Serial.println("scan done"); if (n == 0) 
 Serial.println("no networks found"); else { 
 Serial.print(n); 
 Serial.println(" networks found"); for (int i = 0; i < n; ++i) 
 { /*在串口输出所发现的每一个无线网络的 SSID 和所接收的信号强度 RSSI */ Serial.print(i + 1); 
 Serial.print(": "); 
 Serial.print(WiFi.SSID(i)); 
 Serial.print(" ("); 
 Serial.print(WiFi.RSSI(i)); 
 Serial.print(")"); //判断 WiFi 网络是否加密,并输出结果  Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*"); 
 delay(10); 
 } 
 } 
 Serial.println(""); //连续扫描的时间间隔 delay(3000); 
} 

通过串口可以看到串口消息如下

表示列出附件的WiFi的相关信息。

4. 总结

本次分享的文章主要是对8266进行基本的操作,演示了基本的用法和功能,更加高级的用法后面再做研究。好的东西用起来的效果就是不一样。前面的实验对于初学者来说,可以全面的了解这个模块的功能,如果是大神可以直接忽略,因为太过简单。后面再慢慢深入研究该模块的使用。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭