代码之家  ›  专栏  ›  技术社区  ›  Peter S

Arduino数组中的值已损坏

  •  0
  • Peter S  · 技术社区  · 6 年前

    该程序应该持续监听来自植物花盆中土壤水分传感器的433 MHz信息,并根据这些读数决定是否启动泵。
    此外,它应该在监听时检查有线水传感器。

    所有433 MHz接收到的消息都应存储在阵列中 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 回复  |  直到 6 年前
        1
  •  2
  •   Aleon    6 年前

    首先分配一个大小为 NUM_SENSORS=3 ,然后继续使用它,就像它的大小为4一样。

    您的阵列有3个元素 sensor_data[0] ,则, [1] [2] .您的循环条件 i <= NUM_SENSORS 访问中的结果 sensor_data[3] 这只是最后一个数组元素之后的一些内存。即使您设置 sensor\u数据[3] 在设置中,如果同一内存被其他变量引用,则 NO_DATA 将被覆盖。

    为数据数组上的循环编制索引 i = 0 i < NUM_SENSORS