这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【e起DIY】低功耗蓝牙温湿度计过程贴-搭建开发环境及简单测试程序

共1条 1/1 1 跳转至

【e起DIY】低功耗蓝牙温湿度计过程贴-搭建开发环境及简单测试程序

专家
2026-05-15 19:27:35     打赏

花了将近两天的时间,终于把Zephyr的开发环境配好了。太麻烦了,虽然有刘工帖子的助力,但配置过程依旧出现很多状况,不得不借助于DeepSeek解决。有时候DeepSeek也解决不了,得自己思考换个思路解决。磕磕绊绊的,总是断解决了。主要就是下载、安装工具链那一块,我最后是自己单独下载后解压过去才解决的。

环境的问题解决了,接下来是开发上问题。这个方面,怎么说呢,又到了我最不喜欢的环节。在进行开发时需要一边做配置、一边写代码。这个配置主要指的是配置设备树那一块。由于没有类似eclipse那样的集成开发环境,我暂时用的是普通文本编辑器来编写代码,非常不方便。后来想到用VSCode来写。虽然VSCode的Zephyr插件的工作环境还没配置好,但能用VSCode编程,比普通文本编辑器还是好多了。至少能有颜色标注关键字等,代码更容易阅读和检查。

测试程序依旧参照了刘工发的帖子,只是里面我想试试gpio toggle,学习在Zephyr下怎么操作GPIO。结果还是不太好,在处理GPIO Toggle上,不像STM32那样,可以快速定位相关的函数。因为是边学习边开发,在Zephyr下如何查找库支持的函数,竟然成为一件比较难的事情了。比如我希望在每次访问DHT11的时候利用板载LED作为指示灯的时候,查找类似Toggle这个样的PIN处理函数,就没成功。最后用的是比较蠢的办法,生命一个变量保存Toggle状态,并利用这个状态,使用gpio_pin_configure函数,在实例化的时候,使用不同的参数来驱动LED亮灭。虽然这个法子比较蠢,但最后还是成功实现了自己的测试意图。唉,查找系统提供的支持函数,有点难。

主程序代码如下:



#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>

#include "dht11.h"

#define DHT11_PIN 16
#define LED_PIN 19

#define LEDG_NODE DT_ALIAS(ledg)  
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET_OR(LEDG_NODE, gpios, {0}); 

static bool led_state = false;
int main(void)
{
	int ret;
	uint8_t humidity, temperature;

	printk("DHT11 Test starting...\n");

     const struct device *gpio_dev = DEVICE_DT_GET(DT_NODELABEL(gpioa));
	ret = dht11_init(gpio_dev, DHT11_PIN);
	if (ret < 0) {
		printk("DHT11 init failed: %d\n", ret);
		return 0;
	}
	printk("DHT11 initialized\n");
	
	ret = gpio_pin_configure(gpio_dev, LED_PIN, GPIO_OUTPUT_INACTIVE );
	if (ret < 0) {
	     printk("LED init failed: %d\n", ret);
		return ret;
	}
    
	while (1) {
	    led_state = !led_state;
	    gpio_pin_configure(gpio_dev, LED_PIN,  led_state ?GPIO_OUTPUT_ACTIVE: GPIO_OUTPUT_INACTIVE );
	     
		ret = dht11_read(gpio_dev, DHT11_PIN, &humidity, &temperature);
		if (ret == 0) {
			printk("H=%d%% T=%d°C OK\n", humidity, temperature);
		} else {
			printk("Read failed: %d\n", ret);
		}
         
		k_sleep(K_SECONDS(3));
	}

	return 0;
}


使用“gpio_pin_configure(gpio_dev, LED_PIN,  led_state ?GPIO_OUTPUT_ACTIVE: GPIO_OUTPUT_INACTIVE );

使用gpio_pin_configure函数完成绿色指示灯Toggle交替亮灭的处理。

DHT11那一块,照着刘工写的就可以正常读出温湿度数据。




共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]