Deutsch   English   Français   Italiano  
<vs8sts$1f267$1@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: The Natural Philosopher <tnp@invalid.invalid>
Newsgroups: comp.sys.raspberry-pi
Subject: Anyone gotta clue? TMP36 Pi PICO.
Date: Sat, 29 Mar 2025 13:34:51 +0000
Organization: A little, after lunch
Lines: 99
Message-ID: <vs8sts$1f267$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Sat, 29 Mar 2025 14:34:52 +0100 (CET)
Injection-Info: dont-email.me; posting-host="6476e7bc124fad99fadd6db7fba78296";
	logging-data="1542343"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1/rYQ3rD6HUxaM7dNeecusXcSwPF6UOEXU="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:EG+m8fgyhowpK33FAB2Lqj4yFYQ=
Content-Language: en-GB
Bytes: 3253


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.