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

树莓派4B学习笔记——IO通信篇(1-Wire)

文章目录

  • 单总线协议简介
  • 树莓派4B+DHT11(1-Wire协议)
    • DHT11简介
      • 接口定义
      • 数据格式
      • 通信流程
    • 硬件连接
    • 开启树莓派1-Wire接口
    • 编程实现
    • 利用单总线与DS18B20通信获取温度
  • 总结
  • 树莓派4B入门学习笔记汇总

单总线协议简介

1-wire 单总线是Maxim 全资子公司Dallas 的一项专有技术。与目前多数标准串行数据通信方式,如SPI/I2C/MICROWIRE 不同,它采用单根信号线,既传输时钟,又传输数据而且数据传输是双向的。它具有节省I/O 口线资源、结构简单、成本低廉、便于总线扩展和维护等诸多优点。1
单总线的数据传输速率一般为16.3Kbit/s,最大可达142 Kbit/s,通常情况下采用100Kbit/s以下的速率传输数据
1-Wire线端口为漏极开路构或三态门的端口,因此一般需要加上拉电阻Rp,通常选用5K~10KΩ。
有关单总线的详细介绍参考此文。
参加蓝桥杯或者通单片机使用DS18B20的同学肯定是比较熟悉这个协议的,在获取温度的过程中使用的步骤是先初始化,然后写命令;然后再初始化,读命令获取温度。整个单总线的通信步骤:初始化1-wire器件、识别1-wire器件和交换数据。
由于它们是主从结构,只有主机呼叫从机时,从机才能应答,因此主机访问1-wire器件都必须严格遵循单总线命令序列,即1.初始化2.ROM3.命令功能命令。

今天使用的DHT11他只是采用单总线数据格式,具体的命令序列与DS18B20这些严格遵循初始化、ROM、命令功能命令三部曲的器件有所不同。DHT11只是采用单总线的通信步骤:初始化1-wire器件、识别1-wire器件和交换数据。

树莓派4B+DHT11(1-Wire协议)

DHT11简介

接口定义

数据格式

DATA脚 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明:
8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据
+8bit校验和

数据传送正确时校验和数据等于“ 8bit 湿度整数数据 +8bit 湿度小数数据
+8bi 温度整数数据 +8bit 温度小数数据 ”所得结果的末8位。

通信流程

1.总线初始化;(拉低总线时长不小于18ms,然后释放,总线回到高电平)
2.DHT11应答;(DHT11应答将总线拉低)
3.输出数据帧(一次完整的数据传输为40bit,高位先出。)
数据帧格式:
通讯时序图:

硬件连接

树莓派DHT11
5Vvcc
7号引脚(板载编码)DATA
GNDGND

开启树莓派1-Wire接口

此步骤和之前SPI、I2C操作一样,不再贴图,为了保险起见,建议开启口重启一下树莓派 sudo reboot。

编程实现

由于DHT11的读取相对简单,就是按照时序控制IO口的输入输出即可。
代码来自此文。
笔者只是简单的根据时序图添加了注释
打开Geany,输入以下代码:

// An highlighted block////mydht11.c//#include<wiringPi.h>#include<stdio.h>#include<stdlib.h>typedef unsigned char uint8;typedef unsigned int uint16;typedef unsigned long uint32;#defineHIGH_TIME32int pinNumber=7;//use gpio1 to read data(wPi编码)uint32 databuf;//读取传感器的值uint8readSensorData(void){uint8 crc;uint8 i;pinMode(pinNumber,OUTPUT);// 设置引脚为输出模式(用来控制总线电平)digitalWrite(pinNumber,0);// 拉低总线(开始信号)delay(25);//(起始信号要求为不少于18ms的低电平,这里作者使用了25ms)digitalWrite(pinNumber,1);// 主机释放总线(总线恢复高电平)pinMode(pinNumber,INPUT);// 将引脚设置为输入模式,方便检测从机的应答信号pullUpDnControl(pinNumber,PUD_UP);//设置为上拉输入。delayMicroseconds(27);if(digitalRead(pinNumber)==0)//检测总线有没有被从机拉低,如果拉低就说明从机应答了。{while(!digitalRead(pinNumber));//等待从机数据传输的标志(拉高电平)for(i=0;i<32;i++)//读取32为温湿度数据{while(digitalRead(pinNumber));//data clock startwhile(!digitalRead(pinNumber));//data startdelayMicroseconds(HIGH_TIME);databuf*=2;//进位相当于位运算中的左移一位。if(digitalRead(pinNumber)==1)//1{databuf++;}}for(i=0;i<8;i++)//采集八位校验位数据{while(digitalRead(pinNumber));//data clock startwhile(!digitalRead(pinNumber));//data startdelayMicroseconds(HIGH_TIME);crc*=2;if(digitalRead(pinNumber)==1)//1{crc++;}}return1;}else{return0;}}intmain(void){printf("Use GPIO1 to read data!\n");if(-1==wiringPiSetup()){printf("Setup wiringPi failed!");return1;}pinMode(pinNumber,OUTPUT);// set mode to outputdigitalWrite(pinNumber,1);// output a high levelprintf("Enter OS-------\n");while(1){pinMode(pinNumber,OUTPUT);// set mode to outputdigitalWrite(pinNumber,1);// output a high leveldelay(3000);if(readSensorData()){printf("Congratulations ! Sensor data read ok!\n");printf("RH:%d.%d\n",(databuf>>24)&0xff,(databuf>>16)&0xff);printf("TMP:%d.%d\n",(databuf>>8)&0xff,databuf&0xff);databuf=0;}else{printf("Sorry! Sensor dosent ans!\n");databuf=0;}}return0;}

