首页
留言板
友链
统计
Search
1
树莓派换源最新教程及注意事项(更换为清华源)
1,573 阅读
2
Alist上传大文件报错Request failed with status code 413
685 阅读
3
google colab打包下载文件夹
638 阅读
4
Luat Air780E/Air700E使用MQTT协议接入巴法云物联网平台
378 阅读
5
Luat Air780E/Air700E获取设备经纬度后使用MQTT协议发送至巴法云
352 阅读
嵌入式笔记
stm32
esp8266
raspberry-pi
esp32
机器视觉笔记
opencv
yolo
typecho笔记
vps
typecho美化
悄悄话
登录
Search
标签搜索
esp8266
air700e
typecho
onenet
mediapipe
悄悄话
星星
累计撰写
34
篇文章
累计收到
26
条评论
首页
栏目
嵌入式笔记
stm32
esp8266
raspberry-pi
esp32
机器视觉笔记
opencv
yolo
typecho笔记
vps
typecho美化
悄悄话
页面
留言板
友链
统计
搜索到
21
篇与
的结果
2023-04-21
Luat Air780E/Air700E获取设备经纬度后使用MQTT协议发送至巴法云
Air780E/Air700E开发板基于Lua语言使用MQTT协议接入巴法云物联网平台,获取gps模块经纬度数据后上传巴法云。
2023年04月21日
352 阅读
4 评论
0 点赞
2023-04-05
Luat Air780E/Air700E使用定位模块获取设备经纬度
先来代码-- LuaTools需要PROJECT和VERSION这两个信息 PROJECT = "uart_gps" VERSION = "1.0.0" log.info("main", PROJECT, VERSION) -- 引入必要的库文件(lua编写), 内部库不需要require sys = require("sys") if wdt then --添加硬狗防止程序卡死,在支持的设备上启用这个功能 wdt.init(9000)--初始化watchdog设置为9s sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗 end log.info("main", "uart demo") local uartid = 2 -- 根据实际设备选取不同的uartid --初始化 local result = uart.setup( uartid,--串口id 9600,--波特率 8,--数据位 1--停止位 ) -- 收取数据会触发回调, 这里的"receive" 是固定值 uart.on(uartid, "receive", function(id, len) local s = "" repeat -- 如果是air302, len不可信, 传1024 -- s = uart.read(id, 1024) s = uart.read(id, len) if #s > 0 then -- #s 是取字符串的长度 -- log.info("uart", "receive", id, #s, s) local utc_time, lat, lat_ns, lon, lon_ew = string.match(s, "%$GNGGA,(%d+%.%d+),(%d+%.%d+),(%a),(%d+%.%d+),(%a),") if utc_time and lat and lat_ns and lon and lon_ew then log.info("uart", "UTC Time", utc_time) local hour = tonumber(utc_time:sub(1,2)) local minute = tonumber(utc_time:sub(3,4)) local second = tonumber(utc_time:sub(5,6)) hour = hour +8 if hour >=24 then hour = hour -24 end local time_str = string.format("%02d:%02d:%02d", hour, minute, second) -- 转换为时分秒格式 log.info("uart", "Beijing Time", time_str) -- 转换经纬度为GPS坐标格式 local lat_deg = math.floor(tonumber(lat) / 100) local lat_min = tonumber(lat) % 100 local lat_google = lat_deg + lat_min / 60 if lat_ns == "S" then lat_google = -lat_google end log.info("uart", "Latitude", lat_google) local lon_deg = math.floor(tonumber(lon) / 100) local lon_min = tonumber(lon) % 100 local lon_google = lon_deg + lon_min / 60 if lon_ew == "W" then lon_google = -lon_google end log.info("uart", "Longitude", lon_google) end end if #s == len then break end until s == "" end) -- 用户代码已结束--------------------------------------------- -- 结尾总是这一句 sys.run() -- sys.run()之后后面不要加任何语句!!!!!代码解释这段代码实现了通过UART串口读取GPS模块发送的数据,并对数据进行解析和处理,最终输出解析后的结果。具体解释如下:1、设置项目名称和版本号:首先通过 PROJECT 和 VERSION 变量分别设置了项目名称和版本号。2、输出项目名称和版本号:使用 log.info() 函数输出项目名称和版本号。3、引入必要的库文件:使用 require() 函数引入了系统库 sys,用于后续的定时器操作和系统运行。4、如果硬件支持硬狗,初始化并启用硬狗功能:检查系统是否支持硬狗,如果支持则通过 wdt.init() 函数初始化硬狗并设置喂狗时间,通过 sys.timerLoopStart() 函数循环定时喂狗,以避免程序卡死等异常情况。5、输出提示信息:使用 log.info() 函数输出提示信息,表示进入了GPS数据读取和处理的代码段。6、设置UART串口ID:通过 uartid 变量设置了UART串口的ID,这里设置为2。7、初始化UART串口:使用 uart.setup() 函数初始化UART串口,设置波特率为9600,数据位为8位,停止位为1位。8、注册UART串口数据接收回调函数:使用 uart.on() 函数注册UART串口数据接收回调函数,当串口接收到数据时会自动触发回调函数,并将接收到的数据长度作为参数传入回调函数。9、处理UART串口接收到的数据:在回调函数中,使用 uart.read() 函数循环读取串口数据,并使用 string.match() 函数对读取到的数据进行正则匹配,提取出其中的经纬度和时间等信息,然后进行格式转换和计算,并使用 log.info() 函数输出解析后的信息。10、最后,运行代码:通过 sys.run() 函数启动系统运行,让代码可以正常执行。重点代码解释1、定位模块输出(波特率为9600):$GNGGA,084852.000,2236.9453,N,11408.4790,E,1,05,3.1,89.7,M,0.0,M,,*48 $GNGLL,2236.9453,N,11408.4790,E,084852.000,A,A*4C $GPGSA,A,3,10,18,31,,,,,,,,,,6.3,3.1,5.4*3E $BDGSA,A,3,06,07,,,,,,,,,,,6.3,3.1,5.4*24 $GPGSV,3,1,09,10,78,325,24,12,36,064,,14,26,307,,18,67,146,27*71 $GPGSV,3,2,09,21,15,188,,24,13,043,,25,55,119,,31,36,247,30*7F $GPGSV,3,3,09,32,42,334,*43 $BDGSV,1,1,02,06,68,055,27,07,82,211,31*6A $GNRMC,084852.000,A,2236.9453,N,11408.4790,E,0.53,292.44,141216,,,A*7 5 $GNVTG,292.44,T,,M,0.53,N,0.98,K,A*2D $GNZDA,084852.000,14,12,2016,00,00*48 $GPTXT,01,01,01,ANTENNA OK*352、获取经纬度及北京时间:(1)首先使用 uart.read() 函数从串口读取一行数据。使用 string.match() 函数对读取到的数据进行正则匹配,以提取出 "$GNGGA" 行中的经纬度和时间信息。正则表达式为: "%$GNGGA,(%d+%.%d+),(%d+%.%d+),(%a),(%d+%.%d+),(%a)," 其中,括号中的内容表示正则表达式匹配到的结果需要提取出来,具体匹配结果如下:第一个括号 (%d+%.%d+) 表示匹配一个或多个数字,可能包含小数点,表示UTC时间,例如:"084852.000"第二个括号 (%d+%.%d+) 表示匹配一个或多个数字,可能包含小数点,表示纬度,例如:"2236.9453"第三个括号 (%a) 表示匹配一个字母,表示纬度方向,可能为 "N" 或 "S"第四个括号 (%d+%.%d+) 表示匹配一个或多个数字,可能包含小数点,表示经度,例如:"11408.4790"第五个括号 (%a) 表示匹配一个字母,表示经度方向,可能为 "E" 或 "W"(2)使用 tonumber() 函数将读取到的经纬度和时间信息从字符串类型转换为数字类型,并根据具体格式进行转换。例如,对于UTC时间信息,可以使用 string.sub() 函数获取小时、分钟、秒等信息,再进行格式化输出。(3)将经纬度转换为Google Maps格式,即将度分格式转换为十进制格式,并根据方向调整正负值。(4)使用 log.info() 函数输出解析后的结果,包括北京时间、纬度和经度等信息。{alert type="warning"}注:其中,string.match() 函数的正则表达式 "%$GNGGA,(%d+%.%d+),(%d+%.%d+),(%a),(%d+%.%d+),(%a)," 表示匹配以 "$GNGGA" 开头的行,并从中提取出符合规则的内容。具体解释如下:(1)%d+%.%d+ 表示匹配一个或多个数字,可能包含小数点,例如 "084852.000" 和 "2236.9453"(2)%a 表示匹配一个字母,例如 "N" 和 "E"(3)() 表示将括号中的内容作为一个匹配组,需要在 string.match() 函数的返回值中获取。解析出经纬度和时间后,通过数学运算和字符串格式化等操作,将其转换为可以直接使用的格式,并使用 log.info() 函数输出解析后的结果。{/alert}
2023年04月05日
255 阅读
1 评论
0 点赞
2023-04-01
Luat Air780E/Air700E使用MQTT协议接入巴法云物联网平台
Air780E/Air700E开发板基于Lua语言使用MQTT协议接入巴法云物联网平台。
2023年04月01日
378 阅读
1 评论
0 点赞
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日
80 阅读
0 评论
0 点赞
2023-02-16
树莓派VNC连接报错vnc cannot current show the desktop
可能问题一VNC远程桌面连接屏幕分辨率设置错误解决方案: 进入SSH,输入 sudo raspi-config 进入设置界面,进入 Display Options 选项,选择 VNC Resolution 进入调整VNC远程连接的分辨率。可能问题二树莓派内存不足解决方案: 进入SSH,输入以下命令清理内存。sudo apt-get clean sudo apt-get update可能问题三VNC功能未打开解决方案:进入SSH,输入 sudo raspi-config 进入设置界面,进入 Advance Option 中打开VNC功能,等待下载完成后重启树莓派再进行VNC连接。可能问题四直接重启解决
2023年02月16日
58 阅读
1 评论
0 点赞
2023-02-16
正确关闭树莓派(无屏幕和远程桌面情况下)
长期直接断电关闭树莓派易损坏树莓派SD卡,在外接显示器或使用VNC远程桌面连接时可直接在GUI界面上选择关机,等到树莓派系统绿灯停止闪烁后即可断电。 当无外接屏幕或VNC远程桌面连接情况下使用SSH连接,输入以下命令可使树莓派关机,待树莓派绿灯停止闪烁即可断电。sudo shutdown -h now 或sudo halt 重启sudo shutdown -r nowshutdown命令语法shutdown [-t seconds] [-rkhncfF] time [message]{message type="info" content="-t seconds : 设定在几秒钟之后进行关机程序。-k : 并不会真的关机,只是将警告讯息传送给所有使用者。-r : 关机后重新开机。-h : 关机后停机。-n : 不采用正常程序来关机,用强迫的方式杀掉所有执行中的程序后自行关机。-c : 取消目前已经进行中的关机动作。-f : 关机时,不做 fsck 动作(检查 Linux 档系统)。-F : 关机时,强迫进行 fsck 动作。time : 设定关机的时间。message : 传送给所有使用者的警告讯息。"/}halt语法halt [-n] [-w] [-d] [-f] [-i] [-p]{message type="info" content="-n : 在关机前不做将记忆体资料写回硬盘的动作-w : 并不会真的关机,只是把记录写到 /var/log/wtmp 文件里-d : 不把记录写到 /var/log/wtmp 文件里(-n 这个参数包含了 -d) -f : 强迫关机,不呼叫 shutdown 这个指令-i : 在关机之前先把所有网络相关的装置先停止-p : 当关机的时候,顺便做关闭电源(poweroff)的动作"/}
2023年02月16日
106 阅读
3 评论
0 点赞
2023-02-13
树莓派(raspberry-pi)初次启动无屏幕连接wifi并开启ssh和vnc远程桌面
树莓派初次启动自动连接wifi设置 将树莓派系统内存卡插入电脑中,进入 boot 目录,创建 wpa_supplicant.conf 文件,先用记事本打开并添加以下内容。country=CN ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="WiFi-A" psk="PasswordA" priority=1 } network={ ssid="WiFi-B" psk="PasswordB" priority=2 }{message type="warning" content="注:每个network块是一个Wi-Fi连接信息,单个网络情况删除第2个,ssid是Wi-Fi名称,psk为密码,priority值越高越优先连接此Wi-Fi。"/}树莓派初次启动开启SSH功能1、同理在 boot 目录下创建一个空白的文件,文件命名为 ssh (不加任何后缀)。设置完成后 boot 目录如下图所示。 2、在 boot 目录下创建一个 userconf.txt 的文件,内容为以下,即初始化树莓派SSH的初始账号 pi 和初始密码 raspberry 。pi:$6$/4.VdYgDm7RJ0qM1$FwXCeQgDKkqrOU3RIRuDSKpauAbBvP11msq9X58c8Que2l1Dwq3vdJMgiZlQSbEXGaY5esVHGBNbCxKLVNqZW1树莓派初次启动开启VNC功能 上述设置配置好以后将内存卡插入树莓派开机启动,自动连接WIFI后,使用SSH软件连接到树莓派(例如putty),在控制台输入: sudo raspi-config 进入raspi-config页面,按照下图指示开启VNC功能后重启树莓派。 打开电脑的VNC客户端,输入树莓派的IP地址,进入后使用树莓派的登陆账号进入VNC桌面。
2023年02月13日
156 阅读
0 评论
0 点赞
1
2
3