Подскажите с датчиком влажности и температуры dht11

Тема в разделе "Arduino & Shields", создана пользователем cudla1973, 6 апр 2013.

  1. cudla1973

    cudla1973 Нуб

    Помогите разобраться есть датчик DHT11 плата реле, дисплей и две кнопки, как изменить в скетче чтобы можно было регулировать двумя кнопками ,например при достижении температуры +22 пошел сигнал на включение реле ,а при +21 выключил бы реле или ткните носом где хотябы пример посмотреть .
    Вот скетч
    Код (Text):
    /* YourDuino.com Example Software Sketch
    DHT11 Humidity and Temperature Sensor test
    Displayed on I2C LCD Display
    Credits: Rob Tillaart
    http://arduino-info.wikispaces.com/PROJECT-Temp-Humidity-Display
    terry@yourduino.com */
     
    /*-----( Import needed libraries )-----*/
    #include <dht11.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
     
    /*-----( Declare objects )-----*/
    LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27
    dht11 DHT11;
     
    /*-----( Declare Constants, Pin Numbers )-----*/
    #define DHT11PIN 2
     
    void setup() /*----( SETUP: RUNS ONCE )----*/
    {
    Serial.begin(9600); //(Remove all 'Serial' commands if not needed)
    lcd.init(); // initialize the lcd
    lcd.backlight();
    // Print a message to the LCD.
    //lcd.setCursor(0, 1);
    lcd.print("DHT11 Temp/Humid");
     
    }/*--(end setup )---*/
     
    void loop() /*----( LOOP: RUNS CONSTANTLY )----*/
    {
     
     
    int chk = DHT11.read(DHT11PIN);
     
    Serial.print("Read sensor: ");
    switch (chk)
    {
    case 0: Serial.println("OK"); break;
    case -1: Serial.println("Checksum error"); break;
    case -2: Serial.println("Time out error"); break;
    default: Serial.println("Unknown error"); break;
    }
    lcd.setCursor(0, 1);
     
    lcd.print("C=");
    lcd.print((float)DHT11.temperature, 0);
    Serial.print("Temperature (oC): ");
    Serial.println((float)DHT11.temperature, 2);
     
    lcd.print(" F=");
    lcd.print(Fahrenheit(DHT11.temperature), 0);
    Serial.print("Temperature (oF): ");
    Serial.println(Fahrenheit(DHT11.temperature), 2);
     
    lcd.print(" H=");
    lcd.print((float)DHT11.humidity, 0);
    lcd.print("%");
    Serial.print("Humidity (%): ");
    Serial.println((float)DHT11.humidity, 2);
     
    Serial.print("Temperature (K): ");
    Serial.println(Kelvin(DHT11.temperature), 2);
     
    Serial.print("Dew Point (oC): ");
    Serial.println(dewPoint(DHT11.temperature, DHT11.humidity));
     
    Serial.print("Dew PointFast (oC): ");
    Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity));
     
    delay(2000);
    }/* --(end main loop )-- */
     
    /*-----( Declare User-written Functions )-----*/
    //
    //Celsius to Fahrenheit conversion
    double Fahrenheit(double celsius)
    {
    return 1.8 * celsius + 32;
    }
     
    //Celsius to Kelvin conversion
    double Kelvin(double celsius)
    {
    return celsius + 273.15;
    }
     
    // dewPoint function NOAA
    // reference: http://wahiduddin.net/calc/density_algorithms.htm
    double dewPoint(double celsius, double humidity)
    {
    double A0= 373.15/(273.15 + celsius);
    double SUM = -7.90298 * (A0-1);
    SUM += 5.02808 * log10(A0);
    SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
    SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
    SUM += log10(1013.246);
    double VP = pow(10, SUM-3) * humidity;
    double T = log(VP/0.61078); // temp var
    return (241.88 * T) / (17.558-T);
    }
     
    // delta max = 0.6544 wrt dewPoint()
    // 5x faster than dewPoint()
    // reference: http://en.wikipedia.org/wiki/Dew_point
    double dewPointFast(double celsius, double humidity)
    {
    double a = 17.271;
    double b = 237.7;
    double temp = (a * celsius) / (b + celsius) + log(humidity/100);
    double Td = (b * temp) / (a - temp);
    return Td;
    }
     
    /* ( THE END ) */
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Что именно Вы хотите регулировать двумя кнопками?
    Отформатируйте код, пожалуйста.
     
  3. cudla1973

    cudla1973 Нуб

    Температуру при которой будет срабатывать реле или нужно больше кнопок ?
    А без кнопок можно сделать такое просто прописать температуру срабатывания ?
    Хотелось бы научиться но нигде даже примера не найду может подскажете или что нужно почитать ?
     
  4. HighDigital

    HighDigital Гик

    Я так понял, все упирается в кнопки?

    Ну например можно ещё добавить кнопку "ОК", для красоты.
    и теперь уже начать так:

    Функция по "установки значения":
    Код (Text):
    int val=0; //ваша переменная.
     
    ...
     
    int entval()
    {
      if(digitalRead(up) == HIGH) val=val+1;
      else if(digitalRead(down) == HIGH) val = val-1;
     
      else if(digitalRead(OK) == HIGH) return 0;
    }
    ...
     
    Ну что то типо такой функции надо сделать, я её не проверял :)
    З.Ы //else if(digitalRead(OK) == HIGH) return 0; - означает, что вы выбрали нужную цифру, и собираетесь выйти из цикла while();, иначе будете вечно выбирать min/max значения :)
     
    cudla1973 нравится это.
  5. Sand

    Sand Нерд

    При превышении 25 град. срабатывает светодиод

    Код (Text):
    #include <DHT.h>
    #include <LiquidCrystal.h>
     
    dht DHT;
     
    #define DHT11_PIN A0
    int ledPin = 2;
     
    LiquidCrystal lcd(4,5, 10,11,12,13);
     
    void setup()
    {
      lcd.begin(20,4);
      //pinMode(ledPin, OUTPUT);
      // start serial port at 9600 bps:
      /*Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for Leonardo only
      }
      Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");*/
    }
     
    void loop()
    {
      lcd.setCursor(0, 0);
      // READ DATA
      int chk = DHT.read11(DHT11_PIN);
      switch (chk)
      {
        case DHTLIB_OK:
                    lcd.print("Sensor connected.");
                    break;
        case DHTLIB_ERROR_CHECKSUM:
                    lcd.print("Checksum error");
                    break;
        case DHTLIB_ERROR_TIMEOUT:
                    lcd.print("Sensor connection");
                    lcd.setCursor(0, 1);
                    lcd.print("timed out error");
                    break;
        default:
                    lcd.print("Unknown error");
                    break;
      }
      // DISPLAY DATA
      // данные последнего измерения можно считать соответствующими
      // методами
      if (chk == DHTLIB_OK)
      {
        lcd.setCursor(0, 1);
        lcd.print("Temperature = ");
        lcd.print(DHT.temperature);
        lcd.print("C ");
     
        lcd.setCursor(0, 2);
        // print the number of seconds since reset:
        lcd.print("Humidity = ");
        lcd.print(DHT.humidity);
        lcd.print("%");
        lcd.setCursor(0, 3);
       
        if (DHT.temperature > 25)
        {
          digitalWrite(ledPin,HIGH);
        }
        else
        {
          digitalWrite(ledPin,LOW);
        }
      }
     
      delay(1000);
    }
    //
    // END OF FILE
    //
     
     
    cudla1973 нравится это.
  6. HighDigital

    HighDigital Гик

    Тогда все намного проще, можете через Serial посылать команды, типо "set_max=30", "set_min=21"...
    это если требуется постоянно менять значения...
    а если все "навечно", то тогда программно в скетче это прописываете. это ещё проще среди простых :)
     
    cudla1973 нравится это.
  7. cudla1973

    cudla1973 Нуб

    У меня другой дисплей другая библиотека, сейчас попробую прикрутить к моему скетчу ,вы конечно извините с паяльником с детства, а вот с програмированием в первые но очень интересно раньше надо было платы травить перепаивать ,а тут меняешь код программы и вауля другой принцип работы ,огромная благодарность кто откликнулся на мою просьбу.

    У меня что то ошибка на строке case DHTLIB_OK:
    нет вот работает только где управлять подсветкой дисплея?а то постоянно горит.
    Код (Text):
    #include <dht11.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
     
    /*-----( Declare objects )-----*/
    LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27
    dht11 DHT11;
     
    /*-----( Declare Constants, Pin Numbers )-----*/
    #define DHT11PIN 2
    int ledPin = 13;
     
    void setup() /*----( SETUP: RUNS ONCE )----*/
    {
    Serial.begin(9600); //(Remove all 'Serial' commands if not needed)
    lcd.init(); // initialize the lcd
    lcd.backlight();
    // Print a message to the LCD.
    //lcd.setCursor(0, 1);
    lcd.print("DHT11 Temp/Humid");
     
    }/*--(end setup )---*/
     
    void loop() /*----( LOOP: RUNS CONSTANTLY )----*/
    {
     
     
    int chk = DHT11.read(DHT11PIN);
     
    Serial.print("Read sensor: ");
    switch (chk)
    {
    case 0: Serial.println("OK"); break;
    case -1: Serial.println("Checksum error"); break;
    case -2: Serial.println("Time out error"); break;
    default: Serial.println("Unknown error"); break;
    }
    lcd.setCursor(0, 1);
     
    lcd.print("C=");
    lcd.print((float)DHT11.temperature, 0);
    Serial.print("Temperature (oC): ");
    Serial.println((float)DHT11.temperature, 2);
     
     
     
    lcd.print(" H=");
    lcd.print((float)DHT11.humidity, 0);
    lcd.print("%");
    Serial.print("Humidity (%): ");
    Serial.println((float)DHT11.humidity, 2);
     
     
     
    Serial.print("Dew Point (oC): ");
     
     
    Serial.print("Dew PointFast (oC): ");
     
     
     
    if (DHT11.temperature > 25)
        {
          digitalWrite(ledPin,HIGH);
        }
        else
        {
          digitalWrite(ledPin,LOW);
     
     
     
    delay(1000);
     
     
     
    }
    }
     
    /* ( THE END ) */
    Вопрос ещё такой что можно ещё приделать к ардуино
    Duemilanove 2009 ATmega328
    я имею ввиду датчик движения или это невозможно управлять двумя процессами.
    температурный датчик у меня включает циркуляционный насос при достижении температуры от печки 24 градуса и по мере остывании печи на угле насос отключается.
     
  8. HighDigital

    HighDigital Гик

    Работать с двумя датчиками - возможно, да же с 10-ю можно, но не одновременно (ИМХО), т.к ATMega328P не двухядерный, к сожалению. :)

    Лучше напишите с нуля свой код, где вы будете понимать, что и где и как работает.
    Начните с листа и ручки, опишите алгоритм работы вашего устройства, и все станет понятно, что где должно включиться.
    Лично мне это помогает, голова не может запомнить все сразу, а на листе бумаге все запомниться и поймется :)

    А потом уже спрашивайте на форуме про определенный кусок кода, и что именно вам не понятно.
     
  9. HighDigital

    HighDigital Гик

    На чем вы остановились: кнопками, USB, или встроенным кодом заложите температурный режим?
     
  10. cudla1973

    cudla1973 Нуб

    Встроеным так как регулировать нечего вкл и выкл.
     
  11. cudla1973

    cudla1973 Нуб

    У меня с алгоритмом туго расскажу как сейчас работает у меня ,стоит датчик температуры механический на нем выставлена температура 23 градуса которая включает и отключает насос и есть датчик движения
    который включает лампочку так как там где это все находится темно вот и хочу сделать это на ардуино и убрать все мои датчики.
    [​IMG]

    Можно его прикрутить вместо Displayed on I2C LCD и вообще есть ли библиотека для него
    и как подключать?