我们目前正在进行Arduino Uno项目,并陷入了将整数数据转换为摄氏度的问题。此代码正在工作,但它将二进制打包数据 (\xd01( 等转换为 int (0-255(。我们的问题是:如何转换整数值以读出一定程度的摄氏度。例如: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)
And this is the code of the temperature conversion on our Arduino Uno, it is written in 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);
}
}
从ADC值到温度值的转换很可能取决于您使用的温度传感器类型。我建议您查看温度传感器的数据表。如果您使用的是"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(