Progetto pianta parlante per Esame di Stato

Salve a tutti.
Come da titolo vorrei creare questo progettino da presentare all'esame di stato che avrò al termine del mio percorso di studi di elettronica. Inizialmente mi era venuto in mente di fare un goniometro diitale ma, date le mie scarse/scarsissime conoscenze in ambito ho deciso di ripiegare su una pianta parlante che mi pare un progetto più d'impatto per una commissione.

L'idea di base è questa

Un sensore di uminidtà nel terreno che rileva l'umidità del terriccio. Se la terra è secca un display a matrice di punti rappresenta una faccina triste e un display lcd mostra il livello di umidità e il messaggio di dover annaffiare la pianta. In caso contrario la faccina felice e il valore di umidità della pianta.

Ho aperto questo topic per avere un vostro parere e dei consigli durante il progetto perchè, nonostante l'idea iniziale sia questa e i miei doecenti dicano che basti, mi pare un progetto molto facile, perciò vorrei aggiungerci anche dei led rossi e verdi dietro la pianta che si illuminano in corrispondenza dello stato cattivo o buono dell'umidità della terra e, soprattutto, creare un collegamento con lo smartphone per comunicare, attraverso una notifica, lo stato della terra e se questa ha bisogno di essere annaffiata.

Mi affido a voi e lascio a voi i commenti, ringraziandovi in anticipo :wink:

[UPDATE 1]

Ho finalmente avuto qualche giorno libero per poter lavorare al progetto.

Imgur

#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

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

void setup() {

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

void loop() {

  lcd.setCursor(0, 0);
  livelloacqua = analogRead(A0);
  if (livelloacqua < 160) {
    lcd.setCursor(0, 0);
    lcd.print("Riempire acqua      ");
  }
  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);
  }


}

Questo è quello che ho combinato.

Essenzialmente la parte facile del progetto l'ho fatta. Ho collegato i vari sensori e ho scritto tutto sul display. Ho anche fatto un circuito di potenza per poter comandare l'elettrovalvola con un mosfet IRF540N ma il problema è che per funzionare bene necessita comunque di una piccola pressione e, quindi, non è adatta al lavoro "di caduta" come l'avevo pensato. Consigli su qualche elettrovalvola che fa al caso mio?

Inoltre avevo in mente di realizzare la notifica sul dispositivo ma, per rendere il rpgetto più carino e "multipiatta" come dicono i gamer avevo pensato di notificare lo stato della pianta tramite un accoun twitter (ho già installatro sopra la board la shiel ethernet). Ho fatto una prva ma ricevo diversi errori con il mac address.

-->

Arduino: 1.8.5 (Windows 10), Board: "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

Prova_twitter:6: error: invalid digit "9" in octal constant

 byte mac[] = { E0,91,F5,42,09,4B };

                            ^

Prova_twitter:6: error: 'E0' was not declared in this scope

 byte mac[] = { E0,91,F5,42,09,4B };

                ^

Prova_twitter:6: error: 'F5' was not declared in this scope

 byte mac[] = { E0,91,F5,42,09,4B };

                      ^

Prova_twitter:6: error: unable to find numeric literal operator 'operator""B'

 byte mac[] = { E0,91,F5,42,09,4B };

                               ^

exit status 1
invalid digit "9" in octal constant

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

Non so se su Arduino esista veramente distinzione tra "progetto facile" e "progetto difficile", almeno lato programmazione.
Certamente un progetto che include notifiche sul cellulare é più appariscente di uno che non le include, ma fossi in te io comincerei a lavorare sul progetto "facile", suddividendo il lavoro in maniera che sia poi scalabile. Il bello di Arduino e dell'elettronica tutta é che, rispettati input e output, tutti i progetti possono essere composti da parti più piccole e semplici.
Cominci a fare il progetto semplice e vedere come riesce. Se poi andrà complicato lo si farà.
Infine ricorda che "l'appetito vien mangiando"

UPDATE 1

I valori del MAC Address sono ... numeri espressi in esadecimale, ce lo vogliamo mettere il prefisso 0x davanti ?

byte mac[] = { 0xE0, 0x91, 0xF5, 0x42, 0x09, 0x4B };

Guglielmo

gpb01:
I valori del MAC Address sono ... numeri espressi in esadecimale, ce lo vogliamo mettere il prefisso 0x davanti ?

byte mac[] = { 0xE0, 0x91, 0xF5, 0x42, 0x09, 0x4B };

Guglielmo

Adesso lo compila ma mi chiedevo una cosa. Sto seguendo una guida del 2011 e ho fatto tutto alla lettera ma non mi si vuole collegare in nessun modo. Negli ultimi anni twitter ha cambiato al protocollo https, potrebbe essere quello il problema?

