Я использую кремниевый лабораторный датчик температуры и влажности Si7021 и датчик освещенности APD300 вместе на моей печатной плате, я также использую STM32F103 Arduino-совместимый микроконтроллер, который связывает датчики по протоколу I2C, я проверял это раньше, и датчики считывалиправильные данные датчика на мониторе Arduino Serial, но теперь мой датчик влажности и температуры считывает слишком много значений, таких как «219982828282 C», хотя я использую правильные подтягивающие резисторы, мне было интересно, если что-то не так скод, который я использую (нашел его из интернета).Я приложил исходный код, который использовал, и выход последовательного монитора моих датчиков.
#include <Wire.h>
// SI7021 I2C address is 0x40(64)
#define Addr 0x40
void setup()
{
// Initialise I2C communication as MASTER
Wire.begin();
// Initialise serial communication, set baud rate = 9600
Serial.begin(9600);
// Start I2C transmission
Wire.beginTransmission(Addr);
// Stop I2C transmission
Wire.endTransmission();
delay(300);
}
void loop()
{
unsigned int data[2];
// Start I2C transmission
Wire.beginTransmission(Addr);
// Send humidity measurement command, NO HOLD MASTER
Wire.write(0xF5);
// Stop I2C transmission
Wire.endTransmission();
delay(500);
// Request 2 bytes of data
Wire.requestFrom(Addr, 2);
// Read 2 bytes of data
// humidity msb, humidity lsb
if(Wire.available() == 2)
{
data[0] = Wire.read();
data[1] = Wire.read();
}
// Convert the data
float humidity = ((data[0] * 256.0) + data[1]);
humidity = ((125 * humidity) / 65536.0) - 6;
// Start I2C transmission
Wire.beginTransmission(Addr);
// Send temperature measurement command, NO HOLD MASTER
Wire.write(0xF3);
// Stop I2C transmission
Wire.endTransmission();
delay(500);
// Request 2 bytes of data
Wire.requestFrom(Addr, 2);
// Read 2 bytes of data
// temp msb, temp lsb
if(Wire.available() == 2)
{
data[0] = Wire.read();
data[1] = Wire.read();
}
// Convert the data
float temp = ((data[0] * 256.0) + data[1]);
float cTemp = ((175.72 * temp) / 65536.0) - 46.85;
float fTemp = cTemp * 1.8 + 32;
// Output data to serial monitor
Serial.print("Relative humidity : ");
Serial.print(humidity);
Serial.println(" % RH");
Serial.print("Temperature in Celsius : ");
Serial.print(cTemp);
Serial.println(" C");
Serial.print("Temperature in Fahrenheit : ");
Serial.print(fTemp);
Serial.println(" F");
delay(500);
}
Выход последовательного монитора Arduino:
Освещенность: 101 Относительная влажность: 65802760.00% относительной влажностив градусах Цельсия: 92502848.00 C Температура в Фаренгейтах: 166505152.00 F