Поврежденное значение в массиве Arduino - PullRequest
0 голосов
/ 26 апреля 2018

Программа должна постоянно прислушиваться к сообщениям на частоте 433 МГц, поступающим от датчиков влажности почвы в горшках с растениями, и решать, активировать или нет насос на основе этих показаний.
Кроме того, он должен проверять проводные датчики воды во время прослушивания.

Все полученные сообщения 433 МГц должны храниться в массиве sensor_data[i].
При запуске позиции от 1 до NUM_Sensors (в данном случае 3) заполняются константой int NO_DATA (500).
Проблема в том, что по какой-то причине я получаю поврежденный номер в массиве № 3:

Серийная печать:

Wired Flower Pots Checked
All Sensors or Timeout reached
Array_Print: 500
Array_Print: 500
Array_Print: 30001

В этом случае 30001 появляется в массиве без какой-либо конкретной причины (я думаю) .. нет полученного сообщения.
Вот код, измененный до минимума, чтобы произошла ошибка:

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
//Receiver Setup for wireless soil moisture readings
unsigned long last_ground_check = 0;
const int NUM_SENSORS = 3;
const uint32_t SENSOR_TIMEOUT = 30000;
int sensor_data[NUM_SENSORS];
uint32_t last_message_time = 0;
uint32_t elapsed = 0;
float total_value = 0;
float real_value = 0;
int count = 0;
const int NO_DATA = 500;
boolean received = false;
//###################//
void setup()
{
    Serial.begin(9600);
    mySwitch.enableReceive(INT1); // Interrupt 2 = Pin 2
    delay(1500);
    Serial.println("<><><><><><><><><><><><>");
    Serial.println("          Start         ");
    Serial.println("<><><><><><><><><><><><>");
    for (int i = 0; i <= NUM_SENSORS; i++) {
        sensor_data[i] = NO_DATA;
    }
} // Setup END
void loop()
{
    if (received == false) {
        if (millis() - last_ground_check > 10000) {
            Serial.println("Checking Wired Flower Pot");
        }
        Serial.println("Wired Flower Pots Checked");
        last_ground_check = millis();
    }
    if (mySwitch.available()) { // Start whenever a 433 MHz Message is received
        received = true;
        double value = mySwitch.getReceivedValue();
        delay(1000);
        int sensor_id = 1;
        int sensor_value = 2;
        if (sensor_value >= 0 && sensor_value <= 100) {
            sensor_data[sensor_id] = sensor_value;
            last_message_time = millis();
            mySwitch.resetAvailable();
        }
    }
    byte sensors_reported = 0;
    for (int i = 0; i <= NUM_SENSORS; i++) {
        if (NO_DATA != sensor_data[i]) {
            sensors_reported += 1; // CODE Gets here because of corrupted Array Value although no message was received
        }
    }
    if (sensors_reported != 0) {
        uint32_t elapsed = millis() - last_message_time;
        if (NUM_SENSORS == sensors_reported || elapsed > SENSOR_TIMEOUT) {
            Serial.println("All Sensors or Timeout reached");

            for (int i = 1; i <= NUM_SENSORS; i++) {
                Serial.print("Array_Print: ");
                Serial.println(sensor_data[i]);
            }
            for (int i = 1; i <= NUM_SENSORS; i++) {
                if (sensor_data[i] < NO_DATA) {
                    count++;
                    total_value += sensor_data[i];
                }
            }

            real_value = total_value / count;
            Serial.print("Soil Moisture: ");
            Serial.println(real_value);
            if (real_value <= 20) {
                //Set Pump ON
            }
            for (int i = 1; i <= NUM_SENSORS; i++) {
                sensor_data[i] = NO_DATA;
            }
            total_value = 0;
            real_value = 0;
            sensors_reported = 0;
            count = 0;
            received = false;
            Serial.println("RESET #### RESET ####");
            delay(5000);
        }
    }
} //LOOP

1 Ответ

0 голосов
/ 26 апреля 2018

Сначала вы выделяете массив размером NUM_SENSORS=3, а затем продолжаете использовать его, как если бы он был размером 4.

Ваш массив состоит из 3 элементов sensor_data[0], [1] и [2]. Ваше условие цикла i <= NUM_SENSORS приводит к получению доступа к sensor_data[3], который является просто некоторой памятью после вашего последнего элемента массива. Даже если вы установите sensor_data[3] в вашей настройке, если на ту же память ссылается какая-то другая переменная, NO_DATA будет перезаписан.

Индексируйте свои циклы по массиву данных от i = 0 до i < NUM_SENSORS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...