#3 Re: Програмування Arduino » dht22 не показує мінусову температуру » 2024-07-27 12:47:04

Ага, точно так я вже і зробив. Просто пам'ятаю, що в Сі треба обгортати в скобки все, що має відноситись до else, хоча можу помилятися.
ааа, все, я зрозумів чому тільки temperature[0] = ' '; має бути в скобках. Дякую!!!

#4 Re: Програмування Arduino » dht22 не показує мінусову температуру » 2024-07-27 12:34:09

Я брав у скобки увесь цей шматок

  {  
    temperature[0] = ' ';
    temperature[1] = (Temp / 100) % 10 + '0';
    temperature[2] = (Temp / 10) % 10 + '0';
    temperature[4] = Temp % 10 + '0';
}

#5 Re: Програмування Arduino » dht22 не показує мінусову температуру » 2024-07-27 12:11:49

Дякую, Ваш код допоміг мені. Але є маленька дивина, якщо я else беру в скобки, то на дисплеї одні нулі, а коли лишаю без них то все чітко показує...

if (Temp < 0) {
    temperature[0] = '-';
    Temp &= 0x7FFF;
    Temp = abs(Temp);
  } else
    temperature[0] = ' ';
    temperature[1] = (Temp / 100) % 10 + '0';
    temperature[2] = (Temp / 10) % 10 + '0';
    temperature[4] = Temp % 10 + '0';

#6 Re: Програмування Arduino » dht22 не показує мінусову температуру » 2024-07-27 08:29:34

Залив стандартний приклад з бібліотеки DHT Adafruit dht test, то в терміналі взагалі почав показувати -3276.5.

#7 Програмування Arduino » dht22 не показує мінусову температуру » 2024-07-26 22:40:12

germansir
відповідей: 14

Доброго здоров'я! По прикладам з інтернету написав скетч типу погодної станції з використанням DHT22, бібліотеку взяв від Adafruit. Все працює добре, але коли температура становиться нижче 0 то показує -76 градусів. Я вже замахався шукати причину.

#include <DHT.h>
#include <DHT_U.h>
#include <stdio.h>
#include <Wire.h>
#include <SPI.h>  // include SPI library
#include <virtuabotixRTC.h>
#include <Adafruit_Sensor.h>
//#include <Adafruit_BME280.h>
//#define SEALEVELPRESSURE_HPA (1013.25)

//Adafruit_BME280 bme;
virtuabotixRTC myRTC(6, 7, 8);
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);  // Устанавливаем дисплей
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#define DHTPIN 3             // DHT22 data pin is connected to Arduino analog pin 0
#define DHTTYPE DHT22        // DHT22 sensor is used
DHT dht22(DHTPIN, DHTTYPE);  // configure DHT library

char temperature[] = "000.0";
char humidity[] = "000.0%";

void setup() {
  //myRTC.setDS1302Time(40, 52, 19, 6, 26, 7, 2024); //сек,хв,год,день,число,місяць,рік
  myRTC.updateTime();
  sensors.begin();
  dht22.begin();
  lcd.init();
  lcd.backlight();  // Включаем подсветку дисплея
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  delay(1000);  // wait 1 second

  byte drop[8] = {
    0b00100,
    0b01010,
    0b11011,
    0b10011,
    0b10001,
    0b11011,
    0b01110,
    0b00000
  };

  byte cel[8] = {
    0b00110,
    0b01001,
    0b01001,
    0b00110,
    0b00000,
    0b00000,
    0b00000,
    0b00000
  };
  lcd.createChar(1, drop);
  lcd.createChar(2, cel);
}

// main loop
void loop() {
  float tempC = sensors.getTempCByIndex(0);
  lcd.setCursor(10, 2);
  lcd.print(tempC, 1);
  lcd.write(2);
  lcd.print("C");

  /*lcd.setCursor(0, 3);
  lcd.print(bme.readPressure() / 133.32F,0);
  lcd.print("mmHg");

  lcd.setCursor(10, 3);
  lcd.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  lcd.print("m");*/
  sensors.requestTemperatures();
  // read humidity
  int RH = dht22.readHumidity() * 10;
  // read temperature in degree Celsius
  int Temp = dht22.readTemperature() * 10;

  // update temperature and humidity arrays
  if (Temp < 0) {
    temperature[0] = '-';
    Temp = abs(Temp);
  } else
    temperature[0] = ' ';
    temperature[1] = (Temp / 100) % 10 + '0';
    temperature[2] = (Temp / 10) % 10 + '0';
    temperature[4] = Temp % 10 + '0';

  if (RH >= 1000)
    humidity[0] = '1';
  else
    humidity[0] = ' ';
  humidity[1] = (RH / 100) % 10 + '0';
  humidity[2] = (RH / 10) % 10 + '0';
  humidity[4] = RH % 10 + '0';
  delay(500);  // wait 1 second
  lcd.setCursor(0, 1);
  lcd.print(temperature);
  lcd.write(2);
  lcd.print('C');
  lcd.setCursor(0, 2);
  lcd.print(humidity);
  lcd.write(1);

  lcd.setCursor(10, 0);
  lcd.print(myRTC.dayofmonth);
  lcd.print(".");
  if (myRTC.month < 10) lcd.print(0);
  lcd.print(myRTC.month);

  lcd.print(".");
  lcd.print(myRTC.year);
  lcd.setCursor(0, 0);
  myRTC.updateTime();
  lcd.print(myRTC.hours, DEC);
  lcd.print(":");
  if (myRTC.minutes < 10) lcd.print(0);
  lcd.print(myRTC.minutes, DEC);
  lcd.print(":");
  if (myRTC.seconds < 10) lcd.print(0);

  lcd.print(myRTC.seconds, DEC);
  lcd.setCursor(10, 1);
  if (myRTC.dayofweek == 1) lcd.print("SUNDAY");
  else if (myRTC.dayofweek == 2) lcd.print("MONDAY");
  else if (myRTC.dayofweek == 3) lcd.print("TUESDAY");
  else if (myRTC.dayofweek == 4) lcd.print("WEDNESDAY");
  else if (myRTC.dayofweek == 5) lcd.print("THURSDAY");
  else if (myRTC.dayofweek == 6) lcd.print("FRIDAY");
  else if (myRTC.dayofweek == 7) lcd.print("SATURDAY");
}
// end of code.

Підвал форуму