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

wordpress站外搜索响应式网站设计的要求

wordpress站外搜索,响应式网站设计的要求,上海网站改版哪家好,网站利用微信拉取用户做登录页接着我们温湿传感器上半部分的学习#xff0c;现在我们学习接下来的部分#xff0c;编写GXHTC3驱动程序#xff0c;也就是给gxhtc3.c文件添加代码#xff0c;我们要判断gxhtc3芯片是否存在和正常#xff0c;就要先读取gxhtc3的ID号,根据gxhtc3的数据手册#xff0c;读取命…接着我们温湿传感器上半部分的学习现在我们学习接下来的部分编写GXHTC3驱动程序也就是给gxhtc3.c文件添加代码我们要判断gxhtc3芯片是否存在和正常就要先读取gxhtc3的ID号,根据gxhtc3的数据手册读取命令为0xEFC8发送命令后可以读出16位的ID号和1个CRC字节。CRC字节用来校验判断读取的数据是否正确。 首先我们需要先写一个校验代码如下代码所示 ​ #define POLYNOMIAL 0x31 // P(x) x^8 x^5 x^4 1 00110001POLYNOMIAL是多项式因子//CRC校验 uint8_t gxhtc3_calc_crc(uint8_t *crcdata, uint8_t len) //两个参数分别是需要校验的数据和数据长度 {uint8_t crc 0xFF; for(uint8_t i 0; i len; i){crc ^ (crcdata[i]); //crc初始值是0xFF,crcdata与crc按位与或运算后把计算后的值赋值给crccrcdata中位是0的位置会变成1位是1的位置会变成0,这条语句的作用就是把crcdata的值1变成00变成1然后赋值给crcfor(uint8_t j 8; j 0; --j) //这里的for循环按位计算如果位是0直接左移1位如果位是1左移1位后再与多项式按位与或运算{if(crc 0x80) crc (crc 1) ^ POLYNOMIAL;else crc (crc 1);}}return crc; //返回值是计算好的CRC字节(需要和读出的CRC字节做对比,一致的话正确) }​ 接下来我们需要写一个读取ID的代码 ​ // 读取ID esp_err_t gxhtc3_read_id(void) //该函数返回一个 esp_err_t 类型的错误码表示操作是否成功 {esp_err_t ret; // 用于存储函数执行过程中返回的错误码uint8_t data[3]; //用于存储从传感器读取的3字节数据包括ID和CRC校验值i2c_cmd_handle_t cmd i2c_cmd_link_create(); //创建一个新的I2C命令链i2c_master_start(cmd); //发送I2C起始信号i2c_master_write_byte(cmd, 0x70 1 | I2C_MASTER_WRITE, true); //写入I2C设备的地址0x70并设置为写模式i2c_master_write_byte(cmd, 0xEF, true); //写入命令字节0xEF用于选择传感器的ID读取命令i2c_master_write_byte(cmd, 0xC8, true); //写入命令字节0xC8可能是用于配置或确认读取操作i2c_master_stop(cmd); //发送I2C停止信号ret i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); //执行I2C命令链超时时间为1000毫秒if (ret ! ESP_OK) { //如果执行失败ret ! ESP_OK则跳转到 end 标签释放资源并返回错误码goto end;}cmd i2c_cmd_link_create(); //重新创建一个新的I2C命令链i2c_master_start(cmd); //发送I2C起始信号i2c_master_write_byte(cmd, 0x70 1 | I2C_MASTER_READ, true); //写入I2C设备的地址0x70并设置为读模式i2c_master_read(cmd, data, 3, I2C_MASTER_LAST_NACK); //读取3字节数据到 data 数组中最后一个字节读取后发送NACK信号i2c_master_stop(cmd); //发送I2C停止信号ret i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); //执行I2C命令链超时时间为1000毫秒if(data[2]!gxhtc3_calc_crc(data,2)){ //计算前两个字节的CRC校验值 ret ESP_FAIL; //如果计算的CRC值与读取的CRC值不匹配data[2]则将 ret 设置为 ESP_FAIL表示校验失败} end:i2c_cmd_link_delete(cmd); //释放I2C命令链资源return ret; //表示函数执行的结 }​ 因为函数中用到了i2c的函数所以给这个文件也添加一个i2c.h头文件。上面的函数中用到了I2C_MASTER_NUM这个宏定义这个宏定义是在myi2c.h文件中定义的所以也需要添加myi2c.h头文件 #include myi2c.h #include driver/i2c.h 接下来给gxhtc3.h文件中添加读取ID函数的声明 extern esp_err_t gxhtc3_read_id(void); 这里用到了esp_err_t类型所以也需要调用一下对应的头文件 #include esp_err.h 然后我们在main.c文件中调用这个函看能正确读取ID号 void app_main(void) {ESP_ERROR_CHECK(i2c_master_init()); //调用 i2c_master_init() 函数初始化I2C总线并使用 ESP_ERROR_CHECK 宏检查初始化是否成功。如果初始化失败程序将停止并打印错误信息ESP_LOGI(TAG, I2C initialized successfully); //如果I2C初始化成功使用 ESP_LOGI 宏打印一条信息表示I2C总线已成功初始化esp_err_t ret gxhtc3_read_id(); //调用 gxhtc3_read_id() 函数读取GXHTC3传感器的ID并将返回值存储在 ret 变量中while(ret ! ESP_OK) // 如果读取ID失败ret ! ESP_OK则进入循环{ret gxhtc3_read_id(); //再次尝试读取GXHTC3传感器的IDESP_LOGI(TAG,GXHTC3 READ ID); //打印一条信息表示正在尝试读取GXHTC3传感器的IDvTaskDelay(1000 / portTICK_PERIOD_MS); //延迟1000毫秒1秒然后再次尝试读取ID}ESP_LOGI(TAG,GXHTC3 OK); //如果成功读取GXHTC3传感器的IDret ESP_OK打印一条信息表示读取成功 } 这里使用了vTaskDelay函数需要在main.c文件中添加freeRTOS相关头文件 #include freertos/FreeRTOS.h #include freertos/task.h 以上完成之后我们就可以试着编译一下了。 还没有完接着我们继续学习编写读取温湿度数据程序根据学习我们再给gxhtc3.c文件中添加读取温湿度的相关函数。根据gxhtc3的数据手册上介绍每一次读取数据都需要经过四组命令按照执行顺序分别是唤醒、测量、读出、休眠我们分别写这四个命令的函数首先我们要写一下唤醒的代码以下是我写的 //唤醒 esp_err_t gxhtc3_wake_up(void) //该函数返回一个 esp_err_t 类型的错误码表示操作是否成功 {int ret; //用于存储函数执行过程中返回的错误码i2c_cmd_handle_t cmd i2c_cmd_link_create(); //创建一个新的I2C命令链i2c_master_start(cmd); //发送I2C起始信号i2c_master_write_byte(cmd, 0x70 1 | I2C_MASTER_WRITE, true); //写入I2C设备的地址0x70并设置为写模式 i2c_master_write_byte(cmd, 0x35, true); //写入命令字节0x35用于唤醒传感器i2c_master_write_byte(cmd, 0x17, true); //写入命令字节0x17可能是用于配置或确认唤醒操作i2c_master_stop(cmd); //发送I2C停止信号ret i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); //执行I2C命令链超时时间为1000毫秒,执行结果存储在 ret 变量中i2c_cmd_link_delete(cmd); //释放I2C命令链资源return ret; //表示函数执行的结果 } 接着我们在写一下测量部分的函数 // 测量 esp_err_t gxhtc3_measure(void) //该函数返回一个 esp_err_t 类型的错误码表示操作是否成功 {int ret; //用于存储函数执行过程中返回的错误码i2c_cmd_handle_t cmd i2c_cmd_link_create(); //创建一个新的I2C命令链i2c_master_start(cmd); //发送I2C起始信号i2c_master_write_byte(cmd, 0x70 1 | I2C_MASTER_WRITE, true); //写入I2C设备的地址0x70并设置为写模式i2c_master_write_byte(cmd, 0x7c, true); //写入命令字节0x7c用于触发传感器进行测量i2c_master_write_byte(cmd, 0xa2, true); //写入命令字节0xa2可能是用于配置或确认测量操作i2c_master_stop(cmd); // 发送I2C停止信号ret i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); //执行I2C命令链超时时间为1000毫秒i2c_cmd_link_delete(cmd); // 释放I2C命令链资源return ret; //表示函数执行的结果 } 接着我们写一下读取温湿数据部分的代码 // 读出温湿度数据 esp_err_t gxhtc3_read_tah(void) //该函数返回一个 esp_err_t 类型的错误码表示操作是否成功 {int ret; //用于存储函数执行过程中返回的错误码i2c_cmd_handle_t cmd i2c_cmd_link_create(); //创建一个新的I2C命令链i2c_master_start(cmd); //发送I2C起始信号i2c_master_write_byte(cmd, 0x70 1 | I2C_MASTER_READ, true); //写入I2C设备的地址0x70并设置为读模式i2c_master_read(cmd, tah_data, 6, I2C_MASTER_LAST_NACK); //从传感器读取6字节数据到 tah_data 数组中最后一个字节读取后发送NACK信号i2c_master_stop(cmd); //发送I2C停止信号ret i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); //执行I2C命令链超时时间为1000毫秒i2c_cmd_link_delete(cmd); //释放I2C命令链资源return ret; //表示函数执行的结果 } 以上是读出温湿度数据的函数。读到的数据字节放到tah_data这个数组里面需要在gxhtc3.c文件的include下面定义tah_data数组。读出函数需要跟在测量函数后使用一次读取6个字节分别是2个温度数据1个温度CRC字节2个湿度数据1个湿度CRC字节 接着我们写休眠部分的函数 // 休眠 esp_err_t gxhtc3_sleep(void) //该函数返回一个 esp_err_t 类型的错误码表示操作是否成功 {int ret; //用于存储函数执行过程中返回的错误码i2c_cmd_handle_t cmd i2c_cmd_link_create(); //创建一个新的I2C命令链i2c_master_start(cmd); //发送I2C起始信号i2c_master_write_byte(cmd, 0x70 1 | I2C_MASTER_WRITE, true); //写入I2C设备的地址0x70并设置为写模式i2c_master_write_byte(cmd, 0xB0, true); //写入命令字节0xB0用于使传感器进入休眠模式i2c_master_write_byte(cmd, 0x98, true); //写入命令字节0x98可能是用于配置或确认休眠操作i2c_master_stop(cmd); //发送I2C停止信号ret i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); //执行I2C命令链超时时间为1000毫秒i2c_cmd_link_delete(cmd); //执行结果存储在 ret 变量中return ret; //表示函数执行的结果 } 接下来我们再写一个函数把上面的4个命令函数使用上获取温湿度 uint16_t rawValueTemp, rawValueHumi; //rawValueTemp: 用于存储从传感器读取的原始温度数据。// rawValueHumi: 用于存储从传感器读取的原始湿度数据 float temp0, humi0; uint8_t temp_int, humi_int; // 获取并计算温湿度数据 esp_err_t gxhtc3_get_tah(void) //该函数返回一个 esp_err_t 类型的错误码表示操作是否成功 {int ret; //用于存储函数执行过程中返回的错误码gxhtc3_wake_up(); //调用 gxhtc3_wake_up() 函数唤醒传感器使其进入工作状态gxhtc3_measure(); //调用 gxhtc3_measure() 函数触发传感器进行温湿度测量vTaskDelay(20 / portTICK_PERIOD_MS); //延迟20毫秒等待传感器完成测量gxhtc3_read_tah(); //调用 gxhtc3_read_tah() 函数从传感器读取温湿度数据并存储在 tah_data 数组中gxhtc3_sleep(); //调用 gxhtc3_sleep() 函数使传感器进入休眠模式以节省功耗if((tah_data[2]!gxhtc3_calc_crc(tah_data,2)|| //gxhtc3_calc_crc(tah_data, 2): 计算前两个字节的CRC校验值 (tah_data[5]!gxhtc3_calc_crc(tah_data[3],2)))){ //gxhtc3_calc_crc(tah_data[3], 2): 计算后两个字节的CRC校验值temp 0; //如果CRC校验失败将温度和湿度值设为0并将 ret 设置为 ESP_FAILhumi 0;temp_int 0;humi_int 0;ret ESP_FAIL;}else{rawValueTemp (tah_data[0]8) | tah_data[1]; // 将前两个字节合并为一个16位整数表示原始温度数据rawValueHumi (tah_data[3]8) | tah_data[4]; //将后两个字节合并为一个16位整数表示原始湿度数据temp (175.0 * (float)rawValueTemp) / 65535.0 - 45.0; //将原始温度数据转换为实际温度值单位摄氏度humi (100.0 * (float)rawValueHumi) / 65535.0; //将原始湿度数据转换为实际湿度值单位百分比temp_int round(temp); //将温度值四舍五入为整数humi_int round(humi);ret ESP_OK;}return ret; } 转换整形数据的时候用到了round函数需要添加math.h头文件 #include math.h 然后我们在gxhtc3.h文件中添加gxhtc3_get_tah函数声明因为接下来要在main.c文件中调用 extern esp_err_t gxhtc3_get_tah(void); 因为用到了esp_err_t类型所以还需要添加esp_err.h头文件 #include esp_err.h 现在打开main.c文件在app_main函数中的while循环读取ID的下面创建一个gxhtc3_task任务 xTaskCreate(gxhtc3_task, gxhtc3_task, 4096, NULL, 6, NULL); 然后编写这个任务函数 static void gxhtc3_task(void *args) //该函数接受一个 void * 类型的参数 args通常用于传递任务参数 {esp_err_t ret; //用于存储 gxhtc3_get_tah() 函数返回的错误码while(1){ret gxhtc3_get_tah(); //调用 gxhtc3_get_tah() 函数获取温湿度数据并将返回值存储在 ret 变量中if (ret!ESP_OK) {ESP_LOGE(TAG,GXHTC3 READ TAH ERROR.); //如果 gxhtc3_get_tah() 返回的错误码不是 ESP_OK则使用 ESP_LOGE 宏打印错误信息表示读取温湿度数据失败}else{ESP_LOGI(TAG, TEMP:%.1f HUMI:%.1f, temp, humi); //如果 gxhtc3_get_tah() 返回成功ESP_OK则使用 ESP_LOGI 宏打印温湿度数据ESP_LOGI(TAG, TEMP:%d HUMI:%d, temp_int, humi_int); //打印整数格式的温度和湿度值}vTaskDelay(1000 / portTICK_PERIOD_MS); //调用 vTaskDelay 函数延迟1000毫秒1秒然后再次执行循环} } 这其中用到了temp humi temp_int humi_int这几个变量所以我们需要在函数前面声明一下来自外部文件 extern float temp,humi; extern uint8_t temp_int,humi_int; 接下来我们在主函数中调用这个任务函数 void app_main(void) {ESP_ERROR_CHECK(i2c_master_init()); //调用 i2c_master_init() 函数初始化I2C总线并使用 ESP_ERROR_CHECK 宏检查初始化是否成功。如果初始化失败程序将停止并打印错误信息ESP_LOGI(TAG, I2C initialized successfully); //如果I2C初始化成功使用 ESP_LOGI 宏打印一条信息表示I2C总线已成功初始化esp_err_t ret gxhtc3_read_id(); //调用 gxhtc3_read_id() 函数读取GXHTC3传感器的ID并将返回值存储在 ret 变量中while(ret ! ESP_OK) //如果读取ID失败ret ! ESP_OK则进入循环{ret gxhtc3_read_id(); //再次尝试读取GXHTC3传感器的IDESP_LOGI(TAG,GXHTC3 READ ID); //打印一条信息表示正在尝试读取GXHTC3传感器的IDvTaskDelay(1000 / portTICK_PERIOD_MS); //延迟1000毫秒1秒然后再次尝试读取ID}ESP_LOGI(TAG,GXHTC3 OK); // 如果成功读取GXHTC3传感器的IDret ESP_OK打印一条信息表示读取成功xTaskCreate(gxhtc3_task, gxhtc3_task, 4096, NULL, 6, NULL); // 创建并启动一个任务用于持续读取GXHTC3传感器的温湿度数据 } 最后我们就可以进行编译了。
http://www.dnsts.com.cn/news/123162.html

