Sensore Sonar Arduino UNO wifii rev2 AIUTO

Ciao a tutti sto costruendo un Idrometro con con sonar della Maxbotix e Arduino UNO Wifi rev.2 che invia dati a un cruscotto della Ubidots. Fino a qui tutto ok funziona benissimo e riesco a inviare i dati a intervalli regolari. Ora vorrei che il mio Arduino UNO wifii rev2 mandi un allarme su telegram tramite bot quando il livello raggiunge la soglia di attenzione e quando raggiunge il livello di l'allarme. vi allego lo script che funziona, ma manca la parte telegram, ne ho provati diversi ma non riesco proprio a farlo funzionare. Grazie

#include <WiFiNINA.h>
#include <SPI.h>
#include <PubSubClient.h>




/****************************************
 * Define Constants
 ****************************************/
namespace {
  const char * WIFISSID = "Vodafone-test"; // Put your WifiSSID here
  const char *  PASSWORD = "Aixenprovence-76"; // Put your wifi password here
  const char * TOKEN = "BBFF-GNBKaaOWdBi92FJTVR6HEQc43MHGON"; // Put your Ubidots' TOKEN
  const char * MQTT_CLIENT_NAME = "RCfkAg9FOfEc"; // MQTT client Name, assign an unique 8-12 alphanumeric character ASCII string; 
  const char * VARIABLE_LABEL = "distance"; // Assign the variable label
  const char * DEVICE_LABEL = "arduinouno"; // The MAC address of the device will be assigned as device label
  const char * MQTT_BROKER = "industrial.api.ubidots.com";
  
  const int ANALOG_PIN_0 = A0; // INGRESSO A0
  int analog_value, distance_mm, distance_cm;
}

/* Sensor's declarations */
int distance;
/* Space to store the request */
char payload[50];
char topic[50];

/****************************************
 * Auxiliar Functions
 ****************************************/
WiFiClient ubidots;
PubSubClient client(ubidots);

void callback(char* topic, byte* payload, unsigned int length) {
  char p[length + 1];
  memcpy(p, payload, length);
  p[length] = NULL;
  String message(p);
  Serial.write(payload, length);
  Serial.println(topic);
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.println("Attempting MQTT connection...");
    
    // Attemp to connect
    if (client.connect(MQTT_CLIENT_NAME, TOKEN, "")) {
      Serial.println("Connected");
    } else {
      Serial.print("Failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 2 seconds");
      // Wait 2 seconds before retrying
      delay(2000);
    }
  }
}

/****************************************
 * Sensor Functions
 ****************************************/
int readDistance() {
  analog_value = analogRead(ANALOG_PIN_0);
  distance_mm = analog_value * 5;
  distance_cm = distance_mm / 10;
  return distance_cm;
}


/****************************************
 * Main Functions
 ****************************************/
void setup() {
  Serial.begin(115200);
  WiFi.begin(WIFISSID, PASSWORD);

  Serial.println();
  Serial.print("Wait for WiFi...");
  
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  
  Serial.println("");
  Serial.println("WiFi Connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  client.setServer(MQTT_BROKER, 1883);
  client.setCallback(callback);  
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  
  /* call the funtion readDistance() */
  distance = readDistance();
  /* Building the Ubidots request */
  sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL);
  sprintf(payload, "%s", ""); // Cleans the payload
  sprintf(payload, "{\"%s\": %d}", VARIABLE_LABEL, distance); // Adds the variable label

  Serial.println(topic); 
  /* Print the sensor reading to the Serial Monitor */
  Serial.println("Publishing values to Ubidots Cloud");
  Serial.print("Distance = ");
  Serial.println(distance);
  
  /* Publish the request to Ubidots */
  client.publish(topic, payload);
  client.loop();
  delay(5000);
}
  



Il solito problema dell'istruzione delay() usata in modo improprio :wink:

Se tieni il microntrollore fermo per ben 5 secondi a fare nulla, è normale che non riesci ad integrare ulteriori funzionalità.
I bot Telegram di solito hanno necessità di fare un polling continuo al server.

Non ho sottomano i link di riferimento, ma inizierei dal classico esempio "blink without delay" per iniziare.

P.S.
Hai messo molte informazioni sensibili in chiaro: password, tolen etc etc

Ciao, grazie per la risposta, considera che il delivery nello script che ho caricato su Arduino è settato ogni 15 minuti, a me servirebbe che, quando legge (ogni 15 minuti) se il sensore segna più di 100 cm mandi il messaggio al bot di telegram come soglia di attenzione, quando supera i 200 mi deve mandare il messaggio di livello di allarme. Le informazioni di password ecc. che ho inserito sono solo di esempio. Proprio per questo sto cercando un aiuto.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.