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开发学习相关推荐

  1. ESP32 Arduino开发之路(2)— 使用PWM实现LED呼吸灯

    ESP32 Arduino开发之路(2)- 使用PWM实现LED呼吸灯 一.前言 在ESP32上有一个LEDC外设模块专用于输出PWM波形,其介绍如下所示: 参考文章:在 ESP32 上使用 LEDC ...

  2. arduino开发学习日记 3.15

    1.三种常用的Arduino开发板 https://www.sohu.com/a/334500336_796852 2.认识Processing-PDE(与Arduino交互做PC机上的数据展示) h ...

  3. Arduino开发版学习计划

    制定学习开发版的计划,今天先大体过一下整个教程. http://www.bilibili.com/video/av6105302/ 视频中说可以自己制造亦可卫星放上天. Arduino使用C/C++编 ...

  4. 【ESP32 S3开发】在Arduino IDE中使用PSRAM

    一.前言 最近使用ESP32 WROOM开发语音识别项目时,需要使用阵列麦克风采集信号,并进行切片取出含有语音部分的片段,进而使用base64编码将语音上传到后端服务器进行识别. 在项目开发时,发现虽 ...

  5. ESP32基于arduino开发的心跳体温检测系统(一)项目介绍及准备

    本文为被北邮信息系统设计课程摧残的同学们(包括但不限于作者的室友)提供一个可行的方案及模板. 本项目使用Arduino作为开发环境,使用ESP32开发一个心跳体温检测系统. 系统通过心跳传感器--pu ...

  6. Arduino手动添加ESP32相关开发板(图文并茂)

    一.前述   使用Arduino开发ESP32,就绕不开添加ESP32开发板这一步,网上有很多相关教程,介绍的很详细,但是在实际操作过程中还是遇到一些问题,所以在这里记录一下,希望可以帮到别人.    ...

  7. ESP32C3基于Arduino框架下的 ESP32 RainMaker开发示例教程

    ESP32C3基于Arduino框架下的 ESP32 RainMaker开发示例教程 ESP RainMaker ESP RainMaker 是乐鑫推出的一个端到端平台.基于该平台,用户无需管理基础设 ...

  8. 使用Arduino开发ESP32(八):ESP32的EPROM的写入读取

    写入EPROM /* 该代码向EEPROM写入4096字节数据 */ #include <EEPROM.h>void setup() {Serial.begin(115200);Seria ...

  9. 使用乐鑫官方资源搭建基于Arduino的ESP32的开发环境

    目录 一.配置IDE管理器 二.自动安装板支持包 三.手动安装板支持包 四.网盘的ESP32全系列基本库的板支持包 使用乐鑫官方库搭建Arduino开发环境. 乐鑫官方Github:GitHub - ...

  10. 【ESP32最全学习笔记(基础篇)——5.ESP32 数字输入和数字输出(Arduino IDE)】

    关于本教程: ESP32 基础篇 1.ESP32简介 2.ESP32 Arduino 集成开发环境 3.VS 代码和 PlatformIO 4.ESP32 引脚 5.ESP32 输入输出 ☑ 6.ES ...

最新文章

  1. 配深度学习环境要注意的不多,也就
  2. 这样学习正则表达式就轻松了!
  3. linux终端里CTRL-Z和CTRL-C的区别
  4. Python编程系列---使用字典实现路由静态路由
  5. electronics.local在SAP Hybris中出现的几个位置
  6. 多CPU,多核,多进程,多线程以及进程和线程的简单理解以及区别
  7. JavaScript自动设置IFrame高度(兼容各主流浏览器)
  8. mysql 数据库异常_Mysql连接数据库异常汇总【必收藏】
  9. 数据分析能不能替代Data Mining?
  10. STM32 HAL库手册获取和查阅方法以及查看官方例程
  11. OEM、ODM、OBM分别是什么?
  12. 《剑指offer》读后感
  13. 流利阅读day1 Dysmorphia
  14. 苹果手机屏幕突然变暗_手机突然屏幕失灵
  15. 用Websocket聊天完整demo,做笔记用,各位大佬多多指教
  16. [转]高精度乘法计算
  17. Required request body is missing: public错误
  18. 【小学数学出题软件】家长老师必备!训练小孩数学计算能力,可直接生成word打印出题!
  19. Photoshop文字之——模仿书法字
  20. uboot下使用U盘启动内核RT5350成功

热门文章

  1. 计算机绘图员技师证怎么考,地图制图员》与 《摄影测量员》中级高级工程测量职业标准-如何考-考什么内容...
  2. walking机器人仿真教程-仿真控制
  3. 【硬核技术文】研发绩效,AI算法的完美舞台
  4. 电视行业和政策发展历程
  5. 拳皇 - 人物动作素材图 61种
  6. 获取元素的 CSS 样式
  7. matlab 关键路径函数,用线性规划建模(确定参数)关键路径法
  8. 打造铜墙铁壁 DDoS攻击全面解析
  9. 一段java代码_写了一段Java代码,希望大家多多指点
  10. 什么是Cutoff Scores/Marks?