• Anyone gotta clue? TMP36 Pi PICO.

    From The Natural Philosopher@21:1/5 to All on Sat Mar 29 13:34:51 2025
    I have a PI PICO W which I am developing code for amongst which is a
    TMP36 temperature sensor
    The code I have reused form other thermostat projects but its suddenly
    giving the odd false reading.

    #define CHIP_TEMP_IO 28
    #define CHIP_ADC 2
    #define RELAY_IO 21
    #define IN 0
    #define OUT 1
    #define ON 1
    #define OFF 0

    void initialise_hardware()
    {
    adc_init();
    adc_gpio_init(CHIP_TEMP_IO);
    gpio_init(RELAY_IO);
    gpio_set_dir(RELAY_IO,OUT);
    }
    void set_relay(int flag)
    {
    cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, flag); // set the lamp
    gpio_put(RELAY_IO,flag); //set the relay
    }
    float read_temperature()
    {
    static int index;
    static int flag; //initialised to zero at startup
    static uint32_t rawbuf[32];
    const float conversion_factor = 3.3f / (1<<12);
    float result;
    float last;
    int i;
    uint32_t raw;
    adc_select_input(CHIP_ADC);
    raw = adc_read();
    //wtf?
    printf ("Raw=%0X\n",raw);

    result=((float)raw)*conversion_factor;

    return (100*result-54); // the pcb warms them up by about 4 degrees
    }

    I am reading the temperature every two seconds as in
    while (1)
    {
    sleep_ms(2000);
    flag=(flag? OFF:ON);
    set_relay(flag);
    temperature = read_temperature();
    printf("Temperature is %.1f C\n",temperature);
    }

    about one time in ten the output jumps to about 20°C less than expected e.g.


    Raw=3BE
    Temperature is 23.2 C
    Raw=3BE
    Temperature is 23.2 C
    Raw=3BE
    Temperature is 23.2 C
    Raw=29B
    Temperature is -0.3 C /************************
    Raw=3C0
    Temperature is 23.3 C
    Raw=3C0
    Temperature is 23.3 C
    Raw=3BF
    Temperature is 23.3 C
    Raw=3BF
    Temperature is 23.3 C
    Raw=3BF
    Temperature is 23.3 C
    Raw=3C1


    I have added decoupling to the TMP36 supply which is fed from the ADC
    3.3v supply which seems to be a steady 3.29V according to my DVM.

    Do I have a bad PICO W? TMP 36 or what?

    Other PICOs with the same chip don't do this...
    The only difference is that this PICO is running different and a lot
    more wifi/server code
    Is it possible that some interrupt is - er - interrupting the ADC read
    with dire results?



    I cannot but think this is a hardware issue.
    --
    The lifetime of any political organisation is about three years before
    its been subverted by the people it tried to warn you about.

    Anon.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From The Natural Philosopher@21:1/5 to The Natural Philosopher on Sat Mar 29 14:51:28 2025
    On 29/03/2025 13:34, The Natural Philosopher wrote:

    I have a PI PICO W which I am developing code for amongst which is a
    TMP36 temperature sensor
    The code I have reused form other thermostat projects but its suddenly
    giving the odd false reading.

    #define CHIP_TEMP_IO 28
    #define CHIP_ADC 2
    #define RELAY_IO 21
    #define IN 0
    #define OUT 1
    #define ON 1
    #define OFF 0

    void initialise_hardware()
        {
        adc_init();
        adc_gpio_init(CHIP_TEMP_IO);
        gpio_init(RELAY_IO);
        gpio_set_dir(RELAY_IO,OUT);
        }
    void set_relay(int flag)
        {
        cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, flag); // set the lamp
        gpio_put(RELAY_IO,flag);    //set the relay
        }
    float read_temperature()
        {
        static int index;
        static int flag;  //initialised to zero at startup
        static uint32_t rawbuf[32];
        const float conversion_factor = 3.3f / (1<<12);
        float result;
        float last;
        int i;
        uint32_t raw;
        adc_select_input(CHIP_ADC);
        raw = adc_read();
    //wtf?
        printf ("Raw=%0X\n",raw);

        result=((float)raw)*conversion_factor;

        return (100*result-54);   // the pcb warms them up by about 4 degrees
        }

    I am reading the temperature every two seconds as in
        while (1)
            {
            sleep_ms(2000);
            flag=(flag? OFF:ON);
            set_relay(flag);
            temperature = read_temperature();
            printf("Temperature is %.1f C\n",temperature);
            }

    about one time in ten the output jumps to about 20°C less than expected
    e.g.


    Raw=3BE
    Temperature is 23.2 C
    Raw=3BE
    Temperature is 23.2 C
    Raw=3BE
    Temperature is 23.2 C
    Raw=29B
    Temperature is -0.3 C /************************
    Raw=3C0
    Temperature is 23.3 C
    Raw=3C0
    Temperature is 23.3 C
    Raw=3BF
    Temperature is 23.3 C
    Raw=3BF
    Temperature is 23.3 C
    Raw=3BF
    Temperature is 23.3 C
    Raw=3C1


    I have added decoupling to the TMP36 supply which is fed from the ADC
    3.3v supply which seems to be a steady 3.29V according to my DVM.

    Do I have a bad PICO W? TMP 36 or what?

    Other PICOs with the same chip don't do this...
    The only difference is that this PICO is running different and a lot
    more wifi/server code
    Is it possible that some interrupt is - er - interrupting the ADC read
    with dire results?



    I cannot but think this is a hardware issue.
    I found another TMP36 from an old project and switched it in.
    No joy.
    Looks like its PI related

    “it should be clear by now to everyone that activist environmentalism
    (or environmental activism) is becoming a general ideology about humans,
    about their freedom, about the relationship between the individual and
    the state, and about the manipulation of people under the guise of a
    'noble' idea. It is not an honest pursuit of 'sustainable development,'
    a matter of elementary environmental protection, or a search for
    rational mechanisms designed to achieve a healthy environment. Yet
    things do occur that make you shake your head and remind yourself that
    you live neither in Joseph Stalin’s Communist era, nor in the Orwellian utopia of 1984.”

    Vaclav Klaus

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From The Natural Philosopher@21:1/5 to John R Walliker on Sat Mar 29 19:54:38 2025
    On 29/03/2025 15:40, John R Walliker wrote:
    On 29/03/2025 14:51, The Natural Philosopher wrote:
    On 29/03/2025 13:34, The Natural Philosopher wrote:

    I have a PI PICO W which I am developing code for amongst which is a
    TMP36 temperature sensor
    The code I have reused form other thermostat projects but its
    suddenly giving the odd false reading.

    #define CHIP_TEMP_IO 28
    #define CHIP_ADC 2
    #define RELAY_IO 21
    #define IN 0
    #define OUT 1
    #define ON 1
    #define OFF 0

    void initialise_hardware()
         {
         adc_init();
         adc_gpio_init(CHIP_TEMP_IO);
         gpio_init(RELAY_IO);
         gpio_set_dir(RELAY_IO,OUT);
         }
    void set_relay(int flag)
         {
         cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, flag); // set the lamp >>>      gpio_put(RELAY_IO,flag);    //set the relay
         }
    float read_temperature()
         {
         static int index;
         static int flag;  //initialised to zero at startup
         static uint32_t rawbuf[32];
         const float conversion_factor = 3.3f / (1<<12);
         float result;
         float last;
         int i;
         uint32_t raw;
         adc_select_input(CHIP_ADC);
         raw = adc_read();
    //wtf?
         printf ("Raw=%0X\n",raw);

         result=((float)raw)*conversion_factor;

         return (100*result-54);   // the pcb warms them up by about 4 >>> degrees
         }

    I am reading the temperature every two seconds as in
         while (1)
             {
             sleep_ms(2000);
             flag=(flag? OFF:ON);
             set_relay(flag);
             temperature = read_temperature();
             printf("Temperature is %.1f C\n",temperature);
             }

    about one time in ten the output jumps to about 20°C less than
    expected e.g.


    Raw=3BE
    Temperature is 23.2 C
    Raw=3BE
    Temperature is 23.2 C
    Raw=3BE
    Temperature is 23.2 C
    Raw=29B
    Temperature is -0.3 C /************************
    Raw=3C0
    Temperature is 23.3 C
    Raw=3C0
    Temperature is 23.3 C
    Raw=3BF
    Temperature is 23.3 C
    Raw=3BF
    Temperature is 23.3 C
    Raw=3BF
    Temperature is 23.3 C
    Raw=3C1


    I have added decoupling to the TMP36 supply which is fed from the ADC
    3.3v supply which seems to be a steady 3.29V according to my DVM.

    Do I have a bad PICO W? TMP 36 or what?

    Other PICOs with the same chip don't do this...
    The only difference is that this PICO is running different and a lot
    more wifi/server code
    Is it possible that some interrupt is - er - interrupting the ADC
    read with dire results?



    I cannot but think this is a hardware issue.
    I found another TMP36 from an old project and switched it in.
    No joy.
    Looks like its PI related

    “it should be clear by now to everyone that activist environmentalism
    (or environmental activism) is becoming a general ideology about
    humans, about their freedom, about the relationship between the
    individual and the state, and about the manipulation of people under
    the guise of a 'noble' idea. It is not an honest pursuit of
    'sustainable development,' a matter of elementary environmental
    protection, or a search for rational mechanisms designed to achieve a
    healthy environment. Yet things do occur that make you shake your head
    and remind yourself that you live neither in Joseph Stalin’s Communist
    era, nor in the Orwellian utopia of 1984.”

    Vaclav Klaus


    I'm sure you have good reasons for using that device, but maybe consider
    the TMP1075.  It is cheap and reasonably accurate. I2C should not be a problem on the Pico.

    I looked at that, but really the TMP36 is more than good enough usually
    and takes very little code to get it working.

    If I were using other I2C peripherals I would probably use it

    John


    --
    New Socialism consists essentially in being seen to have your heart in
    the right place whilst your head is in the clouds and your hand is in
    someone else's pocket.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)