Проблема чтения из массива

Тема в разделе "Arduino & Shields", создана пользователем akefa, 11 фев 2018.

Метки:
  1. akefa

    akefa Нуб

    Здравствуйте, подключил 3 датчика DHT22 и 2 DS18B20 к меге. Все данные считываются верно, потом пишутся в массив, далее когда пытаюсь разобрать массив оказывается что некоторые показания неверно записаны, пример кода:

    Код (C++):
    #include <avr/wdt.h>
    #include <OneWire.h>
    #include <Adafruit_Sensor.h>
    #include <DHT.h>
    #include <DHT_U.h>
    #include <DS18B20.h>

    #define DHT_COUNT 3
    #define dht0 2
    #define dht1 3
    #define dht2 4

    #define ds0 6
    #define ds1 5

    DS18B20 ds(ds0);
    DS18B20 dsk(ds1);

    DHT_Unified dht[DHT_COUNT] = {
      DHT_Unified(dht0, DHT22),
      DHT_Unified(dht1, DHT22),
      DHT_Unified(dht2, DHT22),
    };

    float temperature[4];
    float humidity[2];
    float heatIndex[2];
    float requiredTemp[1];

    unsigned long tempMillis;

    void initSensor() {
      for (byte i = 0; i < DHT_COUNT; i++) {
        dht[i].begin();
      }
    }

    void setup() {
      Serial.begin(115200);

      initSensor();

      wdt_disable();
      wdt_enable (WDTO_4S);

      requiredTemp[0] = 24;
      requiredTemp[1] = 27.5;

      temp();
    }

    void loop() {

      if (millis() - tempMillis >= UPTIME_TEMP) {
        climateControl();
        tempMillis = millis();
      }
      wdt_reset();
    }

    void updateTemp() {
      sensors_event_t event;

      for (byte i = 0; i < DHT_COUNT; i++) { // INIT DHT SENSORS
        delay(10);
        bool t_error = false;
        bool h_error = false;

        dht[i].temperature().getEvent(&event);

        if (isnan(event.temperature)) {
          Serial.print("Error reading temperature, id:");
          Serial.println(i);
          t_error = !t_error;
        } else {
          temperature[i] = event.temperature;
          Serial.print("id: ");
          Serial.print(i);
          Serial.print(" - Temperature: ");
          Serial.print(temperature[i]);
          Serial.print(" *C, ");
        }

        dht[i].humidity().getEvent(&event);

        if (isnan(event.relative_humidity)) {
          Serial.print("Error reading humidity!, id:");
          Serial.println(i);
          h_error = !h_error;
        } else {
          humidity[i] = event.relative_humidity;
          Serial.print(" Humidity: ");
          Serial.print(humidity[i]);
          Serial.print("%, ");
        }

        if (t_error || h_error) {
          //Serial.println("Error");
        } else {
          heatIndex[i] = computeHeatIndex(temperature[i], humidity[i], false);
          Serial.print(" HeatIndex: ");
          Serial.print(heatIndex[i]);
          Serial.println(" *C");
        }
      }

      temperature[3] = ds0.getTempC();
      temperature[4] = ds1.getTempC();
    }

    void temp() {

      updateTemp();

      for (int i = 0; i < 3; i++) {
        Serial.println("id: " + String(i) + " - temp: " + String(temperature[i]) + ", humidity: " + String(humidity[i]) + ", heatIndex: " + String(heatIndex[i]));
      }

     
    В итоге в мониторе из первой ф-и updateTemp получаю:
    id: 0 - Temperature: 25.00 *C, Humidity: 37.80%, HeatIndex: 24.54 *C
    id: 1 - Temperature: 24.10 *C, Humidity: 16.60%, HeatIndex: 23.00 *C
    id: 2 - Temperature: 25.40 *C, Humidity: 48.00%, HeatIndex: 25.25 *C
    а потом в другой когда печатаю содержимое массива:
    id: 0 - temp: 12.14, humidity: 37.80, heatIndex: 10.88
    id: 1 - temp: 24.10, humidity: 16.60, heatIndex: 23.00
    id: 2 - temp: 25.40, humidity: 48.00, heatIndex: 25.25

    В чем может быть проблема?
     
  2. DIYMan

    DIYMan Guest

    Размеры массивов приведите в соответствие: вы пишете и читаете, выходя за границы массивов.
     
  3. akefa

    akefa Нуб

    float temperature[4];
    в него и пишу с 5 датчиков, верный же размер, или что то не так?
    читаю:
    Код (C++):
      for (int i = 0; i < 3; i++) { // get temp
        Serial.println("id: " + String(i) + " - temp: " + String(temperature[i]) + ", humidity: " + String(humidity[i]) + ", heatIndex: " + String(heatIndex[i]));
      }

      for (int i = 3; i < 5; i++) { // get temp
        Serial.println("id: " + String(i) + " - temp: " + String(temperature[i]));
      }
    и не сходиться только первое значение в массиве.
     
  4. akefa

    akefa Нуб

    Все, дошло, спасибо)