Gonick:
Negli ultimi anni twitter ha cambiato al protocollo https, potrebbe essere quello il problema?

Quasi sicuramente ... negli ultimi anni quasi tutti hanno anche cambiato i meccanismi di autenticazione e molti sono passati a OAtuh2 ... non so twitter ... ::slight_smile:

Guglielmo

Ho un grosso problema.
Sono riuscito a far funzionare sia le notifiche tramite l'app Blink sia la visualizzazione dei dati dei due sensor sul cellulare ma, se carico il nuovo sketch, le vecchie funzioni sembrano impazzire e non mi funzionano nè i led nè il display.

Ecco a seguito i due sketch:

#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

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

void setup() {

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

void loop() {

  lcd.setCursor(0, 0);
  livelloacqua = analogRead(A0);
  if (livelloacqua < 160) {
    lcd.setCursor(0, 0);
    lcd.print("Riempire acqua      ");
  }
  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);
  }


}

Mentre questo è con l'aggiunta dei comandi per Blynk:

#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;
int notifica = false;
#define LEDV1 9
#define LEDV2 10
#define LEDR1 11
#define LEDR2 12

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);
  lcd.clear();
  timer.setInterval(1000L, programma);
}

void programma() {
  livelloacqua = analogRead(A0);
  Blynk.virtualWrite(V1, livelloacqua);
  umiditaterra = analogRead(A1);
  Blynk.virtualWrite(V2, umiditaterra);
  lcd.setCursor(0, 0);
  livelloacqua = analogRead(A0);
  if ((livelloacqua < 160 && !notifica)) {
    lcd.setCursor(0, 0);
    lcd.print("Riempire acqua      ");
    Blynk.notify("L'acqua è in esaurimento! Devi riempirla!");
    notifica = true;
  }
  if ((livelloacqua >= 130) && (notifica = false)) {
    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 loop() {
  Blynk.run();
  timer.run();
}

Per quale ragione non funziona più cioò che è scritto in void programma? Ho copiato pari pari dal vecchio sketch

EDIT: Il programma gira bene solo e soltanto se la connessione è stabilita...come mai? Vorrei che fosse esattamente il contrario

Ho provato con queste modifiche ma adesso, pur funzionando offline, non mi si connette più

#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;
int notifica = false;
#define LEDV1 9
#define LEDV2 10
#define LEDR1 11
#define LEDR2 12
int ReCnctFlag;  // Reconnection Flag
int ReCnctCount = 0;  // Reconnection counter

void setup() {
  // Debug console
  Serial.begin(9600);
  pinMode(SDCARD_CS, OUTPUT);
  digitalWrite(SDCARD_CS, HIGH); // Deselect the SD card
  Blynk.config(auth);
  Blynk.connect();

  lcd.begin(16, 2);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  lcd.clear();
  timer.setInterval(400L, programma); // run programma every 1 second
}
BLYNK_CONNECTED() {
  Serial.println("Cconnected");
  ReCnctCount = 0;
}

void programma() {
  livelloacqua = analogRead(A0);
  Blynk.virtualWrite(V1, livelloacqua);
  umiditaterra = analogRead(A1);
  Blynk.virtualWrite(V2, umiditaterra);
  lcd.setCursor(0, 0);
  livelloacqua = analogRead(A0);
  if ((livelloacqua < 160 && !notifica)) {
    lcd.setCursor(0, 0);
    lcd.print("Riempire acqua      ");
    Blynk.notify("L'acqua è in esaurimento! Devi riempirla!");
    notifica = true;
  }
  if ((livelloacqua >= 130) && (notifica == true)) {
    lcd.setCursor(0, 0);
    lcd.print("Acqua OK            ");
    notifica=false;
  }

  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 loop() {
  timer.run();
  if (Blynk.connected()) {  // If connected run as normal
    Blynk.run();
  } else if (ReCnctFlag == 0) {  // If NOT connected and not already trying to reconnect, set timer to try to reconnect in 30 seconds
    ReCnctFlag = 1;  // Set reconnection Flag
    Serial.println("Starting reconnection timer in 30 seconds...");
    timer.setTimeout(30000L, []() {  // Lambda Reconnection Timer Function
      ReCnctFlag = 0;  // Reset reconnection Flag
      ReCnctCount++;  // Increment reconnection Counter
      Serial.print("Attempting reconnection #");
      Serial.println(ReCnctCount);
      Blynk.connect();  // Try to reconnect to the server
    });  // END Timer Function
  }
}