Sketch Blynk per IoT

Sto cercando di realizzare una comunicazione daArduino trimete il mio cellulare sfruttando l’app Blynk. Dopo un paio di errori iniziali (scrivevo il programma nel loop, anche se questo faceva andare tutto :P) sono riuscito a far visualizzare sul cellulare i valori dei due sensori che utilizzo ma non riesco più a far “leggere” ad Arduino le altre 2 funzioni, come se non esistessero proprio nel programma e, quindi, non riesco ad avere la notifica sul cellulare e il tweet sul profilo impostato.

Ecco il programma:

#include <LiquidCrystal.h>                        // Includi libreria Display LCD
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);              // Dichiara Pin Display LCD

#define BLYNK_PRINT Serial
#include <SPI.h>
#include <Ethernet.h>
#include <BlynkSimpleEthernet.h>
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "b92ca63401f34dd98ef80930c0899e4f";
BlynkTimer timer;
#define W5100_CS  10
#define SDCARD_CS 4

int livelloacqua = 0;
int umiditaterra = 0;
#define LEDV1 9
#define LEDV2 10
#define LEDR1 11
#define LEDR2 12
#define ProvaLed 13

void programma() {
  digitalWrite(ProvaLed, HIGH);
  lcd.setCursor(0, 0);
  livelloacqua = analogRead(A0);
  if (livelloacqua < 160) {
    lcd.setCursor(0, 0);
    lcd.print("Riempire acqua      ");
    Blynk.notify("L'acqua è in esaurimento! Devi riempirla!");
    Blynk.tweet("Parla Arduino");
  }
  if (livelloacqua >= 130) {
    lcd.setCursor(0, 0);
    lcd.print("Acqua OK            ");
  }

  umiditaterra = analogRead(A1);
  if (umiditaterra > 500) {
    lcd.setCursor(0, 1);
    lcd.print("Annaffiare          ");
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(11, HIGH);
    digitalWrite(12, HIGH);
  }
  if (umiditaterra < 500) {
    lcd.setCursor(0, 1);
    lcd.print("Pianta OKAY         ");
    digitalWrite(9, HIGH);
    digitalWrite(10, HIGH);
    digitalWrite(11, LOW);
    digitalWrite(12, LOW);
  }
}

void mytimer() {
  livelloacqua = analogRead(A0);
  Blynk.virtualWrite(V1, livelloacqua);
  umiditaterra = analogRead(A1);
  Blynk.virtualWrite(V2, umiditaterra);

}
void setup() {
  // Debug console
  Serial.begin(9600);
  pinMode(SDCARD_CS, OUTPUT);
  digitalWrite(SDCARD_CS, HIGH); // Deselect the SD card
  Blynk.begin(auth);
  // You can also specify server:
  //Blynk.begin(auth, "blynk-cloud.com", 80);
  //Blynk.begin(auth, IPAddress(192,168,1,100), 8080);
  // For more options, see Boards_Ethernet/Arduino_Ethernet_Manual example

  lcd.begin(16, 2);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  lcd.clear();

  timer.setInterval(1000L, mytimer);
}

void loop() {
  Blynk.run();
  timer.run();
}

Qualcuno sa come risolvere? Ho perfino provato a mettere un led per confermare la mia teoria (LedProva sul pin 13) e in effetti nemmeno quello si accende. Dove sto sbagliando?

Oltre a richiamare

  timer.setInterval(1000L, mytimer);

devi richiamare anche il tuo programma

brunello22:
Oltre a richiamare

  timer.setInterval(1000L, mytimer);

devi richiamare anche il tuo programma

Quindi? Penso proprio di non saper fare eheh

Quindi ogni void che apro devo richiamarlo nel setup?

prova ad aggiungere, sempre nel setup()

  timer.setInterval(1500L, programma);

brunello22:
prova ad aggiungere, sempre nel setup()

  timer.setInterval(1500L, programma);

Niente, facendo così ricevo le notifiche a ripetizione e la lettura dei sensori non funziona più.

Ho chiesto su un forum un mano e mi hanno detto di fare così ma vorrei una speigazione anche da voi perchè da noob quale sono non capisco comunque.

"Using another variable as a check for the notification being sent.
Introduce a new bool e.g. bool sentMessage = false;
then change:

if (livelloacqua < 160 && !sentMessage) {
    lcd.setCursor(0, 0);
    lcd.print("Riempire acqua      ");
    Blynk.notify("L'acqua è in esaurimento! Devi riempirla!");
    sentMessage  = true;
  }

when you refil you’ll need to reset this bool, so probably add sentMessage= false e.g.

if (livelloacqua >= 130) {

in this way you get the message only once. You can also add a timer that checks whether the bool = true and then sent a new message every 10006010 ms. (=10 minutes).

1 Like

Si, magari se non metti il tuo auth code IN CHIARO è meglio se vuoi evitare che qualcuno, nel mondo, giochi con la tua app....