Search code examples
arduino

'sensorvalues' was not declared in this scope


I'm quite new into programming and my first project is a IOT project based on a MKR NB 1500 board and a Seeed Studio AHT20 sensor chip. I have successfully run both the https://projecthub.arduino.cc/Arduino_Genuino/2664c014-570d-4d92-90ca-921368388c36 tutorial and the library example of https://github.com/adafruit/Adafruit_AHTX0. But when trying to merge those two my programming skills falls short.

Complete sketch:

/*
  Azure IoT Hub NB

  This sketch securely connects to an Azure IoT Hub using MQTT over NB IoT/LTE Cat M1.
  It uses a private key stored in the ATECC508A and a self signed public
  certificate for SSL/TLS authetication.

  It publishes a message every N seconds to "devices/{deviceId}/messages/events/" topic
  and subscribes to messages on the "devices/{deviceId}/messages/devicebound/#"
  topic.

  The circuit:
  - MKR NB 1500 board
  - Antenna
  - SIM card with a data plan
  - LiPo battery

  The following tutorial on Arduino Project Hub can be used
  to setup your Azure account and the MKR board:

  https://create.arduino.cc/projecthub/Arduino_Genuino/securely-connecting-an-arduino-nb-1500-to-azure-iot-hub-af6470

  This example code is in the public domain.
*/

#include <ArduinoBearSSL.h>
#include <ArduinoECCX08.h>
#include <utility/ECCX08SelfSignedCert.h>
#include <ArduinoMqttClient.h>
#include <MKRNB.h>
#include <Adafruit_AHTX0.h>

/////// Enter your sensitive data in arduino_secrets.h
const char pinnumber[]   = SECRET_PINNUMBER;
const char broker[]      = SECRET_BROKER;
String     deviceId      = SECRET_DEVICE_ID;

NB nbAccess;
GPRS gprs;
Adafruit_AHTX0 aht;

NBClient      nbClient;            // Used for the TCP socket connection
BearSSLClient sslClient(nbClient); // Used for SSL/TLS connection, integrates with ECC508
MqttClient    mqttClient(sslClient);

unsigned long lastMillis = 0;

void setup() {
  Serial.begin(9600);
  while (!Serial);

  if (!ECCX08.begin()) {
    Serial.println("No ECCX08 present!");
    while (1);
  }
 
  if (! aht.begin()) {
    Serial.println("Could not find Humi_Temp sensor? Check wiring");
    while (1);
  }
  
  // reconstruct the self signed cert
  ECCX08SelfSignedCert.beginReconstruction(0, 8);
  ECCX08SelfSignedCert.setCommonName(ECCX08.serialNumber());
  ECCX08SelfSignedCert.endReconstruction();

  // Set a callback to get the current time
  // used to validate the servers certificate
  ArduinoBearSSL.onGetTime(getTime);

  // Set the ECCX08 slot to use for the private key
  // and the accompanying public certificate for it
  sslClient.setEccSlot(0, ECCX08SelfSignedCert.bytes(), ECCX08SelfSignedCert.length());

  // Set the client id used for MQTT as the device id
  mqttClient.setId(deviceId);

  // Set the username to "<broker>/<device id>/api-version=2018-06-30" and empty password
  String username;

  username += broker;
  username += "/";
  username += deviceId;
  username += "/api-version=2018-06-30";

  mqttClient.setUsernamePassword(username, "");

  // Set the message callback, this function is
  // called when the MQTTClient receives a message
  mqttClient.onMessage(onMessageReceived);
}

void loop() {

sensors_event_t humidity, temp;
aht.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
  
  if (nbAccess.status() != NB_READY || gprs.status() != GPRS_READY) {
    connectNB();
  }

  if (!mqttClient.connected()) {
    // MQTT client is disconnected, connect
    connectMQTT();
  }

  // poll for new MQTT messages and send keep alives
  mqttClient.poll();

  // publish a message roughly every 20 seconds.
  if (millis() - lastMillis > 20000) {
    lastMillis = millis();

    publishMessage();
  }
}

unsigned long getTime() {
  // get the current time from the cellular module
  return nbAccess.getTime();
}

void connectNB() {
  Serial.println("Attempting to connect to the cellular network");

  while ((nbAccess.begin(pinnumber) != NB_READY) ||
         (gprs.attachGPRS() != GPRS_READY)) {
    // failed, retry
    Serial.print(".");
    delay(1000);
  }

  Serial.println("You're connected to the cellular network");
  Serial.println();
}

