esp32-Arduino开发学习
ESP32-Arduino开发学习
- 一.Arduino开发环境的搭建以及esp32驱动的安装
- 二.GPIO输入输出
- 三.串口(UART)的使用
- 四.模拟输入(ADC)和数模输出(DAC)
- 五.脉冲宽度调制(pwm)
- 六.触摸开关touch
- 七.外部中断
- 八.计数函数和定时器使用
- 九.霍尔功能的使用
- 十.EEPROM在ESP32中的函数用法
- 十一.低功耗模式
- 十二.蓝牙通讯
- 十三. WIFI功能使用
- 十四.外部设备的使用
一.Arduino开发环境的搭建以及esp32驱动的安装
1.arduino编译器的安装
(1)进入www.arduino.cc;
(2)点击SOFTWARE;
(3)选择 Windows Win 7 and never,然后点击JUST DOWNLOAD,将安装包另存为;
(4)双击刚才保存的安装包,一路向下点击;(可安装在其他盘)
2.下载ESP32的插件
方式一:可通过github下载,https://github.com/espressif/arduino-eso32
方式二:已有的压缩包安装;
这里为了方便选择方式二:
(1)输入网址:http://www.mjkdz.com;(感谢b站博主的分享)
(2)点击下载,找到arduino插件包;
(3)文件配置
- 打开arduino的文件路径,将压缩包里的ESP32和espressif两个文件复制到hardware文件夹下;
- 返回上一级文件夹,将压缩包里的drivers和libraries复制进该路径下;(重复的可以跳过)
(4)驱动安装
_1.如果是ch341驱动;
点击 drivers–>CH341SER–>CH341SER.EXE
_2.如果是CP210X驱动;
点击 drivers–>CP210x_Universal_Windows_Driver–>CP210xVCPInstaller_x64.exe (64位安装, 32位选择x86)
也可安装dpinst-amd64.exe;
此时插上单片机,可通过设备管理器看到端口;
(5)打开arduino编译器,点击工具(左上角),选择开发板型号进行配置;
(6)点击 文件–>示例中的任何一个代码 ,进行下载测试;
二.GPIO输入输出
1.流水灯:
void setup()
{pinMode(2, OUTPUT);//设置GPIO2为输出模式
}
void loop()
{digitalWrite(2, LOW);//设置GPIO2输出低电平delay(1000); // 延时1000msdigitalWrite(2, HIGH);delay(1000);}
2.按键控制开关灯
//GPIO2为低电平时,led灯亮;GPIO2为高电平时,led灯灭;
const int KEY=4;
const int LED=2;
int flag=0;
void setup()
{pinMode(LED, OUTPUT);//设置GPIO2为输出模式pinMode(KEY, INPUT);digitalWrite(LED, HIGH);//设置GPIO2输出高电平Serial.begin(9600);
}
void loop()
{if( digitalRead(KEY) == 1 ) //查看按键是否按下 {flag = !flag;digitalWrite(LED, flag);Serial.println(flag);delay(500);}
}
三.串口(UART)的使用
1.Serial.write()
byte x=150;
void setup()
{Serial.begin(9600);
}
void loop()
{Serial.write(x);//串口以十六进制方式输出delay(100);
}
2.Serial.print() Serial.println()
int x=55;
void setup()
{Serial.begin(9600);
}
void loop()
{Serial.print(x);//串口输出十进制delay(500);Serial.println(x);//串口输出十进制换行delay(500);Serial.println(x,HEX);//串口输出字符,以十六进制方式输出delay(500);Serial.println(x,OCT);//串口输出字符,以八进制方式输出delay(500);Serial.println(x,BIN);//串口输出字符,以二进制方式输出delay(500);
}
3.串口控制led的亮灭
const int led=2;
char x=0;
void setup()
{Serial.begin(9600);pinMode(led,OUTPUT);digitalWrite(led,HIGH);
}
void loop()
{while(Serial.available()>0) // 判断串口是否有数据{x=Serial.read();//读取串口值if(x == 'A'){digitalWrite(led,LOW);}else if(x == 'B'){digitalWrite(led,LOW);}}
}
四.模拟输入(ADC)和数模输出(DAC)
1.读取模拟口的值
const int adc=14; //具有ADC功能的引脚,可自行查看开发板引脚功能
int x=0;
void setup()
{Serial.begin(115200);
}
void loop()
{x=analogRead(adc);//读取模拟口的值,可调节Serial.println(x);delay(100);
}
2.DAC输出电压值
#define DAC1 25 // 宏定义
int x=255;
void setup()
{Serial.begin(115200);
}
void loop()
{dacWrite(DAC1,x);//DAC输出电压值,此管脚接LED也可用万用表测量
}
3.电位器旋钮调节led的亮灭(电压大小)
#define DAC1 25 // 宏定义
#define ADC1 14
int x=0; // 存储ADC读取的变量
void setup()
{Serial.begin(115200);
}
void loop()
{x=analogRead(ADC1);Serial.print(x);Serial.print(',');x=map(x,0,4096,0,255);//将0-4096转换成0-255,DAC是8位Serial.println(x);// 串口输出转换后的值dacWrite(DAC1,x);//DAC输出电压值
}
五.脉冲宽度调制(pwm)
1.led由亮到灭,再由灭到亮
const int led=2;//GPIO2接LED
const int pl=1000;//定义PWM频率为1KHZ
const int td=0;//定义PWM通道0
const int bit1=8;//定义PWM(8位或者12位)
void setup()
{ledcSetup(td,pl,bit1);//配置PWM功能ledcAttachPin(led,td);//将通道连接到要控制的GPIO
}
void loop()
{for(int i=0;i<256;i++){ledcWrite(td,i);// 控制led从灭到亮delay(15);}for(int x=256;x>=0;x--){ledcWrite(td,x);// 控制led从亮到灭delay(15);}
}
2.电位器(可调电阻控制led)
const int adc=14;
const int led=2;//GPIO2接LED
const int pl=1000;//定义PWM频率为1KHZ
const int td=0;//定义PWM通道0
const int bit1=8;//定义PWM(8位或者12位)
int x=0; // 存储ADC读取的变量
void setup()
{ledcSetup(td,pl,bit1);//配置PWM功能ledcAttachPin(led,td);//将通道连接到要控制的GPIO
}
void loop()
{x=analogRead(adc);ledcWrite(td,x);
}
六.触摸开关touch
1.通过触摸开关控制led亮灭
#define tm T0 // 触摸开关T0,杜邦线接GPIO4
const int led=2;
const int threshold=48;//阀值,可根据情况调节
int x=0;//存储触摸开关的值
void setup()
{delay(1000);// 启动延时防误触pinMode(led,OUTPUT);Serial.begin(115200);
}
void loop()
{x=touchRead(T0);//读取触摸开关的值Serial.println(x);if(x <= threshold){digitalWrite(led,LOW);}else{digitalWrite(led,HIGH);}
}
七.外部中断
外部中断控制led
#define key 35
#define led 2
byte ZH=0;
void IRAM_ATTR interrupt1()// 中断函数
{ZH=!ZH;digitalWrite(led,ZH);
}
void setup()
{pinMode(led,OUTPUT);pinMode(key,INPUT);/*1 LOW 每当引脚为低电平(LOW)时触发中断2 HIGH 每当引脚为高电平(HIGH)时触发中断3 CHANGE 在引脚状态改变时触发中断4 FALLING 每当引脚从高变低时触发,(上升沿)5 RISING 每当引脚从低变高时触发,(下降沿)*/attachInterrupt(key,interrupt1,FALLING);// 外部中断设置
}
void loop()
{}
什么是IRAM_ATTR?
通过使用IRAM_ATTR属性标记一段代码,我们声明编译后的代码放置在ESP32的内部RAM(IRAM)中。ESP32上的闪存比内部RAM慢的多。如果我们要运行的代码是一个中断服务程序(ISR),我们通常希望尽快执行它,如果我们不得不“等待”从闪存加载ISR,那可能中断就会失败。
八.计数函数和定时器使用
millis() 定时1ms | micros() 定时1us |
---|
1.定时1s, led 1s亮,1s灭
const int led=2;
byte ZH=0;//led状态
unsigned long X=0;
const long Y=1000; //1000ms == 1s
void setup()
{pinMode(led,OUTPUT);Serial.begin(9600);
}
void loop()
{unsigned long Z=millis(); //将定时1ms送给变量Serial.print(Z);Serial.print(",");Serial.println(X);if(Z-X>=Y){ X=Z;ZH=!ZH;digitalWrite(led,ZH);}
}
2.定时器中断控制led
#include <Arduino.h>
/** esp32共有4个定时器0-3,这些都是基于64位的通用定时器。* 每个定时器都有个16位预分频器(2-65536)以及可自动* 重新加载的64位递增/递减计数器
*/
hw_timer_t *timer = NULL;
volatile int led=2; // GPIO2
volatile byte ZH=0;//volatile关键字说明我们需要在中断中修改这个变量// 函数名称:onTimer()
// 函数功能:中断服务的功能,它必须是一个返回void(空)且没有输入参数的函数
// 为使编译器将代码分配到IRAM内,中断处理程序应该具有 IRAM_ATTR 属性
// https://docs.espressif.com/projects/esp-idf/zh_CN/release-v4.3/esp32/api-reference/storage/spi_flash_concurrency.html
void IRAM_ATTR TimerEvent()
{ZH=!ZH;digitalWrite(led,ZH);
}
void setup()
{Serial.begin(115200);pinMode(led,OUTPUT);// 函数名称:timerBegin()// 函数功能:Timer初始化,分别有三个参数// 函数输入:1. 定时器编号(0到3,对应全部4个硬件定时器)// 2. 预分频器数值(ESP32计数器基频为80M,80分频单位是微秒)// 3. 计数器向上(true)或向下(false)计数的标志// 函数返回:一个指向 hw_timer_t 结构类型的指针timer = timerBegin(0, 80, true);// 函数名称:timerAttachInterrupt()// 函数功能:绑定定时器的中断处理函数,分别有三个参数// 函数输入:1. 指向已初始化定时器的指针(本例子:timer)// 2. 中断服务函数的函数指针// 3. 表示中断触发类型是边沿(true)还是电平(false)的标志// 函数返回:无timerAttachInterrupt(timer, &TimerEvent, true);// 函数名称:timerAlarmWrite()// 函数功能:指定触发定时器中断的计数器值,分别有三个参数// 函数输入:1. 指向已初始化定时器的指针(本例子:timer)// 2. 第二个参数是触发中断的计数器值(1000000 us -> 1s)// 3. 定时器在产生中断时是否重新加载的标志// 函数返回:无timerAlarmWrite(timer, 1000000, true);timerAlarmEnable(timer); // 使能定时器
}
void loop()
{}
九.霍尔功能的使用
什么是霍尔传感器,它有什么用?
霍尔传感器是一种检测磁场的传感器, 可以用来检测磁场的存在和变化, 广泛用在测量、 自动化控制、 交通运输和日常生活等领域。
int hallRead();
void setup()
{Serial.begin(9600);
}
void loop()
{int x=hallRead();Serial.println(x);delay(200);
}
十.EEPROM在ESP32中的函数用法
EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。一般用在即插即用。
#include<Arduino.h>
#include"EEPROM.h"int EEPROMDZ1=0,EEPROMDZ2=10; // 0-255个地址
int intdata=11000;
String stringdata="flg666";
void setup()
{Serial.begin(115200);EEPROM.begin(512);//ESP32最大EEPROM为4096字节(4kb),我们这里只是用512字节,你可以根据自己的需要选择大小delay(500); //防止过快出错
}
void loop()
{if(Serial.available()){String str=Serial.readString();delay(10);if(str == "read") //读取EEPROM的数据 {int rInt=EEPROM.readInt(EEPROMDZ1);//读取对应地址的Int值String rStr=EEPROM.readString(EEPROMDZ2);//读取对应地址的String值Serial.print(rInt);Serial.print(',');Serial.println(rStr);}else if(str == "int"){EEPROM.writeInt(EEPROMDZ1,intdata);//对应地址写入变量的值EEPROM.commit();// 确定是否写入成功}else if(str == "string"){EEPROM.writeString(EEPROMDZ2,stringdata);//对应地址写入变量的值EEPROM.commit();// 确定是否写入成功}else if(str == "clear"){for(int i=0;i<512;i++){EEPROM.write(i,0);//对应位写入0}EEPROM.end();//结束EEPROM}// 如果输入不回复,请提供回复else{Serial.println("输入代码错误!");}}
}
十一.低功耗模式
参考esp32低功能模式 ,这里就不做介绍。
1.深度睡眠定时器唤醒
#define wmm 1000000 //微妙到秒的转换系数
#define miao 5 // esp32进入睡眠的时间,以秒为单位
const int led=2;void setup()
{pinMode(led,OUTPUT);esp_sleep_enable_timer_wakeup(miao*wmm);//esp32睡眠使能,定时器唤醒 5秒
}
void loop()
{for(byte i=0;i<5;i++){digitalWrite(led,HIGH);delay(200);digitalWrite(led,LOW);delay(200);}esp_deep_sleep_start();// esp32深度睡眠开始
}
2.深度睡眠触摸开关唤醒
#define FZ 40 //触摸阀值
const int led=2;void callback() //触摸中断函数
{}void setup()
{pinMode(led,OUTPUT);touchAttachInterrupt(T3,callback,FZ);// T3对应GPIO15esp_sleep_enable_touchpad_wakeup();//设置触摸唤醒
}
void loop()
{for(byte i=0;i<5;i++){digitalWrite(led,HIGH);delay(200);digitalWrite(led,LOW);delay(200);}esp_deep_sleep_start();// esp32深度睡眠开始
}
3.外部中断唤醒
//外部中断口GPIO 0,2,4,12-15,25-27,32-39
#define led 2
void setup()
{pinMode(led,OUTPUT);esp_sleep_enable_ext0_wakeup(GPIO_NUM_4,0);//1=HIGH 0=LOW
}
void loop()
{for(byte i=0;i<5;i++){digitalWrite(led,HIGH);delay(200);digitalWrite(led,LOW);delay(200);}esp_deep_sleep_start();// esp32深度睡眠开始
}
十二.蓝牙通讯
1.经典蓝牙串口通讯
#include"BluetoothSerial.h" //调用串口蓝牙函数#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run ‘make menuconfig‘ #to and enable it
#endif //判断蓝牙是否已启用,没有的话请运行病启用它BluetoothSerial SerialBT;
void setup()
{Serial.begin(9600);SerialBT.begin("ESP32BT");//蓝牙开始并设置名称
}
void loop()
{if(Serial.available()){SerialBT.write(Serial.read());//write 只能发送十六进制}else if(SerialBT.available()){Serial.write(SerialBT.read());}
}
2.低功耗蓝牙(BLE)
可观看b站视频:MJKDZ分享的低功耗蓝牙(BLE)服务模式
低功耗蓝牙控制led:低功耗蓝牙 控制led
(BLE)服务端和客户端通讯:(BLE)服务端和客户端通讯
十三. WIFI功能使用
可观看视频详细了解::WIFI入门STA站点模式
一.esp32有三种连接模式::
1.STA站点模式
STA站点,每一个连接到无线网络中的终端(如笔记本电脑、PDA及其它可以联网的用户设备)都可称为一个站点。
ESP32接入到接入点 (路由器);
手机只要在局域网内就可以控制esp32;
2. AP接入点模式
AP,也就是无线接入点,是一个无线网络的创建者,是网络的中心节点。一般家庭或办公室使用的无线路由器就一个AP。
也就是说,其他站点可连接esp32;
这样,esp32作为一个中心节点,就可以和多个外部设备进行通讯;
3. STA+AP站点和接入点连接模式
综合上述两点;
esp32可以连接到路由器上,其他设备连接到esp32;
这样可以我们就可以通过手机连接到家里的路由器上,就可以控制多个带有wifi的设备。
sta模式
//STA模式
#include<WiFi.h> //调用WiFi函数库const char *ssid="";//wifi名字
const char *password="";//wifi密码
void wifi_init()
{WiFi.mode(WIFI_STA);//将WiFi模式设置为STA模式WiFi.begin(ssid,password);//wifi连接Serial.print("连接到wifi...");while(WiFi.status() != WL_CONNECTED) //等待wifi是否连接成功{Serial.print('.');delay(1000);}Serial.println(WiFi.localIP());//当连接上时,串口输出连接的IP地址
}
void setup()
{Serial.begin(115200);wifi_init();//调用初始化wifi函数Serial.print("RSSI:");Serial.println(WiFi.RSSI());// 串口输出信号强度值
}
void loop()
{}
扫描wifi设备网络
/*扫描WiFi设备网络。
*/
#include "WiFi.h"
void setup()
{Serial.begin(115200);//打开串口波特率设置成115200WiFi.mode(WIFI_STA);//将WiFi设置为站点模式WiFi.disconnect();//断开WIFIdelay(100);//延时100毫秒
}
void loop()
{Serial.println("开始搜索WIFI信号....");int n = WiFi.scanNetworks();//扫描WIFI信号,并将得到的WIFI数量存储在变量里Serial.println("扫描完成");if (n == 0) {//判读如果接收到的WIFI数量是0.说明没有搜到WIFI设备Serial.println("没有扫描到WIFI设备");} else {Serial.print("WIFI设备数量:");Serial.print(n);//输出WIFI数量Serial.println("个");for (int i = 0; i < n; ++i) {//找到的WIFI设备,每个都输出名称和信号强度Serial.print(i + 1);Serial.print(": ");Serial.print(WiFi.SSID(i));//输出WIFI设备名称Serial.print(" (");Serial.print(WiFi.RSSI(i));//输出WIFI信号强度Serial.print(")");Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*");//输出WIFI加密类型 WPA 、WPA2、WPA_WPA2、WEP,WPA2_PKS,WPA_WPA2_PKSdelay(10);//延时10毫秒}}delay(5000);//等5秒在扫描
}
AP模式接入测试
#include <WiFi.h>
const char *ssid = "ESP32_WIFI";
const char *password = "12345678";void setup() {Serial.begin(115200);WiFi.mode(WIFI_AP);//设置为(AP)接入点模式WiFi.softAP(ssid, password);//设置接入点的名称和密码Serial.print("接入点IP地址:");Serial.println(WiFi.softAPIP());//串口输出IP地址
}void loop() {}
AP (自己设定 IP)
#include <WiFi.h>
const char *ssid = "ESP32_WIFI";
const char *password = "12345678";IPAddress local_IP(192,168,4,10);//IP地址,对应自身
IPAddress gateway(192,168,4,1);//网关
IPAddress subnet(255,255,255,0);//网络掩码void setup() {Serial.begin(115200);WiFi.mode(WIFI_AP);//设置为(AP)接入点模式WiFi.softAPConfig(local_IP,gateway,subnet);//设置IP地址WiFi.softAP(ssid, password);//设置接入点的名称和密码WiFi.softAPsetHostname("ssss");//设置主机名字Serial.println(WiFi.softAPgetHostname());//输出主机名字 Serial.print("接入点IP地址:");Serial.println(WiFi.softAPIP());//串口输出IP地址
}void loop() {Serial.println(WiFi.softAPgetStationNum());//串口输客户端连接数量delay(1000);
}
AP+STA模式
#include <WiFi.h>
const char* wifi_network_ssid = "********";//连接家庭的路由器的名称
const char* wifi_network_password = "********";连接家庭的路由器的密码const char *soft_ap_ssid = "ESP32_WIFI";//AP的名称
const char *soft_ap_password = "123456789";//AP的密码void setup() {Serial.begin(115200);//打开串口波特率设置成115200WiFi.mode(WIFI_MODE_APSTA);//设置WIFI模式为AP+STA模式WiFi.softAP(soft_ap_ssid, soft_ap_password);//设置AP的名称和密码WiFi.begin(wifi_network_ssid, wifi_network_password);//设置STA连接的WIFI名称和密码while (WiFi.status() != WL_CONNECTED) {//判断是否已连接到家庭网路delay(500);//500毫秒Serial.println("等待连接WiFi..");}Serial.print("AP地址: ");Serial.println(WiFi.softAPIP());//串口输出AP的地址Serial.print("STA连接IP地址:");Serial.println(WiFi.localIP());//串口输出STA的地址
}
void loop() {}
二.TCP双向通讯:
1.服务端代码(server)
//传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议
#include <WiFi.h>
WiFiServer server; //设置ESP32设置成服务器
const char *ssid = "********";
const char *password = "********";
String readTCP; //存储客户端发送来的字符串
String readUART;//存储串口接收到的字符串
void setup()
{Serial.begin(115200); WiFi.mode(WIFI_STA);WiFi.setSleep(false); //STA模式下关闭wifi睡眠,提高响应速度WiFi.begin(ssid, password);//连接家庭种的路由器while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.print("IP地址:");Serial.println(WiFi.localIP());server.begin(2001); //设置服务器端口号2001
}void loop()
{WiFiClient client = server.available(); //创建一个客户端对象if (client) //判断有没有客户端连接{Serial.println("客户端已连接");while (client.connected()) //判断客户端是否已连接{if (client.available()) //如果有客户端发送来的数据{readTCP=client.readString();//读取客户端发送来的字符串Serial.println(readTCP); //打印接收到的字符readTCP = "";}if (Serial.available())// 我们判断串口是否有数据{readUART=Serial.readString();//读取串口发送来的字符串client.println(readUART); //将接收到的字符串发送到客户端readUART = "";//将接收到的字符清空}}}client.stop(); //停止当前连接:Serial.println("没有连接客户端..");}
2.客户端代码(cilent)
#include <WiFi.h>
WiFiClient client; //ESP32设置成客户端,用于连接服务器
const char *ssid = "********";
const char *password = "********";
const IPAddress serverIP(192,168,3,2); //访问服务器的IP地址
uint16_t serverPort = 2001; //连接服务器的端口号
String readTCP; //存储客户端发送来的字符串
String readUART;//存储串口接收到的字符串
void setup() { Serial.begin(115200);WiFi.mode(WIFI_STA);WiFi.setSleep(false); //关闭STA模式下的wifi休眠,可提高响应速度 WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) { delay(500);Serial.print(".");} Serial.print("IP地址:");Serial.println(WiFi.localIP());}
void loop() {Serial.println("连接服务器");if (client.connect(serverIP,serverPort)) //我们连接服务器对应的IP地址和端口{ Serial.println("连接服务器成功");while (client.connected() || client.available()) //如果已连接,或有收到的未读取的数据 { if (client.available()) //如果有收到数据{ readTCP = client.readString(); //读取服务器发送的数据Serial.println(readTCP); //串口输出服务器发送来的数据readTCP = "";//将接收到的字符清空}if (Serial.available())// 我们判断串口是否有数据{readUART=Serial.readString();//读取串口发送来的字符串client.println(readUART); //将接收到的字符串发送到客户端readUART = "";//将接收到的字符清空} } Serial.println("关闭当前连接");client.stop(); //关闭客户端 } else { Serial.println("连接服务器失败");client.stop(); //关闭客户端 } delay(5000);
}
3.esp32设置为客户端,通过服务端发送命令控制led
#include <WiFi.h>
WiFiClient client; //ESP32设置成客户端,用于连接服务器
const char *ssid = "********";
const char *password = "********";
const IPAddress serverIP(192,168,3,2); //访问服务器的IP地址
uint16_t serverPort = 2001; //连接服务器的端口号
const int led=2;
void setup() { pinMode(led, OUTPUT);Serial.begin(115200);WiFi.mode(WIFI_STA);WiFi.setSleep(false); //关闭STA模式下的wifi休眠,可提高响应速度 WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) { delay(500);Serial.print(".");} Serial.print("IP地址:");Serial.println(WiFi.localIP());}
void loop() {Serial.println("连接服务器");if (client.connect(serverIP,serverPort)) //我们连接服务器对应的IP地址和端口{ Serial.println("连接服务器成功");while (client.connected() || client.available()) //如果已连接,或有收到的未读取的数据 { if (client.available()) //如果有收到数据{ char x = client.read(); //读取服务器发送的数据if(x=='A'){digitalWrite(led, HIGH); }else if(x=='B'){digitalWrite(led, LOW);}}} Serial.println("关闭当前连接");client.stop(); //关闭客户端 } else { Serial.println("连接服务器失败");client.stop(); //关闭客户端 } delay(5000);
}
三.UDP双向通讯 :
1.服务端代码
#include <WiFi.h>
#include <WiFiUdp.h>//调用WIFIUDP库
WiFiUDP Udp; // 创建wifiUdp
char Rdata[255];//接收客户端发送的字符串
String readUART="";//串口接收存储的字符串
unsigned int localPort = 2001;//通讯端口
const char * ssid = "********";//家中路由器名称
const char * password = "********";//家中路由器密码
void setup() {Serial.begin(115200);WiFi.mode(WIFI_STA);//将WiFi设置为STA站点模式WiFi.begin(ssid, password);//打开WIFI,连接到家里的路由器while (WiFi.status() != WL_CONNECTED)//等待连接{delay(500);Serial.print(".");}if(Udp.begin(localPort)){//启动Udp监听服务Serial.println("监听开始");Serial.printf("现在收听IP:%s, UDP端口:%d\n", WiFi.localIP().toString().c_str(), localPort);//输出服务器的IP地址和端口}else{Serial.println("监听失败");}
}void loop() {int Shu = Udp.parsePacket();//接收收到的数据包大小if (Shu>0)//判断是否有数据{Serial.printf("已收到 %d 字节%s, 端口 %d\n", Shu, Udp.remoteIP().toString().c_str(), Udp.remotePort());//串口输出接收到的数据数量,发送客户端的IP和端口Udp.read(Rdata, 255);//读取接收到的数据Serial.printf(Rdata);//串口输出接收到的数据}Shu=0;if (Serial.available())// 我们判断串口是否有数据{readUART=Serial.readString();//读取串口发送来的字符串Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());//准备发送数据包,设置对应的IP地址和端口的客户端Udp.print(readUART);//将要发送的数据发送给客户端Udp.endPacket();//结束发送readUART = "";//将接收到的字符清空}
}
2.客户端代码
#include <WiFi.h>
#include <WiFiUdp.h>//调用WIFIUDP库
WiFiUDP Udp; // 创建wifiUdp
char Rdata[255];//接收服务器发送的字符串
String readUART="";//串口接收存储的字符串
unsigned int localPort = 2002;//通讯端口
const char * ssid = "********";//家中路由器名称
const char * password = "********";//家中路由器密码
IPAddress ipServidor(192, 168, 3, 2); // 服务器默认IP地址设置
/* 客户端的IP地址必须与服务器不同,否则会与客户端连接发生冲突*/
IPAddress ipCliente(192, 168, 3, 59);//与服务器不同的IP
IPAddress Subnet(255, 255, 255, 0);void setup() {Serial.begin(115200);WiFi.mode(WIFI_STA); //将WiFi设置为STA站点模式WiFi.begin(ssid, password);//打开WIFI,连接到家里的路由器while (WiFi.status() != WL_CONNECTED)//等待连接{delay(500);Serial.print(".");}Serial.printf("已连接");WiFi.config(ipCliente, ipServidor, Subnet);//设置WIFI连接的本机IP和服务器IP,和网络掩码Udp.begin(localPort);//打开端口
}void loop() { int Shu = Udp.parsePacket();//接收收到的数据包大小if (Shu)//判断是否有数据{Serial.printf("已收到 %d 字节%s, 端口 %d\n", Shu, Udp.remoteIP().toString().c_str(), Udp.remotePort());//串口输出接收到的数据数量,发送客户端的IP和端口Udp.read(Rdata, 255);//读取接收到的数据Serial.printf(Rdata);//串口输出接收到的数据}if (Serial.available())// 我们判断串口是否有数据{readUART=Serial.readString();//读取串口发送来的字符串Udp.beginPacket(ipServidor,localPort);//准备发送数据包,设置对应的IP地址和端口的客户端Udp.print(readUART);//将要发送的数据发送给客户端Udp.endPacket();//结束发送readUART = "";//将接收到的字符清空}
}
十四.外部设备的使用
项目名称 | 观看地址(感谢 MJKDZ老师的分享) |
---|---|
1. 8位led灯的控制 | 第一节 |
2.三色发光二极管RGB led | 第二节 |
3.门磁开关的使用 | 第三节 |
4.水位开关 | 第四节 |
5.外部触摸开关 | 第五节 |
6.震动传感器 | 第六节 |
7.人体感应模块 | 第七节 |
8.外部霍尔元件 | 第八节 |
9.光电(光敏电阻)模块 | 第九节 |
10.遥感模块 | 第十节 |
11.蜂鸣器和压电陶瓷片使用 | 第十一节 |
12.土壤湿度模块 | 第十二节 |
13.继电器模块(注:在使用时要防止触电事故) | 第十三节 |
14.直流有刷电机 | 第十四节 |
15.直流水泵的使用 | 第十五节 |
16.伺服电机(舵机) | 第十六节 |
17.数字彩色led(RGB) | 第十七节 |
18.超声波测距 | 第十八节 |
19.AHT21温湿度模块 | 第十九节 |
20.VEML7700环境光传感器 | 第二十节 |
21.红外遥控收发模块 | 第二十一节 |
22.oled显示屏 | 第二十二节 |
以上内容为本人在学arduino时做的笔记,能力有限,可能有错误之处,望谅解。
也十分感谢up主的视频教程,非常详细。
esp32-Arduino开发学习相关推荐
- ESP32 Arduino开发之路(2)— 使用PWM实现LED呼吸灯
ESP32 Arduino开发之路(2)- 使用PWM实现LED呼吸灯 一.前言 在ESP32上有一个LEDC外设模块专用于输出PWM波形,其介绍如下所示: 参考文章:在 ESP32 上使用 LEDC ...
- arduino开发学习日记 3.15
1.三种常用的Arduino开发板 https://www.sohu.com/a/334500336_796852 2.认识Processing-PDE(与Arduino交互做PC机上的数据展示) h ...
- Arduino开发版学习计划
制定学习开发版的计划,今天先大体过一下整个教程. http://www.bilibili.com/video/av6105302/ 视频中说可以自己制造亦可卫星放上天. Arduino使用C/C++编 ...
- 【ESP32 S3开发】在Arduino IDE中使用PSRAM
一.前言 最近使用ESP32 WROOM开发语音识别项目时,需要使用阵列麦克风采集信号,并进行切片取出含有语音部分的片段,进而使用base64编码将语音上传到后端服务器进行识别. 在项目开发时,发现虽 ...
- ESP32基于arduino开发的心跳体温检测系统(一)项目介绍及准备
本文为被北邮信息系统设计课程摧残的同学们(包括但不限于作者的室友)提供一个可行的方案及模板. 本项目使用Arduino作为开发环境,使用ESP32开发一个心跳体温检测系统. 系统通过心跳传感器--pu ...
- Arduino手动添加ESP32相关开发板(图文并茂)
一.前述 使用Arduino开发ESP32,就绕不开添加ESP32开发板这一步,网上有很多相关教程,介绍的很详细,但是在实际操作过程中还是遇到一些问题,所以在这里记录一下,希望可以帮到别人. ...
- ESP32C3基于Arduino框架下的 ESP32 RainMaker开发示例教程
ESP32C3基于Arduino框架下的 ESP32 RainMaker开发示例教程 ESP RainMaker ESP RainMaker 是乐鑫推出的一个端到端平台.基于该平台,用户无需管理基础设 ...
- 使用Arduino开发ESP32(八):ESP32的EPROM的写入读取
写入EPROM /* 该代码向EEPROM写入4096字节数据 */ #include <EEPROM.h>void setup() {Serial.begin(115200);Seria ...
- 使用乐鑫官方资源搭建基于Arduino的ESP32的开发环境
目录 一.配置IDE管理器 二.自动安装板支持包 三.手动安装板支持包 四.网盘的ESP32全系列基本库的板支持包 使用乐鑫官方库搭建Arduino开发环境. 乐鑫官方Github:GitHub - ...
- 【ESP32最全学习笔记(基础篇)——5.ESP32 数字输入和数字输出(Arduino IDE)】
关于本教程: ESP32 基础篇 1.ESP32简介 2.ESP32 Arduino 集成开发环境 3.VS 代码和 PlatformIO 4.ESP32 引脚 5.ESP32 输入输出 ☑ 6.ES ...
最新文章
- 配深度学习环境要注意的不多,也就
- 这样学习正则表达式就轻松了!
- linux终端里CTRL-Z和CTRL-C的区别
- Python编程系列---使用字典实现路由静态路由
- electronics.local在SAP Hybris中出现的几个位置
- 多CPU,多核,多进程,多线程以及进程和线程的简单理解以及区别
- JavaScript自动设置IFrame高度(兼容各主流浏览器)
- mysql 数据库异常_Mysql连接数据库异常汇总【必收藏】
- 数据分析能不能替代Data Mining?
- STM32 HAL库手册获取和查阅方法以及查看官方例程
- OEM、ODM、OBM分别是什么?
- 《剑指offer》读后感
- 流利阅读day1 Dysmorphia
- 苹果手机屏幕突然变暗_手机突然屏幕失灵
- 用Websocket聊天完整demo,做笔记用,各位大佬多多指教
- [转]高精度乘法计算
- Required request body is missing: public错误
- 【小学数学出题软件】家长老师必备!训练小孩数学计算能力,可直接生成word打印出题!
- Photoshop文字之——模仿书法字
- uboot下使用U盘启动内核RT5350成功