相关文章:

  • 淄博网站建设电话wordpress付费主题分享
  • 网站短链接生成器即买即送的网站有哪些
  • 临沂网站建设铭镇wordpress 跑马灯
  • 垂直网站建设方案比如做百度知道 .html,这些都是我们不可控制的网站!
  • 网站备案太久了wordpress语言切换 seo
  • 深圳公司建设网站制作网站开发课程报告心得
  • 做网站的域名怎样买镇江交叉口优化
  • 东莞防疫最新公告广州seo培训
  • 淮滨网站建设公司网站建设的实验报告总结
  • 两学一做网站 苏州北京的互联网公司有哪些
  • 单位做网站图片素材没有公网ip做网站
  • 餐饮业网站建设免费的app软件下载安装
  • 温州网站建设服务电子商务网络公司wordpress 推荐位调用
  • 中小企业网站制作报价专业的开发网站建设
  • 网站域名证书查询微信里的小程序在哪
  • 东莞网站设计出名 乐云践新wordpress中修改链接地址
  • 东城企业网站开发昆明出入最新规定
  • 泉州网站建设网站建设个人站长适合做什么网站
  • 东莞免费网站制作wordpress匿名评论插件
  • 网站采集信息怎么做百度公司可以做网站么
  • 国外优秀网站设计网站建设外包公司招聘
  • 正阳县网站建设淘宝网官方网站
  • 中国建设网官方网站地址网站整站
  • 怎么做盗版小说网站软件开发费和网站建设
  • 哪家公司做网站不错广告制作公司网站
  • 东莞网站开发公司头疼是什么原因导致的
  • 湖北营销网站建设联系方式手机网站制作要求标准
  • 深圳网站开发外包计算机网页设计是属于哪一个专业
  • 网站排名优化快速深圳高端网站设计建设
  • 旅游网站模块报价wordpress备案申请