void connectMQTT() {
  Serial.print("Attempting to MQTT broker: ");
  Serial.print(broker);
  Serial.println(" ");

  while (!mqttClient.connect(broker, 8883)) {
    // failed, retry
    Serial.print(".");
    Serial.println(mqttClient.connectError());
    delay(5000);
  }
  Serial.println();

  Serial.println("You're connected to the MQTT broker");
  Serial.println();

  // subscribe to a topic
  mqttClient.subscribe("devices/" + deviceId + "/messages/devicebound/#");
}

void publishMessage() {
  Serial.println("Publishing message");

  // send message, the Print interface can be used to set the message contents
  mqttClient.beginMessage("devices/" + deviceId + "/messages/events/");
  mqttClient.print("T: "); mqttClient.print(temp.temperature, 1); mqttClient.println(" °C");
  mqttClient.print("H: "); mqttClient.print(humidity.relative_humidity, 1); mqttClient.println(" %");
  mqttClient.endMessage();
}

void onMessageReceived(int messageSize) {
  // we received a message, print out the topic and contents
  Serial.print("Received a message with topic '");
  Serial.print(mqttClient.messageTopic());
  Serial.print("', length ");
  Serial.print(messageSize);
  Serial.println(" bytes:");

  // use the Stream interface to print the contents
  while (mqttClient.available()) {
    Serial.print((char)mqttClient.read());
  }
  Serial.println();

  Serial.println();
}

Complete error message:

/tmp/842917425/Sketch_23Feb23/Sketch_23Feb23.ino: In function 'void publishMessage()':

/tmp/842917425/Sketch_23Feb23/Sketch_23Feb23.ino:162:45: error: 'temp' was not declared in this scope

mqttClient.print("T: "); mqttClient.print(temp.temperature, 1); mqttClient.println(" °C");

^~~~

/tmp/842917425/Sketch_23Feb23/Sketch_23Feb23.ino:163:45: note: suggested alternative: 'mktemp'

mqttClient.print("T: "); mqttClient.print(temp.temperature, 1); mqttClient.println(" °C");

^~~~

mktemp

/tmp/842917425/Sketch_23Feb23/Sketch_23Feb23.ino:164:45: error: 'humidity' was not declared in this scope

mqttClient.print("H: "); mqttClient.print(humidity.relative_humidity, 1); mqttClient.println(" %");

^~~~~~~~

/tmp/842917425/Sketch_23Feb23/Sketch_23Feb23.ino:164:45: note: suggested alternative: 'infinity'

mqttClient.print("H: "); mqttClient.print(humidity.relative_humidity, 1); mqttClient.println(" %");

^~~~~~~~

infinity

Error during build: exit status 1

I suspect the issue is related to non-global availability, but have not succeeded in finding a solution. Have tried to declaring temp and humidity as global variables by adding float temp = 0; float humidity = 0; up on top.


