为什么我使用温湿度传感器时传感器使用外置的电源就读取不出数据,而用树莓派的5v电源就可以读取。

为什么我STM32使用外接电源模块给传感器供电,传感器检测不到任何数据了?

你外置的电源是多少V的,这个东西功跟供电大小也有关的,可能正好5v,你是要高了可能还会烧掉设备

你先确定到底是传感器没数据了还是你STM32有bug
用万用表量,不要只看程序有没有输出

传感器外置电源与STM32是否共地?传感器外置电源电压多少?

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7670175
  • 除此之外, 这篇博客: 【毕业设计】 基于单片机的放松按摩仪设计与实现 - 物联网 嵌入式 stm32中的 5 软件说明 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • main线程负责初始化

    int main(void)
    {
    //    led_init();
        button_init();
        Pwm_Init();
        temp_get_adc_init();
        display_init();
    
        rt_kprintf("Hello world!\n");
        while (1)
        {
            rt_thread_delay(500);
        }
    }
    
    

    display线程负责oled屏幕的显示

    #include "display.h"
    #include <oled.h>
    
    static void display_entry(void *parameter)
    {
        OLED_Clear();
        while(1)
        {
            OLED_ShowString(20,20, "start-up",16,1);
            OLED_ShowNum(0,0,(int)((temp*100)/100),2,12,1);
            OLED_ShowString(25,0, ".",16,1);
            OLED_ShowNum(30,0,(int)(temp*100)%100,2,12,1);
            OLED_Refresh();
            rt_thread_delay(100);
        }
    }
    
    rt_thread_t display=RT_NULL;
    int display_init(void)
    {
        OLED_Init();
        //创建显示线程 优先级设置为31
        display = rt_thread_create("display", display_entry, RT_NULL, 1024, 28, 5);
        //启动显示线程
        if(RT_NULL != display)
        {
            rt_thread_startup(display);
    //        rt_kprintf("display_ok\n");
        }
        return 0;
    }
    
    
    

    temp_get_adc线程采集ntc的温度值并换算成摄氏度

    rt_thread_t temp_get_adc=RT_NULL;
    int temp_get_adc_init(void)
    {
        rt_err_t ret = RT_EOK;
    
        /* 查找设备 */
        adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
        if (adc_dev == RT_NULL)
        {
            rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME);
            return RT_ERROR;
        }
    
        /* 使能设备 */
        ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
        /* 关闭通道 */
    //    ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
        //创建温度采集线程
        temp_get_adc = rt_thread_create("temp_get_adc", temp_get_entry, RT_NULL, 1024, 11, 20);
        //启动线程
        if(RT_NULL != temp_get_adc)
        {
            rt_thread_startup(temp_get_adc);
        }
        return ret;
    }
    

    pwm_thread线程负责气泵磁阀的控制,temp_control线程负责温度的控制

    rt_thread_t pwm_thread=RT_NULL,temp_control=RT_NULL;
    int Pwm_Init(void)
    {
        pwm_dev_t5 = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME5);
        RT_ASSERT(pwm_dev_t5 != RT_NULL);
        /* 设置PWM周期和脉冲宽度 */
        rt_pwm_set(pwm_dev_t5, PWM_DEV_CHANNEL0, period, pulse);
        /* 使能设备 */
        rt_pwm_enable(pwm_dev_t5, PWM_DEV_CHANNEL0);
    
        pwm_dev_t3 = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME3);
        RT_ASSERT(pwm_dev_t3 != RT_NULL);
        rt_pwm_set(pwm_dev_t3, PWM_DEV_CHANNEL1, period, pulse);
        rt_pwm_enable(pwm_dev_t3, PWM_DEV_CHANNEL1);
        rt_pin_mode(DIR1, PIN_MODE_OUTPUT);
        rt_pin_mode(DIR2, PIN_MODE_OUTPUT);
        //创建led线程
        pwm_thread = rt_thread_create("pwm_thread", pwm_entry, RT_NULL, 1024, 12, 10);
        temp_control = rt_thread_create("temp_control", temp_control_entry, RT_NULL, 1024, 9, 10);
        //启动led线程
        if(RT_NULL != pwm_thread)
            rt_thread_startup(pwm_thread);
        if(RT_NULL != temp_control)
            rt_thread_startup(temp_control);
        return 0;
    }
    

    button_thread定时器控制按键

    rt_timer_t button_thread=RT_NULL;
    
    int button_init(void)//按键初始化
    {
        rt_pin_mode(S2, PIN_MODE_INPUT_PULLUP );//上拉输入
        rt_pin_mode(S3, PIN_MODE_INPUT_PULLUP );//上拉输入
        rt_pin_mode(S4, PIN_MODE_INPUT_PULLUP );//上拉输入
    
        S2_sem = rt_sem_create("S2", 0, RT_IPC_FLAG_FIFO);  //创建按键的信号量,当按键按下就释放信号量,在需要使用按键的地方获取信号量即可
        S3_sem = rt_sem_create("S3", 0, RT_IPC_FLAG_FIFO);
        S4_sem = rt_sem_create("S4", 0, RT_IPC_FLAG_FIFO);
        //创建邮箱
        key_mailbox = rt_mb_create("key_mailbox",5, RT_IPC_FLAG_FIFO);
        key2_mailbox = rt_mb_create("key_mailbox",5, RT_IPC_FLAG_FIFO);
        //创建定时器
        button_thread = rt_timer_create("button", button_entry, RT_NULL, 20, RT_TIMER_FLAG_PERIODIC);
    
        if(RT_NULL != button_thread)
        {
            rt_timer_start(button_thread);
    //        rt_kprintf("timer_button\n");
        }
        return 0;
    }
    

    key_mailbox,key2_mailbox邮箱负责线程间的通信 按键和temp_control、pwm_thread的通信

    int button_init(void)//按键初始化
    {
        rt_pin_mode(S2, PIN_MODE_INPUT_PULLUP );//上拉输入
        rt_pin_mode(S3, PIN_MODE_INPUT_PULLUP );//上拉输入
        rt_pin_mode(S4, PIN_MODE_INPUT_PULLUP );//上拉输入
    
        S2_sem = rt_sem_create("S2", 0, RT_IPC_FLAG_FIFO);  //创建按键的信号量,当按键按下就释放信号量,在需要使用按键的地方获取信号量即可
        S3_sem = rt_sem_create("S3", 0, RT_IPC_FLAG_FIFO);
        S4_sem = rt_sem_create("S4", 0, RT_IPC_FLAG_FIFO);
        //创建邮箱
        key_mailbox = rt_mb_create("key_mailbox",5, RT_IPC_FLAG_FIFO);
        key2_mailbox = rt_mb_create("key_mailbox",5, RT_IPC_FLAG_FIFO);
        //创建定时器
        button_thread = rt_timer_create("button", button_entry, RT_NULL, 20, RT_TIMER_FLAG_PERIODIC);
    
        if(RT_NULL != button_thread)
        {
            rt_timer_start(button_thread);
    //        rt_kprintf("timer_button\n");
        }
        return 0;
    }
    

  • 以下回答由chatgpt基于相关博客总结生成:

    无法确定具体原因,可能存在多种可能性,需要进行一定的排查。以下是可能的原因和解决方案:

    1. 外置电源电压不稳定或者电流不足导致传感器无法正常工作。建议检测外置电源,可以使用示波器或者万用表进行测试,测量电压和电流是否符合传感器工作的要求。如果电源电压和电流不稳定或者不足,建议更换合适的电源。

    2. 使用外置电源时,传感器和STM32的接线不正确。建议检查传感器接线是否正确,包括电源正负极是否接反等问题。如果接线有误,需要重新接线。

    3. 使用外置电源时,STM32的电源稳压电路不足以保持恒定的电压。建议检查STM32的电源稳压电路是否正常工作,可以使用示波器进行测试,检查输出的电压是否稳定。如果电压不稳定,需要修复或者更换电源稳压电路。

    4. 代码逻辑存在问题,导致使用外置电源时无法读取数据。建议检查代码逻辑是否正确,是否存在和外置电源有关的部分。可以尝试对代码进行修改,解决问题。

    5. 传感器存在损坏或者故障。建议更换新的传感器进行测试,以确定传感器本身是否存在问题。

    需要根据实际情况进行排查,找到具体的原因后再进行解决。