Arduino mega 2560 + Troyka Shield + Цифровой датчик t* и влажности проблема данных

Тема в разделе "Arduino & Shields", создана пользователем nkYellOw, 1 дек 2015.

  1. nkYellOw

    nkYellOw Нерд

    Всем привет, закупился девайсами для изучения и сразу появился первый вопрос!
    Цифровой датчик снимает показания температуры и влажности и при выводе на экран первой строкой данные получаю - все ок, но последующие строки всегда выводят ноль! Так же отображается при дефолтном скетче при установке библиотеки цифрового датчика. Подскажите пожалуйста что делать? переделанный скетч скину ниже

    Код (C++):
    // библиотека для работы с датчиком DHT11
    #include <TroykaDHT11.h>

    unsigned int Humidity_min = 200;
    unsigned int Humidity_max = 660;
    unsigned int Percent = Humidity_max - Humidity_min;
    // создаём объект класса DHT11 и пераём номер пина к которому подкючён датчик
    DHT11 dht(13);

    void setup()
    {
      // открываем последовательный порт для мониторинга действий в программе
      Serial.begin(9600);
      dht.begin();
    }

    void loop()
    {
      int Arr[2];
     
      // Получаем значение влажности в земле у растения
      unsigned int currentFlowerHumidity = checkFlowerHumidity();
     
      // Получаем значения температуры и влажности в комнате
      checkTemperatureHumidity(Arr);
     
      // Вывод данных на экран
        Serial.print("Flower Humidity = ");
        Serial.print(currentFlowerHumidity);
        Serial.print("% \t");
     
        Serial.print("Temperature = ");
        Serial.print(Arr[0]);
        Serial.print("C \t");
       
        Serial.print("Humidity = ");
        Serial.print(Arr[1]);
        Serial.println("%");
     
       //Задержка
        delay(1000);
    }

    unsigned int checkFlowerHumidity()
    {
       unsigned int localRead = analogRead(A0);
     
       if (localRead == 0) return 0;
       else return 100*localRead/Percent;
    }

    void checkTemperatureHumidity(int a[2])
    {
      a[0] = 0;
      a[1] = 0;

      // считывание данных с датчика DHT11
      int check = dht.read();
      switch (check) {
        // всё OK
        case DHT_OK:
        a[0] = dht.getTemperatureC();
        a[1] = dht.getHumidity();
          break;
        default:
          break;
      }
    }
    Дефолтный скетч, которые так же первой строкой показывает данные температуры и влажности и нулевые-последующие строки

    Код (C++):
    // библиотека для работы с датчиком DHT11
    #include <TroykaDHT11.h>
    // создаём объект класса DHT11 и пераём номер пина к которому подкючён датчик
    DHT11 dht(13);

    void setup()
    {
      // открываем последовательный порт для мониторинга действий в программе
      Serial.begin(9600);
      dht.begin();
    }

    void loop()
    {
      // переменная состояния датчика
      int check;
      // мониторинг ошибок
      // считывание данных с датчика DHT11
      check = dht.read();
      switch (check) {
        // всё OK
        case DHT_OK:
          // выводим показания влажности и температуры
          Serial.print("Temperature = ");
          Serial.print(dht.getTemperatureC());
          Serial.print("C \t");
          Serial.print("Humidity = ");
          Serial.print(dht.getHumidity());
          Serial.println("%");
          break;
        // ошибка контрольной суммы
        case DHT_ERROR_CHECKSUM:
          Serial.println("Checksum error");
          break;
        // превышение времени ожидания
        case DHT_ERROR_TIMEOUT:
          Serial.println("Time out error");
          break;
        // неизвестная ошибка
        default:
          Serial.println("Unknown error");
          break;
      }
      // ждём 1 секунду
      delay(1000);
    }
     
  2. nkYellOw

    nkYellOw Нерд

    P.S. перебросил с 13 пина на 12 и все заработало
    Видимо 13 пин полудохлый либо я незнаю значение 13 пина если он отличается от других...
    Либо тройка фиговая =(
     
  3. ИгорьК

    ИгорьК Гуру

    13 пин - он особенный. К нему подключен (операционный усилитель?) который завязан на светодиод на плате.
    Таким образом, 13 пин кроме как для вывода (OPUTPUT) с параллельным подключением светодиода использовать не рекомендуется.
     
    nkYellOw нравится это.
  4. nkYellOw

    nkYellOw Нерд

    спасибо! =)
     
  5. ИгорьК

    ИгорьК Гуру

    Перечитал, и понял что написано плохо. Надо уточнить так:
    13 пин, кроме как для вывода (OPUTPUT) использовать не рекомендуется. При этом к нему подключен светодиод на плате - можно смотреть.
    Если 13 ногу задействовать как INPUT, она имеет электрическое соединение и с тем, что к ней уже подключено для управления светодиодом.
    Хотя в документации ничего не говорится на тему, что 13 пин задействовать как INPUT нельзя ("Each of the 14 digital pins on the Uno can be used as an input or output"), случаи нестабильной работы его как входа встречаются часто.