当前位置: 首页 > news >正文

网站后期维护合同自学网站推荐

网站后期维护合同,自学网站推荐,做网站用小图标在什么网下载,php mysql网站开发全程实例目录 材料环境准备物理材料软件环境 物联网平台配置#xff08;MQTT#xff09;MQTT阿里云平台配置创建产品添加设备自定义topic esp32配置接线代码 Android部分和云平台数据流转 前言#xff1a;出租屋、宿舍网上关灯问题#xff0c;计划弄一个智能开关以及带一点安防能力… 目录 材料环境准备物理材料软件环境 物联网平台配置MQTTMQTT阿里云平台配置创建产品添加设备自定义topic esp32配置接线代码 Android部分和云平台数据流转 前言出租屋、宿舍网上关灯问题计划弄一个智能开关以及带一点安防能力如检测有人进入之类的同时也是回顾一下以前掌握的知识。 材料环境准备 本身这个东西不难做网上也有了很多的实现案例没什么技术难度但是有一定的实用效果。 本设计分为三个部分ESP32硬件、Android、阿里云 物理材料 esp32开发板控制核心、网络连接 舵机SG90-180°用于控制拨动开关实现开关灯 杜邦线连接模块或者进行跳线接线 供电部分考虑供电部分的话需要锂电池、充放电模块、电烙铁等焊接工具。 扩展超声波模块用于检测是否有人进入或者实现夜间回家自动开灯等。 软件环境 esp32 arduino开发环境需要设置首选项json、下载esp32开发板的包耗时长可能失败网上有一些离线安装的方法教程可以参考。 esp32 esp-idf框架这个也是一个esp32的开发环境可以在vscode上集成听说用起来很方便和arduino二选一即可我目前用的arduino配置好了esp-idf框架还未使用感觉编译要太长的时间了。。。。 android studio用于开发android软件方便调试自己开发具有更高的扩展性方便连接到云平台这个需要一定的基础最好以前弄过不然搭环境下软件也挺费时间。 阿里云主要也是为了实现无距离限制控制这就是上云的好处此外也可以实现如果不在家有人进了房子配合超声波或者激光实现提醒入侵检测的功能。此外也许也可以通过其他的物联网平台和对应的app实现远程控制比如电灯科技还可以加入米家实现小爱语言远程控制但是相对而言可扩展性小。 物联网平台配置MQTT 首先要介绍云平台是因为其他两个部分都需要连接到云平台所以这里的配置有限另外就是介绍mqtt协议进行介绍方便理解后续代码的含义。 MQTT 八股文我就不说了直接说大概实现的原理和通讯的过程。 条件设备联网可以使用mqtt协议、云平台中间做消息流转 云平台首先要创建产品、创建设备产品可以理解为一个类设备是实现的子类这些子类可以有一些共同的特性这是产品里面定义的。一个设备就是对应实际的一个物理设备创建好设备后会有对应的密码、设备名称、ID之类的一些标志用来将你的设备连接到云平台。这应该就是mqtt协议中规定好的。 MQTT是一种基于发布/订阅publish/subscribe模式的“轻量级”通讯协议。发布就是指发布消息你发布消息给云平台或者云平台发布给你。订阅就是你订阅某一个主题topic这样云平台就可以通过这个主题来给你发布消息。 消息流转设备和云平台可以通过订阅和发布的方式进行消息传递但是设备和设备之间无法直接进行通讯需要通过云平台来进行中间消息转发。这个是通过云平台实现的云平台设置即可无需代码实现。 阿里云平台配置 本次设计是通过阿里云物联网平台实现相应的功能。 阿里云物联网平台 注册登录阿里云物联网平台提供免费的公共实例可以试用。 创建产品 添加设备 然后为对应产品添加设备需要添加两个设备一个是esp32的一个是手机app的。 创建好设备后可以查看设备里面有相关的连接信息。 这些信息都需要在后续中使用届时进行查看复制进入对应代码区即可。 自定义topic 注产品可以设置物理模型设置一些共有属性这样物联网平台也可以进行控制和查看对应的属性设置好物理模型后会有专门对应的topic进行发送相关属性的消息但同样也包含了一些其他无关信息为了方便我可以可以自定义topic这些操作都需要在产品中区定义实现。 定义topic类可以自己命名topic并选择类型发布还是订阅或者两个都选订阅的话表示这个主题是用来订阅的也就是设备订阅了这个主题后可以从云台中看到并通过这个订阅发布消息。 发布的主题指的就是设备用来发布消息的将消息传递至云平台的topic。 如果不需要向云平台发布消息可以不进行定义产品中需要手机向云平台发布开灯消息所以需要进行定义。 我定义了两个主题一个是舵机的一个是超声波主要是想实现两个功能都是基于发布和订阅的这有利有弊比较方便吧。 区别可以从下面的例子中看出来 我的设备定义了三个topic分别是物理模型自带的一个属性设置的topic两个自定义topic 产品物理模型自带的topic 可以看到自带的主题的操作权限只有订阅也就是设备用来订阅无法进行发布这样在设备列表中订阅的topic中无法实现发布消息功能而另外两个自定义主题由于设置了发布和订阅所以订阅后同时也可以进行消息发布。 本节的主要目的创建产品创建对应的自定义主题创建两个设备获取连接信息用于设备进行mqtt通讯连接。 esp32配置 本节主要介绍esp32的配置和物理设备的接线。 接线 首先看接线由于用到超声波需要的也是5v的电压供电但是开发板只有一个5V口此外还要和充放电模块接线所以这里肯定需要将几根线剪开连接起来并用电工胶带绑好。 如果你只有一个就直接用杜邦线就可以但是考虑供电也需要接线或者找一个带usb口的充放电模块这样直接用usb供电给开发板也可以。 如果自行设计PCB自然就会更方便初步测试时就没有打板。 代码 现阶段代码非常简单因为有很多的封装库实现所以控制代码调用函数就可以设置都不用去管什么pwm控制设置占空比什么什么的非常方便esp32和esp8266这些arduino的都是一样的确实是加快了开发进程。 控制代码非常简单主要就是上云连接到阿里云了。 以下就是完整代码 主要包含功能 ESP32连接wifi 初始化舵机控制信号线控制舵机(设置角度) 超声波测距并自动开关灯根据时间 getDistance() 上报到云人员经过超声波检测的时间可以进行记录查看到有人进出房间的时间 (超声波这部分代码注销了原因有很多一个是不便调试另外超声波的布置位置很不方便也容易导致误触线长的问题另外就是房间的问题不便部署激光模块效果更优) 阿里云mqtt通讯连接的代码回调处理代码就是接收到云平台的订阅消息时做出的逻辑处理 aliyun_callback() 还有连接和订阅操作这些都比较简单调用函数即可这里的回调中实现了两种方式一种是基于产品的物理模型提供的topic进行订阅和操作一个是自定义的进行操作自定义的topic相对比较简单。 #include WiFi.h #include ESP32Servo.h #include PubSubClient.h #include ArduinoJson.h#include NTPClient.h #include WiFiUdp.h #include time.h // 用于时间处理// 定义 NTP 客户端 WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, pool.ntp.org, 8 * 3600, 60000); // 使用 pool.ntp.org 服务器时区偏移为 8 小时东八区// WiFi配置 const char* ssid *****;//wifi名称 const char* password ******;//wifi密码// 阿里云物联网平台配置 const char* mqtt_server ; // 替换为你的阿里云IoT endpoint const char* mqtt_username ; // 替换为你的设备名称和产品Key const char* mqtt_password ; // 替换为你的设备密钥 const char* mqtt_client_id ; // 替换为你的客户端ID // esp32_601 // MQTT主题 const char* servo_topic ; // 替换为你的舵机控制主题 const char* person_detected_topic ; // 替换为你的人员检测主题WiFiClient espClient; //创建网络连接客户端 PubSubClient mqttClient(espClient); //通过网络客户端连接创建mqtt连接客户端// 舵机引脚 const int servoPin 27; Servo myServo;//调试后的固定开关等角度值 const int light_off 112; const int light_on 72; // 这两个值需要自己进行调试此外我设置的是90°的时候舵机是横向的 // 超声波引脚 const int trigPin 25; const int echoPin 26;// led引脚 const int led0Pin 2; //板载led可以用来调试观察现象 // 初始化LED void setupLED() {pinMode(led0Pin, OUTPUT);digitalWrite(led0Pin, LOW); // 初始状态为关闭 }// 初始化舵机 void setupServo() {myServo.attach(servoPin); // 将舵机连接到指定引脚myServo.write(90); // 初始角度设为90度 }// 初始化超声波传感器 void setupUltrasonic() {pinMode(trigPin, OUTPUT);pinMode(echoPin, INPUT); }// 超声波测距函数 float getDistance() {digitalWrite(trigPin, LOW);delayMicroseconds(2);digitalWrite(trigPin, HIGH);delayMicroseconds(10);digitalWrite(trigPin, LOW);long duration pulseIn(echoPin, HIGH); // 读取回波时间float distance duration * 0.034 / 2; // 计算距离单位厘米return distance; }//初始化连接wifi void setup_wifi() {delay(10);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.print(IP address: );Serial.println(WiFi.localIP()); }void aliyun_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(strcmp(topic, /sys/${}/${设备名}/thing/service/property/set) 0){// // 将 payload 转换为字符串// char message[length 1];// memcpy(message, payload, length);// message[length] \0; // 添加字符串结束符// Serial.println(message);// // 解析 JSON 数据// StaticJsonDocument200 doc; // 根据 JSON 数据大小调整缓冲区大小// DeserializationError error deserializeJson(doc, message);// // 检查解析是否成功// if (error) {// Serial.print(Failed to parse JSON: );// Serial.println(error.c_str());// return;// }// // {method:thing.service.property.set,id:1107300794,params:{servo:1},version:1.0.0} 这是物理模型消息模板真正需要的数据就是{servo:1}// // 提取 JSON 字段// int servo_angle doc[params][servo]; // 获取 command 字段// // int angle doc[angle]; // 获取 angle 字段// // int duration doc[duration]; // 获取 duration 字段// myServo.write(servo_angle);//设置角度// }// 处理舵机控制消息 自定义模型自己定义主题topic和解析比较简单方便不需要多余的处理if (strcmp(topic, servo_topic) 0) {//获取消息 获取设置值// 将字节数组转换为字符串char payloadStr[length 1]; // 加1是为了加上字符串结束符 \0memcpy(payloadStr, payload, length);payloadStr[length] \0; // 确保字符串结束// 假设 payloadStr 是一个整数的文本格式 消息体内容只有舵机的设置参数为纯数字int intValue atoi(payloadStr);Serial.print(Received integer value: );Serial.println(intValue);if(intValue0 intValue180){myServo.write(intValue); // 控制舵机转动到90度delay(500);myServo.write(90);//设置完后自动调整为90,这样不会卡住手动拨动灯开关}} }void reconnect() {while (!mqttClient.connected()) {Serial.print(Attempting MQTT connection...);if (mqttClient.connect(mqtt_client_id, mqtt_username, mqtt_password)) {Serial.println(connected);mqttClient.subscribe(servo_topic);mqttClient.subscribe(person_detected_topic);//连接成功后订阅主题这样才能接收到消息} else {Serial.print(failed, rc);Serial.print(mqttClient.state());Serial.println( try again in 5 seconds);delay(5000);}} } void setup() {Serial.begin(115200);setupLED();setupServo(); // 初始化舵机setupUltrasonic(); // 初始化超声波传感器setup_wifi(); //初始化连接wifi// 初始化 NTP 客户端timeClient.begin();timeClient.update(); // 获取时间//mqtt 初始化配置mqttClient.setServer(mqtt_server, 1883);mqttClient.setCallback(aliyun_callback); }void loop() {if (!mqttClient.connected()) {reconnect();}mqttClient.loop();// 主循环中可以添加其他逻辑// 固件升级 先不考虑// 检测到有人进入 --两种情况无人报警// 检测有人进入上报时间获取时间并上报同时根据时间判断是否开灯// float distance 0;// distance getDistance();未进行测量似乎结果为不确定的不为0不对可能为0// Serial.println(当前距离: String(distance));// if(distance 50 distance 0){ //超声波// //有人经过// //获取时间// // 更新 NTP 时间// timeClient.update();// // 获取当前小时数24小时制// int currentHour timeClient.getHours();// if(currentHour 18 || currentHour 7) { // 如果是18点即下午6点以后或早上6点之前// myServo.write(light_on);// Serial.println(Its evening or night, turning the light on.);// delay(500);// myServo.write(90);// } else {// // digitalWrite(ledPin, LOW); // 关灯// myServo.write(light_off);// Serial.println(Its daytime, turning the light off.);// delay(500);// myServo.write(90);// }// //上报消息// unsigned long epochTime timeClient.getEpochTime();// // 将 Unix 时间戳转换为格式化字符串时间// time_t rawTime (time_t)epochTime;// struct tm *ptm gmtime(rawTime);// char timeStr[30];// strftime(timeStr, sizeof(timeStr), %Y-%m-%d %H:%M:%S, ptm); // // 打印完整的时间字符串// Serial.print(Current date and time: );// Serial.println(timeStr);// // 发布人员检测消息// String message Person detected at String(timeStr);// mqttClient.publish(person_detected_topic, message.c_str());// }delay(200); // 延时20m秒 } 代码中都有详细的注释不懂可以评论区留言。 // 阿里云物联网平台配置 const char* mqtt_server ; // 替换为你的阿里云IoT endpoint const char* mqtt_username ; // 替换为你的设备名称和产品Key const char* mqtt_password ; // 替换为你的设备密钥 const char* mqtt_client_id ; // 替换为你的客户端ID // esp32_601 // MQTT主题 const char* servo_topic ; // 替换为你的舵机控制主题 const char* person_detected_topic ; // 替换为你的人员检测主题这些就是上一节提到的创建设备时可以查阅的相关连接参数以及创建产品的时候自定义的消息topic 注意、踩坑 这里有一个需要注意的地方就是主题这里从云平台复制出来的主题往往包含${deviceName}这个部分这里需要替换为你对应的设备名称记住是设备名称别复制错了。 /*********/${deviceName}/user/person_detect 假如你的设备名称是esp32 替换为 /*********/esp32/user/person_detect 另外回调函数中的处理 // 处理舵机控制消息 自定义模型自己定义主题topic和解析比较简单方便不需要多余的处理if (strcmp(topic, servo_topic) 0) {这里就是判断到来的消息是哪个主题的是否为舵机控制主题的是才进入舵机主题消息的解析因为发布的消息可能有别的主题的消息不判断直接解析可能会出错不同的topic的解析也不一样因为数据内容可能不一样。 Android部分和云平台数据流转 剩下的部分就下一篇再介绍吧码字不易点个赞吧有什么问题欢迎评论区留言。 关注我分享更多的实用小设计。
http://www.dnsts.com.cn/news/88428.html