Solution

  • var temp and humidity are of type sensors_event_t and must be declared as global in head of code. try it :

    /*
      Azure IoT Hub NB
    
      This sketch securely connects to an Azure IoT Hub using MQTT over NB IoT/LTE Cat M1.
      It uses a private key stored in the ATECC508A and a self signed public
      certificate for SSL/TLS authetication.
    
      It publishes a message every N seconds to "devices/{deviceId}/messages/events/" topic
      and subscribes to messages on the "devices/{deviceId}/messages/devicebound/#"
      topic.
    
      The circuit:
      - MKR NB 1500 board
      - Antenna
      - SIM card with a data plan
      - LiPo battery
    
      The following tutorial on Arduino Project Hub can be used
      to setup your Azure account and the MKR board:
    
      https://create.arduino.cc/projecthub/Arduino_Genuino/securely-connecting-an-arduino-nb-1500-to-azure-iot-hub-af6470
    
      This example code is in the public domain.
    */
    
    #include <ArduinoBearSSL.h>
    #include <ArduinoECCX08.h>
    #include <utility/ECCX08SelfSignedCert.h>
    #include <ArduinoMqttClient.h>
    #include <MKRNB.h>
    #include <Adafruit_AHTX0.h>
    
    /////// Enter your sensitive data in arduino_secrets.h
    const char pinnumber[]   = SECRET_PINNUMBER;
    const char broker[]      = SECRET_BROKER;
    String     deviceId      = SECRET_DEVICE_ID;
    
    NB nbAccess;
    GPRS gprs;
    Adafruit_AHTX0 aht;
    sensors_event_t humidity, temp;
    
    NBClient      nbClient;            // Used for the TCP socket connection
    BearSSLClient sslClient(nbClient); // Used for SSL/TLS connection, integrates with ECC508
    MqttClient    mqttClient(sslClient);
    
    unsigned long lastMillis = 0;
    
    void setup() {
      Serial.begin(9600);
      while (!Serial);
    
      if (!ECCX08.begin()) {
        Serial.println("No ECCX08 present!");
        while (1);
      }
    
      if (! aht.begin()) {
        Serial.println("Could not find Humi_Temp sensor? Check wiring");
        while (1);
      }
    
      // reconstruct the self signed cert
      ECCX08SelfSignedCert.beginReconstruction(0, 8);
      ECCX08SelfSignedCert.setCommonName(ECCX08.serialNumber());
      ECCX08SelfSignedCert.endReconstruction();
    
      // Set a callback to get the current time
      // used to validate the servers certificate
      ArduinoBearSSL.onGetTime(getTime);
    
      // Set the ECCX08 slot to use for the private key
      // and the accompanying public certificate for it
      sslClient.setEccSlot(0, ECCX08SelfSignedCert.bytes(), ECCX08SelfSignedCert.length());
    
      // Set the client id used for MQTT as the device id
      mqttClient.setId(deviceId);
    
      // Set the username to "<broker>/<device id>/api-version=2018-06-30" and empty password
      String username;
    
      username += broker;
      username += "/";
      username += deviceId;
      username += "/api-version=2018-06-30";
    
      mqttClient.setUsernamePassword(username, "");
    
      // Set the message callback, this function is
      // called when the MQTTClient receives a message
      mqttClient.onMessage(onMessageReceived);
    }
    
    void loop() {
    
    
      aht.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
    
      if (nbAccess.status() != NB_READY || gprs.status() != GPRS_READY) {
        connectNB();
      }
    
      if (!mqttClient.connected()) {
        // MQTT client is disconnected, connect
        connectMQTT();
      }
    
      // poll for new MQTT messages and send keep alives
      mqttClient.poll();
    
      // publish a message roughly every 20 seconds.
      if (millis() - lastMillis > 20000) {
        lastMillis = millis();
    
        publishMessage();
      }
    }
    
    unsigned long getTime() {
      // get the current time from the cellular module
      return nbAccess.getTime();
    }
    
    void connectNB() {
      Serial.println("Attempting to connect to the cellular network");
    
      while ((nbAccess.begin(pinnumber) != NB_READY) ||
             (gprs.attachGPRS() != GPRS_READY)) {
        // failed, retry
        Serial.print(".");
        delay(1000);
      }
    
      Serial.println("You're connected to the cellular network");
      Serial.println();
    }
    
    void connectMQTT() {
      Serial.print("Attempting to MQTT broker: ");
      Serial.print(broker);
      Serial.println(" ");
    
      while (!mqttClient.connect(broker, 8883)) {
        // failed, retry
        Serial.print(".");
        Serial.println(mqttClient.connectError());
        delay(5000);
      }
      Serial.println();
    
      Serial.println("You're connected to the MQTT broker");
      Serial.println();
    
      // subscribe to a topic
      mqttClient.subscribe("devices/" + deviceId + "/messages/devicebound/#");
    }
    
    void publishMessage() {
      Serial.println("Publishing message");
    
      // send message, the Print interface can be used to set the message contents
      mqttClient.beginMessage("devices/" + deviceId + "/messages/events/");
      mqttClient.print("T: "); mqttClient.print(temp.temperature, 1); mqttClient.println(" °C");
      mqttClient.print("H: "); mqttClient.print(humidity.relative_humidity, 1); mqttClient.println(" %");
      mqttClient.endMessage();
    }
    
    void onMessageReceived(int messageSize) {
      // we received a message, print out the topic and contents
      Serial.print("Received a message with topic '");
      Serial.print(mqttClient.messageTopic());
      Serial.print("', length ");
      Serial.print(messageSize);
      Serial.println(" bytes:");
    
      // use the Stream interface to print the contents
      while (mqttClient.available()) {
        Serial.print((char)mqttClient.read());
      }
      Serial.println();
    
      Serial.println();
    }