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

access数据库网站开发博客个人目录wordpress

access数据库网站开发,博客个人目录wordpress,市场营销毕业后做什么工作,vs网站开发效果图作为入门本篇只实现微信小程序接收下位机上传的数据#xff0c;之后会持续发布如下项目#xff1a;①可以实现微信小程序控制下位机动作#xff0c;真正意义上的智能家居#xff1b;②将网络通讯协议换成MQTT协议再实现上述功能#xff0c;此时的服务器也不再是ONENET之后会持续发布如下项目①可以实现微信小程序控制下位机动作真正意义上的智能家居②将网络通讯协议换成MQTT协议再实现上述功能此时的服务器也不再是ONENET可以是公用的MQTT服务器也可以自己搭建或者租 最终效果一、下位机模块测试与分析1、MQ系列传感器2、DHT11温湿度传感器3、Esp8266-01s4、oled液晶屏 二、微信小程序三、项目获取 这个项目参考的是b站up主彼岸有光我们有船 最终效果 实物图 主控是STM32F103C8T6这里arduino开发板我只是拿来给几个模块供电的有面包板的话也可以用面包板用到的模块有MQ-4天然气传感器、MQ-9可燃气体传感器、0.96寸oled液晶屏、DHT11温湿度传感器、Esp8266-01s、J-Link下载器。 ONENET云平台 微信小程序 一、下位机模块测试与分析 1、MQ系列传感器 MQ气体传感器使用的气敏材料是在清洁空气中电导率较低的二氧化锡。当传感器所处环境中存在可燃气体时传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。MQ气体传感器对甲烷的灵敏度高,对丙烷、丁烷也有较好的灵敏度。这种传感器可检测多种可燃性气体特别是天然气。 关于这个传感器的详细资料可以下载阅读我用夸克网盘分享了「MQ-2-135-3-7-9烟雾空气敏酒精氢一氧化碳可燃液化传感器模块探头.rar」点击链接即可保存。打开「夸克APP」无需下载在线播放视频畅享原画5倍速支持电视投屏。 链接https://pan.quark.cn/s/22c08247dd8a 提取码xLRC 在这个项目中只需要接三个引脚VCC、GND、AO。AO输出接开发板的IO口通过ADC将传感器的模拟输出转换成数字量。这里用到了开发板上ADC1的通道2、3对应GPIOA-2、GPIOA-3。 关于 ADC的使用可以直接看视频 https://www.bilibili.com/video/BV1th411z7sn/?p21spm_id_frompageDrivervd_source2a10d30b8351190ea06d85c5d0bfcb2a 下面是多通道ADC源码如果想再加的话只需要在初始化gpio的时候加上需要的io口即可但是需要对应io口与adc通道的对应关系 #include stm32f10x.h // Device headervoid AD_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;ADC_InitTypeDef ADC_InitStructure; //定义结构体变量/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //开启ADC1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*设置ADC时钟*/RCC_ADCCLKConfig(RCC_PCLK2_Div6); //选择时钟6分频ADCCLK 72MHz / 6 12MHz/*GPIO初始化*/GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure); //将PA0、PA1、PA2和PA3引脚初始化为模拟输入/*不在此处配置规则组序列而是在每次AD转换前配置这样可以灵活更改AD转换的通道*//*ADC初始化*/ADC_InitStructure.ADC_Mode ADC_Mode_Independent; //模式选择独立模式即单独使用ADC1ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; //数据对齐选择右对齐ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; //外部触发使用软件触发不需要外部触发ADC_InitStructure.ADC_ContinuousConvMode DISABLE; //连续转换失能每转换一次规则组序列后停止ADC_InitStructure.ADC_ScanConvMode DISABLE; //扫描模式失能只转换规则组的序列1这一个位置ADC_InitStructure.ADC_NbrOfChannel 1; //通道数为1仅在扫描模式下才需要指定大于1的数在非扫描模式下只能是1ADC_Init(ADC1, ADC_InitStructure); //将结构体变量交给ADC_Init配置ADC1/*ADC使能*/ADC_Cmd(ADC1, ENABLE); //使能ADC1ADC开始运行/*ADC校准*/ADC_ResetCalibration(ADC1); //固定流程内部有电路会自动执行校准while (ADC_GetResetCalibrationStatus(ADC1) SET);ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1) SET); }/*** 函 数获取AD转换的值* 参 数ADC_Channel 指定AD转换的通道范围ADC_Channel_x其中x可以是0/1/2/3* 返 回 值AD转换的值范围0~4095*/ uint16_t AD_GetValue(uint8_t ADC_Channel) {ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5); //在每次转换前根据函数形参灵活更改规则组的通道1ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发AD转换一次while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) RESET); //等待EOC标志位即等待AD转换结束return ADC_GetConversionValue(ADC1); //读数据寄存器得到AD转换的结果 }2、DHT11温湿度传感器 1、DHT11 采用单总线协议与单片机通信概括起来是两个大过程配对和数据传输下面对两个过程进行分析 ①配对过程 1Data引脚在默认状态时处于高电平 2在开始通信时MCU将Data引脚拉低并保持18ms然后再将Data引脚拉高20-40us 3当DHT11收到命令后它会主动拉低Data引脚持续80us 4DHT11再次拉高DATA引脚80us后开始发送数据给MCU。 ②数据传输 1在每次发送数据之前DHT11会把Data引脚先拉低50us这表示单片机要继续发送下一位数据 2DHT11拉高Data引脚如果拉高持续时间是26-28us表示发送0如果拉高的持续时间是116-118us表示发送1。 2、驱动代码 ①c文件 #include dht11.h #include delay.h//复位DHT11 void DHT11_Rst(void) { DHT11_IO_OUT(); //SET OUTPUTDHT11_DQ_OUT0; //拉低DQdelay_ms(20); //拉低至少18msDHT11_DQ_OUT1; //DQ1 delay_us(30); //主机拉高20~40us } //等待DHT11的回应 //返回1:未检测到DHT11的存在 //返回0:存在 u8 DHT11_Check(void) { u8 retry0;DHT11_IO_IN();//SET INPUT while (DHT11_DQ_INretry100)//DHT11会拉低40~80us{retry;delay_us(1);}; if(retry100)return 1;else retry0;while (!DHT11_DQ_INretry100)//DHT11拉低后会再次拉高40~80us{retry;delay_us(1);};if(retry100)return 1; return 0; } //从DHT11读取一个位 //返回值1/0 u8 DHT11_Read_Bit(void) {u8 retry0;while(DHT11_DQ_INretry100)//等待变为低电平{retry;delay_us(1);}retry0;while(!DHT11_DQ_INretry100)//等待变高电平{retry;delay_us(1);}delay_us(40);//等待40usif(DHT11_DQ_IN)return 1;else return 0; } //从DHT11读取一个字节 //返回值读到的数据 u8 DHT11_Read_Byte(void) { u8 i,dat;dat0;for (i0;i8;i) {dat1; dat|DHT11_Read_Bit();} return dat; } //从DHT11读取一次数据 //temp:温度值(范围:0~50°) //humi:湿度值(范围:20%~90%) //返回值0,正常;1,读取失败 u8 DHT11_Read_Data(u8 *temp,u8 *humi) { u8 buf[5];u8 i;DHT11_Rst();if(DHT11_Check()0){for(i0;i5;i)//读取40位数据{buf[i]DHT11_Read_Byte();}if((buf[0]buf[1]buf[2]buf[3])buf[4]){*humibuf[0];*tempbuf[2];}}else return 1;return 0; } //初始化DHT11的IO口 DQ 同时检测DHT11的存在 //返回1:不存在 //返回0:存在 u8 DHT11_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端口时钟GPIO_InitStructure.GPIO_Pin GPIO_Pin_8; //PA0端口配置GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure); //初始化IO口GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA0 输出高DHT11_Rst(); //复位DHT11return DHT11_Check();//等待DHT11的回应 } ②头文件 #ifndef __DHT11_H #define __DHT11_H #include sys.h //IO方向设置 #define DHT11_IO_IN() {GPIOA-CRH0XFFFFFFF0;GPIOA-CRH|8;} #define DHT11_IO_OUT() {GPIOA-CRH0XFFFFFFF0;GPIOA-CRH|3;} IO操作函数 #define DHT11_DQ_OUT PAout(8) //数据端口 PA0出方向 #define DHT11_DQ_IN PAin(8) //数据端口 PA0入方向u8 DHT11_Init(void);//初始化DHT11 u8 DHT11_Read_Data(u8 *temp,u8 *humi);//读取温湿度 u8 DHT11_Read_Byte(void);//读出一个字节 u8 DHT11_Read_Bit(void);//读出一个位 u8 DHT11_Check(void);//检测是否存在DHT11 void DHT11_Rst(void);//复位DHT11 #endif主函数中直接调用DHT11_Read_Data定义两个变量接收即可。 3、Esp8266-01s 在使用单片机连接此模块前最好先进行测试测试可以参考之前的一篇博客这篇博客还有如何在ONENET云平台创建产品和设备https://blog.csdn.net/m0_71523511/article/details/135887108 驱动代码 #include esp8266.hchar *str[4] {POST /devices/1038xxxxxxxx/datapoints HTTP/1.1,api-key:wfsF4bCGtQIQmWxxxxxxxx,Host:api.heclouds.com,}; char strValue[8] {0};// 向onenet发送数据 u8 *esp8266_str_data(char *key, char *value) {u8 i;u8 *back;char temp[512];char temp3[64]; // 长度char temp5[128]; // 发送值// 拼接post报文strcpy(temp5, {\datastreams\:[{\id\:\);strcat(temp5, key);strcat(temp5, \,\datapoints\:[{\value\:);strcat(temp5, value);strcat(temp5, }]}]});strcpy(temp3, Content-Length:);sprintf(temp, %d, strlen(temp5) 1);strcat(temp3, temp);strcpy(temp, );for (i 0; i 3; i){strcat(temp, str[i]);strcat(temp, \r\n);}strcat(temp, temp3);strcat(temp, \r\n\r\n);strcat(temp, temp5);strcat(temp, \r\n);back esp8266_send_data((u8 *)temp, 50);// printf(server:%s\r\n, back);if (strstr((char *)back, ERROR)) //发送失败, 重新初始化,发送{esp8266_send_cmd(ATRST, OK, 50);esp8266_send_cmd(ATCIPCLOSE, OK, 50);esp8266_send_cmd(ATCWMODE1, OK, 50);esp8266_send_cmd(ATCWDHCP1, OK, 50);//esp8266_send_cmd(ATCIPMUX0, OK, 50);while (esp8266_send_cmd(ATCIPSTART\TCP\,\183.230.40.33\,80, CONNECT, 100));//esp8266_send_cmd(ATCIPMODE1, OK, 50);//esp8266_send_cmd(ATCIPSEND, OK, 20);return esp8266_send_data((u8 *)temp, 50);}return back; }// 向esp8266请求数据 u16 esp8266_get_data(char *vStr) {u8 i;u16 value 0;char *back;char temp[160] GET /devices/1038269453/datastreams/;// 拼接请求报文strcat(temp, vStr);strcat(temp, HTTP/1.1\r\n);for (i 1; i 4; i){strcat(temp, str[i]);strcat(temp, \r\n);}// 发送报文, 获取返回字符串back (char *)esp8266_send_data((u8 *)temp, 50);// 在回送报文中截取出数值back strchr(strstr(back, \current_value\:), :) 1;while (*back ! }){if(*back \){back;continue;}value value * 10 (*back - 0);back;}return value; }//ESP8266模块和PC进入透传模式 void esp8266_start_trans(void) {//让Wifi模块重启的命令esp8266_send_cmd(ATRST, OK, 50);esp8266_send_cmd(ATCIPCLOSE, OK, 50);esp8266_send_cmd(ATCWMODE1, OK, 50);esp8266_send_cmd(ATCWDHCP1, OK, 50);delay_ms(1000); //延时2S等待重启成功delay_ms(1000);//让模块连接上自己的路由WIFI GOT IPwhile (esp8266_send_cmd(ATCWJAP\WZQ\,\1234567890\, WIFI GOT IP, 500)){delay_ms(1);};//建立TCP连接 这四项分别代表了 要连接的ID号0~4 连接类型 远程服务器IP地址 远程服务器端口号while (esp8266_send_cmd(ATCIPSTART\TCP\,\183.230.40.33\,80, CONNECT, 200)){delay_ms(1);}; }//ESP8266退出透传模式 返回值:0,退出成功;1,退出失败 //配置wifi模块通过想wifi模块连续发送3个每个号之间 超过10ms,这样认为是连续三次发送 u8 esp8266_quit_trans(void) {u8 result 1;u3_printf();delay_ms(1000); //等待500ms太少 要1000ms才可以退出result esp8266_send_cmd(AT, OK, 20); //退出透传判断.if (result)printf(quit_trans failed!);elseprintf(quit_trans success!);return result; }//向ESP8266发送命令 //cmd:发送的命令字符串;ack:期待的应答结果,如果为空,则表示不需要等待应答;waittime:等待时间(单位:10ms) //返回值:0,发送成功(得到了期待的应答结果);1,发送失败 u8 esp8266_send_cmd(u8 *cmd, u8 *ack, u16 waittime) {u8 res 0;USART3_RX_STA 0;u3_printf(%s\r\n, cmd); //发送命令delay_ms(1);if (ack waittime) //需要等待应答{while (--waittime) //等待倒计时{delay_ms(10);if (USART3_RX_STA0X8000) //接收到期待的应答结果{if (esp8266_check_cmd(ack)){printf(%s\r\n, (u8 *)USART3_RX_BUF);break; //得到有效数据}USART3_RX_STA 0;//strcpy((char *)USART3_RX_BUF, ); // 清空接收缓存区}}if (waittime 0) res 1;}return res; }//ESP8266发送命令后,检测接收到的应答 //str:期待的应答结果 //返回值:0,没有得到期待的应答结果;其他,期待应答结果的位置(str的位置) u8 *esp8266_check_cmd(u8 *str) {char *strx 0;if (USART3_RX_STA 0X8000) //接收到一次数据了{USART3_RX_BUF[USART3_RX_STA 0X7FFF] 0; //添加结束符strx strstr((const char *)USART3_RX_BUF, (const char *)str);}return (u8 *)strx; }//向ESP8266发送数据 //cmd:发送的命令字符串;waittime:等待时间(单位:10ms) //返回值:发送数据后服务器的返回验证码 u8 *esp8266_send_data(u8 *cmd, u16 waittime) {char temp[1024];char *ack temp;USART3_RX_STA 0;u3_printf(%s, cmd); //发送命令delay_ms(1);if (waittime) //需要等待应答{while (--waittime) //等待倒计时{delay_ms(10);if (USART3_RX_STA 0X8000) //接收到期待的应答结果{USART3_RX_BUF[USART3_RX_STA 0X7FFF] 0; //添加结束符ack (char *)USART3_RX_BUF;USART3_RX_STA 0;break; //得到有效数据}}}return (u8 *)ack; }// 将数字转为字符串 void numToString(u16 value) {int k 0, j 0;int num (int)value;char tem[10];if (value 0){strValue[0] 0;strValue[1] \0;return;}while (num){tem[k] num % 10 0; //将数字加字符0就变成相应字符num / 10; //此时的字符串为逆序}tem[k] \0;k k - 1;while (k 0){strValue[j] tem[k--]; //将逆序的字符串转为正序}strValue[j] \0; //字符串结束标志 } 需要注意的是这段代码有两个地方需要修改 分别换成自己云平台的设备ID和master-keyapi。 4、oled液晶屏 这是调试程序的好帮手用的好可以很快找出程序是哪里出问题了。这个驱动代码网上都有很多封装好的这里就不贴出来了。本项目用的是四引脚oled使用IIC通信协议IIC协议的原理可以看此视频https://www.bilibili.com/video/BV1th411z7sn/?p31spm_id_frompageDrivervd_source2a10d30b8351190ea06d85c5d0bfcb2a 想连接oled的详细代码可以看此视频 https://www.bilibili.com/video/BV1EN41177Pc/?spm_id_from333.337.search-card.all.clickvd_source2a10d30b8351190ea06d85c5d0bfcb2a 二、微信小程序 微信小程序最关键的地方就是与云平台的数据交互其他比如界面、功能都是在这个的基础上才有用。对微信小程序开发感兴趣的可以学一下javascript比较简单。 下载文章末尾的开源项目压缩包解压之后可以看到里面有一个文件夹叫基于STM32的环境信息采集_微信小程序打开微信开发者工具选择导入选择此小程序文件夹打开即可。 进入工程之后修改设备ID和master-keyapi index.js代码 Page({data: {temp:0},// 事件处理函数getinfo(){var that thiswx.request({url: https://api.heclouds.com/devices/1038269453/datapoints, //将请求行中的数字换成自己的设备IDheader: {api-key: wfsF4bCGtQIQmW3wTsPnrdjuFA //自己的api-key},method: GET,success: function (e) {console.log(获取成功,e)that.setData({temp:e.data.data.datastreams[2].datapoints[0].value,humi:e.data.data.datastreams[7].datapoints[0].value,gas_ch4:e.data.data.datastreams[0].datapoints[0].value,ranqi:e.data.data.datastreams[4].datapoints[0].value})console.log(temp,that.data.temp),console.log(humi,that.data.humi),console.log(gas,that.data.gas_ch4),console.log(ranqi,that.data.ranqi)}});},onLoad() {var that thissetInterval(function(){that.getinfo()},5000)}})三、项目获取 我用夸克网盘分享了「基于STM32的环境信息采集ONENETHTTP.rar」点击链接即可保存。打开「夸克APP」无需下载在线播放视频畅享原画5倍速支持电视投屏。 链接https://pan.quark.cn/s/23b7bdc7b54b 提取码pR55
http://www.hkea.cn/news/14302218/

