首页
留言板
友链
统计
Search
1
树莓派换源最新教程及注意事项(更换为清华源)
1,617 阅读
2
Alist上传大文件报错Request failed with status code 413
715 阅读
3
google colab打包下载文件夹
656 阅读
4
Luat Air780E/Air700E使用MQTT协议接入巴法云物联网平台
386 阅读
5
Luat Air780E/Air700E获取设备经纬度后使用MQTT协议发送至巴法云
364 阅读
嵌入式笔记
stm32
esp8266
raspberry-pi
esp32
机器视觉笔记
opencv
yolo
typecho笔记
vps
typecho美化
悄悄话
登录
Search
标签搜索
esp8266
air700e
typecho
onenet
mediapipe
悄悄话
星星
累计撰写
34
篇文章
累计收到
31
条评论
首页
栏目
嵌入式笔记
stm32
esp8266
raspberry-pi
esp32
机器视觉笔记
opencv
yolo
typecho笔记
vps
typecho美化
悄悄话
页面
留言板
友链
统计
搜索到
12
篇与
的结果
2023-02-25
ESP8266通过MQTT(旧版)连接onenet平台
#include <ESP8266WiFi.h> #include <PubSubClient.h> #include <ArduinoJson.h> #include <Ticker.h> #include <SimpleDHT.h> #define WIFI_DEBUG 0 //1:使用一键配网,其它值则使用默认无线账号密码 #define ONENET_DISCONNECTED 1 //已经断开 #define ONENET_CONNECTED 2 //已经连接上 #define ONENET_RECONNECT 3 //重连成功 int pinDHT11 = 2; //设置DHT11的引脚 SimpleDHT11 dht11(pinDHT11); #define VER "ESP8266_MQTT_V1.0" //版本号 const char* ssid = "########";//wifi账号 const char* password = "########";//wifi密码 /*OneNet*/ PubSubClient mqttClient; const char* mqttServer = "183.230.40.39";//mqtt服务器 const uint16_t mqttPort = 6002; //端口号 #define onenet_productId "########" //产品ID #define onenet_deviceId "########" //设备ID #define onenet_apiKey "########" //API_KEY int state; Ticker delayTimer; WiFiClient espClient; /* 延时N秒 */ void delayNs(uint8_t m){ for(uint8_t index = 0;index<m;index ++){ delay(1000); ESP.wdtFeed(); } } /* 延时重启 */ void delayRestart(float t) { Serial.print("Restart after "); Serial.print(t); Serial.println("s"); delayTimer.attach(t, []() { Serial.println("\r\nRestart now!"); ESP.restart(); }); } /* 自动连接 */ bool autoConfig() { WiFi.begin(); for (int i = 0; i < 20; i++) { if (WiFi.status() == WL_CONNECTED) { Serial.println("AutoConfig Success"); Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str()); Serial.printf("PSW:%s\r\n", WiFi.psk().c_str()); WiFi.printDiag(Serial); return true; } else { Serial.print("AutoConfig Waiting......"); Serial.println(WiFi.status()); delay(1000); } } Serial.println("AutoConfig Faild!" ); return false; } /* 一键配网 */ void smartConfig() { WiFi.mode(WIFI_STA); Serial.println("\r\nWait for Smartconfig"); WiFi.beginSmartConfig(); while (1) { Serial.print("."); digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); if (WiFi.smartConfigDone()) { Serial.println("SmartConfig Success"); Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str()); Serial.printf("PSW:%s\r\n", WiFi.psk().c_str()); WiFi.setAutoConnect(true); // 设置自动连接 break; } delay(1000); // 这个地方一定要加延时,否则极易崩溃重启 } } /* 连接OneNet */ int connectToOneNetMqtt(){ int cnt = 0; while(!mqttClient.connected()){ ESP.wdtFeed(); cnt++; Serial.println("Connect to OneNet MQTT..."); if (mqttClient.connect(onenet_deviceId,onenet_productId,onenet_apiKey)) { Serial.println("connect success!"); return ONENET_RECONNECT; } else { Serial.print("connect fail!"); Serial.println(" try again in 5 seconds"); delayNs(5); } if(cnt >=10){ //只做10次连接到OneNet,连接不上重启8266 cnt = 0; delayRestart(1); } } return ONENET_CONNECTED; } /* 云端下发 */ void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); if ((char)payload[0] == '1') { digitalWrite(LED_BUILTIN, LOW); } else { digitalWrite(LED_BUILTIN, HIGH); } } /* 发布温度信息 */ void Temp_pubMQTTmsg(uint32_t data){ long lastMsg = 0; char msg[50]; char tmp[28]; char d[3]; snprintf(tmp,sizeof(tmp),"{\"Temp\":%d}",data); uint16_t streamLen= strlen(tmp); d[0]='\x03'; d[1] = (streamLen >> 8); d[2] = (streamLen & 0xFF); snprintf(msg,sizeof(msg),"%c%c%c%s",d[0],d[1],d[2],tmp); mqttClient.publish("$dp", (uint8_t*)msg,streamLen+3,false); } /* 发布湿度信息 */ void Humi_pubMQTTmsg(uint32_t data){ long lastMsg = 0; char msg[50]; char tmp[28]; char d[3]; snprintf(tmp,sizeof(tmp),"{\"Humi\":%d}",data); uint16_t streamLen= strlen(tmp); d[0]='\x03'; d[1] = (streamLen >> 8); d[2] = (streamLen & 0xFF); snprintf(msg,sizeof(msg),"%c%c%c%s",d[0],d[1],d[2],tmp); mqttClient.publish("$dp", (uint8_t*)msg,streamLen+3,false); } /* 初始化系统 */ void initSystem(){ int cnt = 0; Serial.begin (115200); Serial.println("\r\n\r\nStart ESP8266 MQTT"); Serial.print("Firmware Version:"); Serial.println(VER); Serial.print("SDK Version:"); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); Serial.println(ESP.getSdkVersion()); ESP.wdtEnable(5000); if(WIFI_DEBUG==1)//开启一键配网模式 { if (!autoConfig()) { Serial.println("Start smartConfig"); smartConfig(); } } else { WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); cnt++; Serial.print("."); if(cnt>=40){ cnt = 0; //重启系统 delayRestart(1); } } } Serial.print("WIFI Connect \r\n"); } /* 初始化ONENET通信 */ void initOneNetMqtt(){ mqttClient.setServer(mqttServer,mqttPort); mqttClient.setClient(espClient); mqttClient.setCallback(callback); } /* 初始化 */ void setup() { initSystem(); initOneNetMqtt(); } /* 主函数 */ void loop() { ESP.wdtFeed(); state = connectToOneNetMqtt(); Serial.println(WiFi.status()); if(state == ONENET_RECONNECT){ mqttClient.loop(); } else if(state == ONENET_CONNECTED){ // read without samples. byte temperature = 0; byte humidity = 0; int err = SimpleDHTErrSuccess; if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) { Serial.print("Read DHT11 failed, err="); Serial.print(SimpleDHTErrCode(err)); Serial.print(","); Serial.println(SimpleDHTErrDuration(err)); return; } Serial.print("Sample OK: "); Serial.print((float)temperature); Serial.print(" *C, "); Serial.print((float)humidity); Serial.println(" H"); Temp_pubMQTTmsg((float)temperature); Humi_pubMQTTmsg((float)humidity); mqttClient.loop(); } delay(2000); }
2023年02月25日
82 阅读
0 评论
0 点赞
2023-02-03
ESP8266延时函数与定时器对比及注意事项
delay()PKmillis()delay()函数 delay()函数的输入参数为int整型值。这个数字表示程序在进入下一行代码之前必须等待的时间,单位是毫秒。当调用 delay(1000) 时,程序在这一行停止1秒。{message type="warning" content=" 注意:delay()函数是一个阻塞函数。阻塞函数阻止程序运行其他函数,直到该任务完成。如果需要多个任务同时发生则不能使用delay()函数。对于大多数项目,应避免使用延迟函数,而使用定时器。"/}millis()函数 millis()函数可以返回自程序首次启动以来所经过的毫秒数,最长可记录接近50天左右的时间。如果超出记录时间上限,记录将从0重新开始。{message type="warning" content="注意:millis()函数的返回值为无符号长整型数据(unsigned long time), 如果将该数值与整型数据或其它数据类型进行运算,运行结果将产生错误。"/}millis()函数的优点 为什么这个函数是有用的?因为通过使用一些简单的数学运算就可以在不阻塞程序的情况下验证已经过去了多少时间。 :@(得意) 下方是使用millis()函数控制LED灯闪烁的示例程序。const int ledPin = 2; // 设置LED的引脚为GPIO2 int ledState = LOW; // 设置初始化LED状态 unsigned long previousMillis = 0; // 设置初始化时间,为无符号长整型数据 const long interval = 1000; // 设置闪烁间隔,为无符号长整型数据 void setup() { // 初始化LED引脚 pinMode(ledPin, OUTPUT); } void loop() { unsigned long currentMillis = millis();//获取当前时间,为无符号长整形数据 if (currentMillis - previousMillis >= interval) { //当与初始时间差大于设定值时就闪烁 // 复位初始时间为该时刻的时间 previousMillis = currentMillis; // LED翻转程序 if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } digitalWrite(ledPin, ledState); } }{music id="1896892542" color="#1989fa" /}
2023年02月03日
144 阅读
0 评论
0 点赞
2023-02-02
ESP8266连接HC-SR04 超声波传感器测距
ESP8266与HC-SR04超声波传感器接线图HC-SR04ESP8266VCC3.3VGNDGNDTrigGPIO12(D6)EchoGPIO14(D5)程序-使用ESP8266和HC-SR04超声波传感器获取距离const int trigPin = 12;//定义超声波模块trigPin引脚为GPIO12 const int echoPin = 14;//定义超声波模块echoPin引脚为GPIO14 //定义声音传播速度(单位:cm/uS) #define SOUND_VELOCITY 0.034 #define CM_TO_INCH 0.393701 long duration; float distanceCm; float distanceInch; void setup() { Serial.begin(115200); // 设置波特率115200 pinMode(trigPin, OUTPUT); // 设置 trigPin 输出 pinMode(echoPin, INPUT); // 设置 echoPin 输入 } void loop() { // Clears the trigPin digitalWrite(trigPin, LOW); delayMicroseconds(2); // 保持 trigPin 高电平 10 微秒 digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // 读取 echoPin, 返回声波传播时间(单位微秒) duration = pulseIn(echoPin, HIGH); // 计算距离 distanceCm = duration * SOUND_VELOCITY/2; // 距离转换为英寸 distanceInch = distanceCm * CM_TO_INCH; // 将测得距离打印在串口 Serial.print("Distance (cm): "); Serial.println(distanceCm); Serial.print("Distance (inch): "); Serial.println(distanceInch); delay(1000); }重点函数解析之pulseIn() 函数:函数语法: pulseIn(pin, value) 或pulseIn(pin, value, timeout)函数参数: pin 引脚编号 value 脉冲状态 timeout 超时时间(单位:微秒,默认为1s)函数返回: 脉冲持续时长。如果在超时时间内没有读到脉冲信号,将返回0。{message type="warning" content="注意:ESP8266可检测的脉冲间隔时间范围是10微秒到3分钟。请留意假如调用pulseIn()函数时读取低电平信号的引脚上已经为高电平,此时ESP8266将等待该引脚变为低电平以后再开始检测脉冲信号。"/}ESP8266和HC-SR04超声波实验结果示例
2023年02月02日
335 阅读
0 评论
1 点赞
2023-02-01
ESP8266 PWM输出原理及源码
PWM定义 PWM(pulse-width modulation)脉冲宽度调制,MCU(微控制器)通过对开关器件的通断进行控制,使输出端得到一系列幅值相等占空比不同的脉冲,进而控制呼吸灯或电机的转速等。效果如下图所示:{lamp/}ESP8266 PWM输出 ESP8266的数字引脚基本上都可以当作PWM复用引脚(❗注:由于GPIO0在启动时的电平可改变BOOT模式,因此最好不要用GPIO0作为PWM输出引脚),PWM输出程序源码如下所示:const int pwmOutPin = LED_BUILTIN; //led连接到pwm输出引脚 int outputValue = 0; //输出到pwm脚的值 void setup() { // 设置led脚输出pwm模式 pinMode(pwmOutPin, OUTPUT); Serial.begin(115200); } void loop() { //Low to High for(outputValue = 0; outputValue <= 500; outputValue++){ analogWrite(pwmOutPin, outputValue); Serial.println(outputValue); delay(1); } //High to Low for(outputValue = 500; outputValue >= 0; outputValue--){ analogWrite(pwmOutPin, outputValue); Serial.println(outputValue); delay(1); } }Arduino PWM控制函数解析函数:analogWrite(pin,val) 往指定引脚写入数据pin:要启用软件PWM的GPIO引脚val:数值,一般在0到PWMRANGE范围,默认PWMRANGE是1023返回值:无函数:analogWriteRange(new_range) 用于改变PWMRANGE数 值即改变引脚读写的数据范围返回值: 无❗注:可以理解为PWM精度范围。同样的PWM频率下,默认占空数值1023,如果改变PWMRANGE为2047,那么占空数值就变成0-2047。函数:analogWriteFreq(new_frequency) 该功能用于改变PWM频率 new_frequency:新PWM频率,默认是1kHZ 返回值: 无 ❗注:Arduino For ESP8266的PWM频率范围为100Hz-40KHz
2023年02月01日
174 阅读
0 评论
0 点赞
2023-01-28
ESP8266 ADC使用及源码
ESP8266 ADC分辨率 ESP8266的ADC引脚具有10位分辨率,可以读取0-1023范围中的值。ESP8266 ADC电压范围 裸芯片的ADC电压输入范围为0-1V。 ESP8266的开发板(例如NodeMCU)由于存在分压器,输入电压范围为0-3.3V。ESP8266 ADC引脚ESP8266只有一个ADC0引脚,程序中一般定义为A0。ESP8266 ADC测试程序{lamp/}const int analogInPin = A0; // 模拟输入引脚 const int pwmOutPin = LED_BUILTIN; //led连接到pwm输出引脚 int sensorValue = 0; // 从引脚读到的值 int outputValue = 0; //输出到pwm脚的值 void setup() { // 设置引脚为模拟输入模式 pinMode(analogInPin, INPUT); // 设置led脚输出pwm模式 pinMode(pwmOutPin, OUTPUT); Serial.begin(9600); } void loop() { //读取模拟输入数值 sensorValue = analogRead(analogInPin); // 使用map函数把输入的数值进行映射 outputValue = map(sensorValue, 0, 1024, 0, 330);//可以修改数值映射330 3.3V // 改变模拟输出数值 analogWrite(pwmOutPin, outputValue); Serial.println((float)outputValue/100.00); //保留两位小数 // 在串口打印显示输入输出的数值 Serial.print("sensor = "); Serial.print(sensorValue); Serial.print("\t output = "); Serial.println(outputValue); delay(200); }
2023年01月28日
194 阅读
0 评论
0 点赞
2023-01-24
常用ESP8266/ESP32 GPIO引脚图
NodeMCU GPIO引脚图{lamp/} ESP-01S GPIO引脚图{lamp/} {lamp/}ESP32开发板 GPIO引脚图
2023年01月24日
357 阅读
0 评论
0 点赞
2023-01-24
ESP8266连接PCF8591外设的部分问题及解决方法
第一步: 在Arduino IDE中点击 工具>管理库>搜索PCF8591,安装Adafruit PCF8591的库包。第二步: 连接好PCF8591和ESP8266的IIC通信线。第三步: 在Arduino IDE中点击 文件>示例>Adafruit PCF8591 打开PCF8591的示例文件,上传运行即可。PCF8591示例文件:#include <Adafruit_PCF8591.h> // 设置VCC电压为5V,可更改为3.3V #define ADC_REFERENCE_VOLTAGE 5.0 Adafruit_PCF8591 pcf = Adafruit_PCF8591(); void setup() { Serial.begin(115200); while (!Serial) delay(10); Serial.println("# Adafruit PCF8591 demo"); if (!pcf.begin()) { Serial.println("# Adafruit PCF8591 not found!"); while (1) delay(10); } Serial.println("# Adafruit PCF8591 found"); pcf.enableDAC(true); Serial.println("AIN0, AIN1, AIN2, AIN3"); } uint8_t dac_counter = 0; void loop() { // Make a triangle wave on the DAC output pcf.analogWrite(dac_counter++); Serial.print(int_to_volts(pcf.analogRead(0), 8, ADC_REFERENCE_VOLTAGE)); Serial.print("V, "); Serial.print(int_to_volts(pcf.analogRead(1), 8, ADC_REFERENCE_VOLTAGE)); Serial.print("V, "); Serial.print(int_to_volts(pcf.analogRead(2), 8, ADC_REFERENCE_VOLTAGE)); Serial.print("V, "); Serial.print(int_to_volts(pcf.analogRead(3), 8, ADC_REFERENCE_VOLTAGE)); Serial.print("V"); Serial.println(""); delay(1000); } float int_to_volts(uint16_t dac_value, uint8_t bits, float logic_level) { return (((float)dac_value / ((1 << bits) - 1)) * logic_level); }{alert type="warning"}常见问题 上传程序后串口输出 Adafruit PCF8591 not found!解决:检查IIC总线和供电线是否连接正确使用该链接中的程序 ESP8266获取外设IIC地址 检查PCF8591的IIC地址,并把if (!pcf.begin()) { Serial.println("# Adafruit PCF8591 not found!");替换成: if (!pcf.begin(0x48)) { Serial.println("# Adafruit PCF8591 not found!"); //0x48是通过查询IIC地址的程序查询出的PCF8591IIC地址使用Wire.h库修改ESP8266的模拟IIC串口为其他GPIO#include <Wire.h>//导入Wire.h函数库 void setup() { //在上述程序的setup函数中添加Wire.begin(0,2);使用GPIO0和GPIO2作为IIC通信串口 Serial.begin(115200); while (!Serial) delay(10); Wire.begin(0,2);{/alert}
2023年01月24日
188 阅读
0 评论
3 点赞
1
2