效果如下:

利用单总线与DS18B20通信获取温度

由于大佬们早已制作了DS18B20的读取文件,因此在利用DS18B20获取温度时,只需调用文件接口即可获得温度信息,也不需要想STM32和其他单片那样去对着时序图一点一点的初始化,写数据/指令,读数据了。c语言实现详细步骤参考此文;Python参考此文。

总结

有关单总线的使用就记录到此,有不妥之处欢迎批评指正。

树莓派4B入门学习笔记汇总

树莓派4B学习笔记——系统烧录及初次开机
树莓派4B学习笔记——点亮你的LED
树莓派4B学习笔记——IO输入检测
树莓派4B学习笔记——IO通信篇(I2C)
树莓派4B学习笔记——IO通信篇(SPI)
树莓派4B学习笔记——IO通信篇(1-Wire)
树莓派4B学习笔记——IO通信篇(UART)


  1. Wire单总线的基本原理↩︎

http://www.jsqmd.com/news/614434/

相关文章:

  • 语义分块提升RAG检索精度
  • gopher-os社区贡献指南:从代码提交到功能开发的完整参与流程
  • Redis持久化:从AOF到RDB,如何实现数据不丢失?澈
  • 在嘉兴有靠谱的工业纸筒加工厂吗? - 品牌企业推荐师(官方)
  • 阿里云盘Refresh Token获取工具使用指南:轻松实现云盘授权与自动化管理
  • 011 Linux环境熟悉——IMX6ULL嵌入式开发环境配置
  • 中设智控亮相第二十四届国际TnPM设备运维大会 | AI赋能设备管理一体化解决方案重磅发布 重构设备资产精益管控新生态
  • Golang bytes.Buffer怎么用_Golang Buffer教程【对比】
  • 实测好用!Qwen3-Embedding-4B一键部署教程,轻松搞定长文档向量化
  • 树莓派4B学习笔记——IO通信篇(UART)
  • FastAPI单元测试实战:别等上线被喷才后悔,TestClient用对了真香!找
  • 终极指南:如何免费解锁Cursor Pro高级功能完整教程
  • TF-IDF BM25 原理及应用
  • PDE (Processing D Editor) 三维场景编辑器 · 软件白皮书 · 基于 v..爸
  • Vue-Multiselect 安全防护终极指南:彻底防范 XSS 攻击与数据注入威胁
  • 断崖式下跌!最强AI也搞不定长期开发:代码堆得越多系统崩得越快
  • React Express JSX语法详解:如何编写高效的React组件
  • 集成AI 的 Redis 客户端 Rudist发布新版了诒
  • SEATA分布式事务——AT模式郝
  • PMSG永磁同步发电机并网仿真模型:包含多部分控制与优化特性的动态仿真研究
  • HTML怎么显示灵感便签关联项目_HTML拖拽绑定项目入口【详解】
  • 3D点云标注的高效工具:labelCloud从入门到精通的实践指南
  • YOLOE官版镜像快速部署指南:5分钟搞定开放词汇目标检测环境
  • PHP代码“带病上线”时代终结:2024最严GDPR/等保合规AI校验清单(仅限首批200名开发者获取)
  • 学术论文助手:LaTeX写作中集成Qwen3-ASR-0.6B进行语音草稿输入
  • 蓝桥杯单片机组——榨干选手资源包(STC)
  • Pixel Dimension Fissioner 高性能计算:C++后端推理服务开发
  • 中望CAD2025
  • 工业五官:08 传感器在工厂到底能干啥?18 个真实案例告诉你
  • Inspektor Gadget开发者指南:从零构建你的第一个eBPF监控工具