Контроль DHT и mosture [HELP]

Тема в разделе "Arduino & Shields", создана пользователем Xandr, 27 фев 2017.

  1. Xandr

    Xandr Нуб

    С ардуино имею дело вторую неделю.. есть задача сделать авто теплицу с полной автоматизацией полива, освещения и поддержанием микроклимата. Были приобретены (жалею что не оригинал): Мега 2560 с СН340, TFT 2.4 9328, датчики DHT11, модуль на 8 реле, ESP8266-07 и модуль влажности почвы.
    С горем пополам и танцами с бубном получилось подключить и запустить дисплей. Собрал по кускам код из примеров и форумов... но мозгов хватило только на вывод данных на экран и управления релюшками... а надо еще чтоб параметры с сенсора регулировались(время включения света, время полива, режим полива и т.д.) и вывести все это на сервер(ну или хз как еще получать данные через вайфай модуль).
     
  2. Xandr

    Xandr Нуб

    Код (C++):
    #include <Adafruit_Sensor.h>
    #include <DHT.h>
    #include <DHT_U.h>
    #include <stdio.h>
    #include <SPFD5408_Adafruit_GFX.h>
    #include <SPFD5408_Adafruit_TFTLCD.h>
    #define LCD_CS A3
    #define LCD_CD A2
    #define LCD_WR A1
    #define LCD_RD A0
    #define LCD_RESET A4
    #define BLACK           0x0000
    #define BLUE            0x001F
    #define RED             0xF800
    #define GREEN           0x07E0
    #define CYAN            0x07FF      //Бирюзовый
    #define MAGENTA         0xF81F      //Сиреневый
    #define YELLOW          0xFFE0
    #define WHITE           0xFFFF
    #define DHTPIN 53 // DHT11 data pin
    #define DHTTYPE DHT11
    Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
    DHT_Unified dht(DHTPIN, DHTTYPE);
    uint32_t delayMS;

    // инициализация реле и выводов
    int Relay_1 = 28;
    int Relay_2 = 29;
    int Relay_3 = 26;
    int Relay_4 = 27;
    int Relay_5 = 24;
    int Relay_6 = 25;
    int Relay_7 = 22;
    int Relay_8 = 23;

    void setup()
    {
      dht.begin();
      sensor_t sensor;
      dht.temperature().getSensor(&sensor);
      dht.humidity().getSensor(&sensor);
      delayMS = sensor.min_delay / 1000;

      {
        tft.reset();
        pinMode(13, OUTPUT);
        tft.begin(0x9328);
        tft.fillScreen(BLACK);
        tft.setRotation(1);
        {
          pinMode(Relay_1, OUTPUT);
          pinMode(Relay_2, OUTPUT);
          pinMode(Relay_3, OUTPUT);
          pinMode(Relay_4, OUTPUT);
          pinMode(Relay_5, OUTPUT);
          pinMode(Relay_6, OUTPUT);
          pinMode(Relay_7, OUTPUT);
          pinMode(Relay_8, OUTPUT);
        }
      }
    }

    void loop()
    {


      sensors_event_t event;
      dht.temperature().getEvent(&event);
      dht.humidity().getEvent(&event);
      {
        int mostureSensor = A15;
        int sensorValue = analogRead(mostureSensor);
        unsigned int value = sensorValue;
        unsigned int invValue = ~value;// инвертировали
        invValue=value ^ 0x3FF ; // инвертнули 10-ть битов. 0x3FF=B1111111111
        unsigned int DISPLEY = invValue / 10; //вывод значения в % на дисплей

        {
          Serial.begin(9600);
        }
        if (DISPLEY >= 50)
        {
          digitalWrite(Relay_1, HIGH);
        }
        else
        {
          digitalWrite(Relay_1, LOW);
        }delay(1000);
        {
          digitalWrite(Relay_2, HIGH);
          digitalWrite(Relay_3, HIGH);
          digitalWrite(Relay_4, HIGH);
          digitalWrite(Relay_5, HIGH);
          digitalWrite(Relay_6, HIGH);
          digitalWrite(Relay_7, HIGH);
          digitalWrite(Relay_8, HIGH);
          //
        }
        {
          tft.drawRect(0, 0, 320, 240, YELLOW); // Прямоугольник
          tft.drawLine(0, 80, 320, 80, YELLOW); // Линии горизонт
          tft.drawLine(0, 160, 320, 160, YELLOW); // Линии горизонт
          // вывод данных
          temperature_to_lcd (event.temperature, 5);
          humidity_to_lcd (event.relative_humidity, 85);
          mosture_to_lcd (DISPLEY, 165);
        }
      }
      delay(2000);
    }
    // вывод данных на экран

    void temperature_to_lcd (float temperature, unsigned char text_position )
    {
      sensors_event_t event;
      dht.temperature().getEvent(&event);

      {
        Serial.print("Temperatura = ");
        Serial.print(event.temperature);
        Serial.println(" *C");

        int text_color;
        tft.setCursor(60, text_position);
        tft.setTextColor(GREEN, BLACK);
        tft.setTextSize(3);
        tft.print(utf8rus("СдлодпЯстпЯ"));
        tft.setTextSize(4);
        if (event.temperature >= 28 && event.temperature <= 30)
        {
          text_color = YELLOW;
        }
        else if (event.temperature >= 31)
        {
          text_color = RED;
        }
        else if (event.temperature < 25 && event.temperature >= 23)
        {
          text_color = MAGENTA;
        }
        else if (event.temperature < 23)
        {
          text_color = BLUE;
        }
        else {
          text_color = GREEN;
        }
        tft.setCursor(70, text_position + 30);
        fix_number_position(temperature);
        tft.setTextColor(text_color, BLACK);
        tft.print(event.temperature, 1);
        tft.setCursor(220, text_position + 30);
        tft.print("C");
        tft.drawChar(205, text_position + 27, 237, text_color, BLACK, 2); //degree symbol

      }

    }


    //outputs humidity to LCD

    void humidity_to_lcd (float humidity, unsigned char text_position )

    {
      sensors_event_t event;
      dht.humidity().getEvent(&event);

      {
        Serial.print("Humidity = ");
        Serial.print(event.relative_humidity);
        Serial.println(" %");

        tft.setTextColor(GREEN, BLACK);
        tft.setCursor(80, text_position);
        tft.setTextSize(3);
        tft.println(utf8rus("БкЯемнрсы"));
        tft.setTextSize(4);
        tft.setCursor(70, text_position + 40);
        fix_number_position(humidity);
        tft.print(event.relative_humidity, 1);
        tft.print(" %");
      }

    }

    void mosture_to_lcd (float mosture, unsigned char text_position)

    {
      Serial.print("Mosture = ");
      Serial.print(mosture);
      Serial.println(" %");
      //float(DISPLEY);
      {
        tft.setTextColor(GREEN, BLACK);
        tft.setCursor(30, text_position);
        tft.setTextSize(3);
        tft.println(utf8rus("БкЯемнрсы онцбъ"));
        tft.setTextSize(4);
        tft.setCursor(80, text_position + 40);
        fix_number_position(mosture);
        tft.print(mosture, 1);
        tft.print(" % ");
      }

    }
    void fix_number_position(float number)

    {
      if ((number >= 0.0 ) && (number < 100))
      {
        tft.print(" ");
      }
    }
    /* Recode russian fonts from UTF-8 to Windows-1251 */

    String utf8rus(String source)
    {
      int i,k;
      String target;
      unsigned char n;
      char m[2] = {
        '0', '\0'                                                                                                         };

      k = source.length();
      i = 0;

      while (i < k) {
        n = source[i];
        i++;

        if (n >= 0xC0) {
          switch (n) {
          case 0xD0:
            {
              n = source[i];
              i++;
              if (n == 0x81) {
                n = 0xA8;
                break;
              }
              if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
              break;
            }
          case 0xD1:
            {
              n = source[i];
              i++;
              if (n == 0x91) {
                n = 0xB8;
                break;
              }
              if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
              break;
            }
          }
        }
        m[0] = n;
        target = target + String(m);
      }
      return target;
    }
     
  3. rkit

    rkit Гуру

    Теплицу вы в этом году сделать уже не успеете. Так что садитесь и спокойно изучайте программирование, делайте простые проекты. А к сентябрю, с новыми знаниями, принимайтесь за разработку теплицы.
    И DHT11 выкиньте в ведро, они паршивые. На форуме полно тем.
     
  4. dmitron1036

    dmitron1036 Гик

    имею готовое решение на мега 2560 + ethernet shield w5100.
    как сервер или как клиент сервера.
     
  5. Tomasina

    Tomasina Сушитель лампочек Модератор

    ну почему не успеет?
    С нуля за 2 месяца вполне реально сделать чтение влажности почвы и датчика DHT22, отображение на дисплее и клацанье реле по расписанию.
    А по осени уже и требования поменяются на основе эксплуатации, тогда и к остальному приступать.
     
  6. rkit

    rkit Гуру

    Остаентся только корпус, монтаж, грабли с дерьмовыми датчиками, грабли с питанием 8 реле, и изучение сложнейшей теории регуляторов, без которой микроклимат не поддержать.
     
  7. Tomasina

    Tomasina Сушитель лампочек Модератор

    все через это проходят. Как раз за лето наберется и теории и практики.
     
  8. rkit

    rkit Гуру

    Ну я и предлагаю набраться, просто не губя времени и нервов, не работая под давлением.
    Не пытаться выдать готовый прибор к высадке, не получится. А спокойно поэкспериментировать в процессе лета и с датчиками, и с реле, и с общим программированием.
     
  9. Xandr

    Xandr Нуб

    Я за сезоном не гонюсь...
    Это все скорее для себя... а теплица просто как мотивация..
    так уже вроде...за неделю.
    мне бы еще понять как тачскрин опрашивается и как меню замутить, пробовал на примерах... но там какая то борода... все чего добился это калибровка корявая (почему-то пэинт рисует точку в сантиметре от пальца)