五、基于alios things的esp32 devkitC学习笔记——驱动DS18B20(失败案例)

本文详细介绍了使用ESP32驱动DS18B20温度传感器的过程,包括初始化通信、读写操作及数据拼接。作者分享了在建立通信阶段遇到的问题及解决方案,提供了一段参考代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、驱动流程

    买的是模块化的ds18b20不用自己加电阻,在尝试驱动过程中有试过官方IDF的API也试过alios things的API,虽然说失败了,但还是记录一下,整理一下驱动ds18b20的流程

    首先是对ds18b20的初始化操作,或者说是建立连接的过程。在这里首先设置gpio引脚和为输入输出等gpio配置;然后先拉高总线,再拉低总线480us~960us;随后再拉高总线,接着识开始检测总线电平,如果总线被再次拉低了则证明通信建立成功。

    然后是读入与写入,其中写入主要是写入对ds18b20的控制命令,读入就是读入传感器信息了。读入或者写入时都是先拉低总线1us,然后再将信息一位一位地读取或是设置,每位的读入/写入周期为60us~120us

    最后就是对数据的拼接啦

 

整个流程其实看起来很简单,但是我在第一步建立通信就始终通不过了,在我先拉低再拉高总线,等多久都等不到总线被拉低。尝试过反复换gpio口和换gpio输入输出配置,始终无法解决问题,都开始怀疑是不是元件坏掉了。

2、代码

代码以及思路大部分是参考另一篇esp8266的文章:ESP8266--驱动DS18B20

其中自己改的部分主要集中在建立通信:

uint8_t Ds18b20Init() {
    int i;
	gpio_config_t temp_cfg = {
		GPIO_SEL_19,
		GPIO_MODE_INPUT_OUTPUT,
		GPIO_PULLUP_DISABLE,
		GPIO_PULLDOWN_DISABLE,
		GPIO_INTR_DISABLE
	};
	ESP_ERROR_CHECK(gpio_config(&temp_cfg));
	ESP_ERROR_CHECK(gpio_set_level(GPIO_NUM_19, 1));
	ets_delay_us(666);
	ESP_ERROR_CHECK(gpio_set_level(GPIO_NUM_19, 0));
	ets_delay_us(666);
	ESP_ERROR_CHECK(gpio_set_level(GPIO_NUM_19, 1));
	printf("%d\n", gpio_get_level(GPIO_NUM_19));
	while (gpio_get_level(GPIO_NUM_19))
	{
		ets_delay_us(20);
		i++;
		if (i > 15){
			printf("init failed!\n");
			return 0;
		}
	}
    printf("init success!\n");
	return 1;	//初始化成功
}

其中微秒延时用的是ets_sys.h中的ets_delay_us,这个头文件可以在studio关于esp32的API文件夹里找到

### 实现STM32读取DS18B20温度数据并上传至阿里云物联网平台 #### STM32与DS18B20接口设计 为了使STM32能够读取来自DS18B20的温度数据,需先完成硬件连接。根据元器件清单中的描述[^3],确保已准备好必要的组件如单片机、温度传感器及其配套元件。 对于软件部分,在初始化阶段要配置好GPIO端口用于通信总线操作,并加载相应的库文件支持One-Wire协议以访问DS18B20设备。下面给出一段简化版代码片段展示如何获取当前环境下的摄氏度数值: ```c #include "one_wire.h" #include "ds18b20.h" // 定义使用的IO引脚 #define DS18B20_PIN GPIO_Pin_5, GPIOA float getTemperature(void){ float temperature; // 初始化 OneWire 和 DS18B20 one WireInit(DS18B20_PIN); ds18b20_Init(); // 请求温度测量 ds18b20_StartConvert(); while(!ds18b20_IsConversionComplete()); // 获取温度值 temperature = ds18b20_GetTempCelsius(); return temperature; } ``` 此函数`getTemperature()`可以被调用来取得最新的温度读数[^1]。 #### 数据传输至云端 当拥有有效的温度样本之后,则可通过Wi-Fi模块建立网络连接并将这些信息推送到远程服务器上去。这里推荐采用MQTT轻量级消息队列遥测传输协议来实现高效稳定的消息传递服务。具体做法是在程序里集成AliOS Things SDK或者其他兼容APIs,以便轻松对接阿里云IoT套件的功能特性。 以下是利用PubSubClient库向指定主题发布JSON格式负载的一个实例说明: ```cpp #include <WiFiClientSecure.h> #include <PubSubClient.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; // MQTT Broker (阿里云) const char* mqtt_server = "broker.emqx.io"; // 或者使用实际的阿里云域名/IP地址 const int mqtt_port = 1883; WiFiClient espClient; PubSubClient client(espClient); 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("."); } randomSeed(micros()); Serial.println(""); Serial.println("WiFi connected"); } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); if (client.connect("ESP32_Client")) { Serial.println("connected"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } void publishData(float tempValue){ String payload = "{\"temperature\":" + String(tempValue) + "}"; client.publish("sensor/temperature", payload.c_str()); } void loop(){ if (!client.connected()){ reconnect(); } client.loop(); float currentTemp = getTemperature(); // 调用前面定义的方法获得最新温度 publishData(currentTemp); // 将温度信息发布给订阅者们知道 delay(60000); // 每隔一分钟重复一次上述过程 } ``` 这段Arduino风格的伪代码展示了完整的流程:从启动无线网卡直到周期性的把本地收集到的信息广播出去[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值