相关文章:

  • 浙江网站建设哪里好网站建设有前途
  • 运城市住房与城乡建设厅网站手机外贸网站建设
  • 免费正能量励志网站邢台贴吧123
  • 深圳建网站seo找人注册公司多少钱
  • 青岛网站公司哪家好北仑网站建设培训
  • 免费空间做网站怎么通过局域网建设网站
  • wordpress微信qq登陆做360网站优化快速
  • 小型企业网站建设wordpress技术分析
  • 赣榆哪里有做网站的怎么增加网站外链
  • 余姚网站建设yyshj长沙seo咨询
  • 手机能搭建网站吗被称为网页制作三剑客的是
  • 现在主流的网站开发平台有哪些WordPress 网店 主体
  • p2p种子网站建设好的网站设计
  • 著名的外贸网站今天高清视频免费播放
  • 十堰公司做网站温州建网站哪家好
  • 做衣服视频有些什么网站动易网站 设置背景图片
  • 网站触屏版湖北省建设工程造价信息网官网
  • 国外网站服务器免费什么学做网站
  • wap网站不流行计算机培训班价格
  • 网站建设工期网站seo优化分析报告
  • 建站 小语种 连接许昌网站建设
  • 北京市住房和城乡官网优化网站聊城
  • 上海网站搜索引擎优化网站规划对网站建设起到什么作用
  • 安徽网站建设网络公司深圳龙岗网站建设
  • 电子商务网站建设与维护03郑州网站网络营销
  • 池州专业网站建设怎么样模板建站流程
  • 长治怎么做平台软件沈阳seo推广
  • 潍坊做网站的那家好深圳网络营销做什么的
  • 小说网站怎么做原创wordpress超链接代码
  • 商城网站如何提高收录WordPress 4.8.1 增强版