我们目前正在开发一个Arduino Uno项目,并且在将整数数据转换为度数时陷入困境。此代码正在运行,但它将二进制打包数据(\ xd01)等转换为int(0-255)。我们的问题是:如何将整数值转换为读出一定程度的Celcius。例如:int 2 = 2摄氏度,255 = 35摄氏度
这是我们使用Pyserial模块的Python代码
import serial
import struct
ser = serial.Serial('COM3', 19200, timeout=5)
while True:
tempdata = ser.read(2)
x= struct.unpack('!BB', tempdata)
print(x)
这是我们Arduino Uno的温度转换代码,用C语言编写。
#define F_CPU 16E6
// output on USB = PD1 = board pin 1
// datasheet p.190; F_OSC = 16 MHz & baud rate = 19.200
#define UBBRVAL 51
void uart_init()
{
// set the baud rate
UBRR0H = 0;
UBRR0L = UBBRVAL;
// disable U2X mode
UCSR0A = 0;
// enable transmitter
UCSR0B = _BV(TXEN0);
// set frame format : asynchronous, 8 data bits, 1 stop bit, no parity
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);
}
void transmit(uint8_t data)
{
// wait for an empty transmit buffer
// UDRE is set when the transmit buffer is empty
loop_until_bit_is_set(UCSR0A, UDRE0);
// send the data
UDR0 = data;
}
void init_adc()
{
// ref=Vcc, left adjust the result (8 bit resolution),
// select channel 0 (PC0 = input)
ADMUX = (1<<REFS0);
// enable the ADC & prescale = 128
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}
uint8_t get_adc_value()
{
//ADMUX |= 1
ADCSRA |= (1<<ADSC); // start conversion
loop_until_bit_is_clear(ADCSRA, ADSC);
return ADC; // 8-bit resolution, left adjusted
}
/*
((value / 1024 * 5) - 0. 5) * 100
*/
int main(void) {
init_adc();
uart_init();
//int x;
while(1)
{
int x = get_adc_value();
int temp = ((((float) x / 1024) * 5) - 0.5) * 100;
transmit(temp);
_delay_ms(200);
}
}
答案 0 :(得分:0)
从ADC值到temp的转换很可能取决于您使用的温度传感器类型。我建议您查看温度传感器的数据表。 如果您使用的是“TMP36”,则可以使用以下公式进行转换:
摄氏温度= [(模拟电压,mV)-500] / 10
来源:https://learn.adafruit.com/tmp36-temperature-sensor/using-a-temp-sensor
如果使用热电偶,则需要查看所使用类型的对应表(例如,键入K:https://www.omega.fr/temperature/Z/pdf/z204-206.pdf)