Adatum
Дек
9
2015

Определяем уровень комфорта «Humidex» на основе сенсора DHT22

DHT22 Humidex
Что такое humidex?
Humidex является мерой того, насколько хорошо мы себя чувствуем в жаркий день. Humidex используется в качестве меры воспринимаемого тепла от комбинированного воздействия избыточной влажности и высокой температуры. Если условия для человека комфортные, то красный диод не светится, если не комфортные то изредка мигает, если опасные то мигает часто, если очень опасные светит постоянно.

DHT22 Humidex

DHT22 Humidex

DHT22 Humidex

Особенности проекта:

Измерения температуры: -40 — 125 ° C +/- 0,2 ° С
Измерения влажности: 0 — 100% +/- 5%
Скорость обновления 2 с
Humidex («описывает, как погода влияет на самочувствие человека, в сочетании температуры и влажности.»)
Рассчитывается на основе измерения.

humidex < 27 Нет дискомфорта.
humidex между 27 и 35 небольшой дискомфорт.
humidex между 35 и 40 дискомфорт.
humidex между 40 и 46 Опасно для здоровья.
humidex между 46 и 54 Очень опасно.
humidex > 54 возможен тепловой удар.

#include "DHT.h"
#define DHTPIN 2        // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);
float humidex;

float calculate_humidex(float temperature,float humidity) {
  float e;
  e=(6.112*pow(10,(7.5*temperature/(237.7+temperature)))*humidity/100); 
  float humidex = temperature + 0.55555555 * (e - 10.0);   //humidex
  return humidex;
}

// Установка текста сообщение Humidex
String humidex_warning_message(float humidex)
{
  String message;
  if ((humidex < 27))                    {message= "No discomfort.  ";   } 
  if ((humidex >= 27 )&&(humidex < 35))  {message= "Some discomfort.  ";  }
  if ((humidex >= 35 )&&(humidex < 40))  {message= "Great discomfort.  ";  } 
  if ((humidex >= 40 )&&(humidex < 46))  {message= "Health risk.  ";  } 
  if ((humidex >= 46 )&&(humidex < 54))  {message= "Great health risk.  "; }
  if ((humidex >= 54 ))                  {message= "Heat stroke danger.  ";} 
   return message;
}

class Flasher  // Класс мигания светодиодом
{
  int ledPin; // номер пина со светодиодом
  long OnTime; // время включения в миллисекундах
  long OffTime; // время, когда светодиод выключен
  int ledState; // состояние ВКЛ/ВЫКЛ
  unsigned long previousMillis; // последний момент смены состояния

  public:Flasher(int pin, long on, long off)
  {
   ledPin = pin;   pinMode(ledPin, OUTPUT);
   OnTime = on;   OffTime = off;
   ledState = LOW;   previousMillis = 0;
  }
 
  void Update()
  {
   // выясняем не настал ли момент сменить состояние светодиода
   unsigned long currentMillis = millis(); // текущее время в миллисекундах

   if((ledState == HIGH) && (currentMillis - previousMillis >= OnTime))
   {
     ledState = LOW;                 // выключаем
     previousMillis = currentMillis; // запоминаем момент времени
     digitalWrite(ledPin, ledState); // реализуем новое состояние
   }
   else if ((ledState == LOW) && (currentMillis - previousMillis >= OffTime))
   {
     ledState = HIGH;                 // выключаем
     previousMillis = currentMillis ; // запоминаем момент времени
     digitalWrite(ledPin, ledState); // реализуем новое состояние
   }
  }
};

Flasher led0(8, 9000, 0); 
Flasher led1(8, 300, 300);
Flasher led2(8, 1000, 1000);
Flasher led3(8, 0, 9000);
 
void setup()
{
  Serial.begin(9600); 
  dht.begin();
}
 
void loop()
{
   if (humidex<29)                {  led0.Update(); } 
   if (humidex>=29 && humidex<40) {  led2.Update(); } 
   if (humidex>=40 && humidex>46) {  led2.Update(); } 
   if (humidex>46)                {  led1.Update(); } 
  
  
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();

    if (isnan(temperature) || isnan(humidity)) {  
                 Serial.println("Failed to read from DHT"); } 
    else {
    humidex = calculate_humidex (temperature, humidity);
    String humidex_warning = humidex_warning_message(humidex);
    Serial.print(humidex_warning);
    Serial.print("Humidex: ");     
    Serial.print(humidex);
    Serial.print(" *C\t");
    Serial.print("Humidity: ");
    Serial.print(humidity);    
    Serial.print(" %\t");
    Serial.print("Temperature: ");  
    Serial.print(temperature); 
    Serial.println(" *C");
  }
}

Похожие статьи

Оставить комментарий

  • Изменил Ваш скетч. Сделал индикацию на светодиоде Ws2812. Изменённый скетч ниже.

    #include «DHT.h»
    #define DHTPIN 2 // what pin we’re connected to
    #define DHTTYPE DHT22 // DHT 22 (AM2302)
    DHT dht(DHTPIN, DHTTYPE);
    float humidex;
    #include
    #define NUM_LEDS 1
    #define DATA_PIN 10

    CRGB leds[NUM_LEDS];

    float calculate_humidex(float temperature,float humidity) {
    float e;
    e=(6.112*pow(10,(7.5*temperature/(237.7+temperature)))*humidity/100);
    float humidex = temperature + 0.55555555 * (e — 10.0); //humidex
    return humidex;
    }

    // Установка текста сообщение Humidex
    String humidex_warning_message(float humidex)
    {
    String message;
    if ((humidex = 27 )&&(humidex = 35 )&&(humidex = 40 )&&(humidex = 46 )&&(humidex = 54 )) {message= «Heat stroke danger. «;}
    return message;
    }

    void setup()
    {
    Serial.begin(9600);
    dht.begin();
    FastLED.addLeds(leds, NUM_LEDS);
    }

    void loop()
    {
    if ((humidex = 27 )&&(humidex = 35 )&&(humidex = 40 )&&(humidex = 46 )&&(humidex = 54)) {leds[0] = CRGB::Red; } // Возможен тепловой удар
    FastLED.show();

    float humidity = dht.readHumidity();
    float temperature = dht.readTemperature();

    if (isnan(temperature) || isnan(humidity)) {
    Serial.println(«Failed to read from DHT»); }
    else {
    humidex = calculate_humidex (temperature, humidity);
    String humidex_warning = humidex_warning_message(humidex);
    Serial.print(humidex_warning);
    Serial.print(«Humidex: «);
    Serial.print(humidex);
    Serial.print(» *C\t»);
    Serial.print(«Humidity: «);
    Serial.print(humidity);
    Serial.print(» %\t»);
    Serial.print(«Temperature: «);
    Serial.print(temperature);
    Serial.println(» *C»);
    }
    }