相关文章:

  • 手机网站打开自动wap软件培训内容怎么写
  • 2021年建站赚钱外贸soho做网站
  • 谷歌seo 外贸建站网站策划是干嘛的
  • 流量联盟网站源码互联网广告平台有哪些
  • 网站建设好了怎么进行推广深圳网站建设 推荐xtdseo
  • 学校网站管理与建设办法seo优化网站查询
  • 算命网站该怎样做设计说明怎么写模板
  • 官网建设企业关键词排名优化公司外包
  • 招生网站建设策划方案南阳高端网站建设
  • 甘肃省工程建设信息官方网站wordpress框架视频
  • 专门做奢侈品的网站有哪些北京公司网站建设推荐
  • 网站设置多少个关键词wordpress添加购买按钮
  • 亚马逊官方网站怎么做昆明网站建设方案托管
  • 宁波如何建网站建个商城网站需要多少钱
  • 加强网站 网站建设网站开发商问花店老板
  • 人工智能网站开发做响应式网站所用的代码
  • 重庆市门户网站制作做网站推广需要具备哪些条件
  • 网站开发如何使用微信登录自己的做网站
  • 长春市网站建设wordpress演示数据下载
  • studio网站开发小程序搭建是什么意思
  • 网站设计远程培训宁德seo优化
  • 宁波网站建设开发服务东莞网页制作公司
  • 网站权重泉州网站建设
  • 长沙网站建设 个人广州网站制作费用
  • 忻州网站seo搜索引擎营销的实现方法有
  • 郑州网站推广效果阜阳城乡建设档案馆网站
  • 那个企业网站是用vue做的美容加盟网站建设
  • 肃宁县网站建设微商手机网站设计公司
  • 苏中建设集团官方网站怎么建设网站数据库
  • 手机网站经典案例港海建设网站