BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   Arduino Uno: chi ci gioca? (https://www.baronerosso.it/forum/circuiti-elettronici/369985-arduino-uno-chi-ci-gioca.html)

andore 11 maggio 17 19:03

Arduino Uno: chi ci gioca?
 
Ciao raga

Avevo già da un po' di tempo un arduino originale con bluetooth ma, non avendo vari moduli e per mancanza di tempo e soldi non mi ci sono mai applicato sopra:rolleyes:

Ora finalmente sono riuscito a prendermi in buona offerta un full kit "elegoo R3" che accoppiato all'originale funzionano alla grande!

Preso da amazon a questo link: https://www.amazon.it/Elegoo-Progett...ywords=arduino
preso in super offertissima limitata a 37.90 euroB)


Ora, c'è qualcuno che ci smanetta sopra con progetti simpatici da presentarmi e condividere le esperienze di programmazione e elettronica tutti assieme?

Mi sono divertito a provare TUTTI i sensori e i moduli e funzionano TUTTI a meraviglia, l'unico problema che ho avuto è stato sul motore DC che non riesco a capire come farlo partire (vabè sorvoliamo su questo che poi sicuramente risolvo).

La mia idea era di provare a fare una serra "automatizzata" con: display 16x2; modulo temperatura/umidità; Modulo Real time Clock e due ventole per pc a 12v; un modulo bluetooh

Alla fin della fiera arduino mi dovrebbe leggere la temperatura e l'umidità con ora e data tutto sul display (da inviare anche sul cellulare) e impostando i vari parametri e superata una certa soglia di temperatura e umidità mi dovrebbe ventilare la serra con i motori posti sul tettino di plastica della serra, raggiunta la temperatura desiderata si deve fermare tutto, ovviamente con comando in "loop". Magari quando avrò tempo ci aggiungerò un vaporizzatore che stabilizzi anche l'umidità nella serra con una pompetta collegata all'acqua. Sarebbe gradito poter pilotare le ventole anche da cellulare.

Qualcosa in giro per il web l'ho trovata ma, mi ha confuso un po' le idee sul cablaggio e sopratutto sul codice da scrivere e caricare su arduino.

Spero di radunare tutti gli arduinisti per fare un bel thread con tutte le proprie esperienze, idee e progetti :)

Saluti a tutti

ElNonino 11 maggio 17 21:29

Citazione:

Originalmente inviato da andore (Messaggio 5038689)
Ciao raga

Avevo già da un po' di tempo un arduino originale con bluetooth ma, non avendo vari moduli e per mancanza di tempo e soldi non mi ci sono mai applicato sopra:rolleyes:

Ora finalmente sono riuscito a prendermi in buona offerta un full kit "elegoo R3" che accoppiato all'originale funzionano alla grande!

Preso da amazon a questo link: https://www.amazon.it/Elegoo-Progett...ywords=arduino
preso in super offertissima limitata a 37.90 euroB)


Ora, c'è qualcuno che ci smanetta sopra con progetti simpatici da presentarmi e condividere le esperienze di programmazione e elettronica tutti assieme?

Mi sono divertito a provare TUTTI i sensori e i moduli e funzionano TUTTI a meraviglia, l'unico problema che ho avuto è stato sul motore DC che non riesco a capire come farlo partire (vabè sorvoliamo su questo che poi sicuramente risolvo).

La mia idea era di provare a fare una serra "automatizzata" con: display 16x2; modulo temperatura/umidità; Modulo Real time Clock e due ventole per pc a 12v; un modulo bluetooh

Alla fin della fiera arduino mi dovrebbe leggere la temperatura e l'umidità con ora e data tutto sul display (da inviare anche sul cellulare) e impostando i vari parametri e superata una certa soglia di temperatura e umidità mi dovrebbe ventilare la serra con i motori posti sul tettino di plastica della serra, raggiunta la temperatura desiderata si deve fermare tutto, ovviamente con comando in "loop". Magari quando avrò tempo ci aggiungerò un vaporizzatore che stabilizzi anche l'umidità nella serra con una pompetta collegata all'acqua. Sarebbe gradito poter pilotare le ventole anche da cellulare.

Qualcosa in giro per il web l'ho trovata ma, mi ha confuso un po' le idee sul cablaggio e sopratutto sul codice da scrivere e caricare su arduino.

Spero di radunare tutti gli arduinisti per fare un bel thread con tutte le proprie esperienze, idee e progetti :)

Saluti a tutti

Tutto sto casino per coltivare un po di Maria ????? :fiu: :icon_rofl :icon_rofl :icon_rofl

:yeah:

andore 11 maggio 17 22:16

Citazione:

Originalmente inviato da ElNonino (Messaggio 5039009)
Tutto sto casino per coltivare un po di Maria ????? :fiu: :icon_rofl :icon_rofl :icon_rofl

:yeah:

Eh beh scusa, poi la spesa mi ritorna:fiu::icon_rofl

Comunque gli schemi e i progetti singoli diciamo che li ho trovati (orologio, display, termometro e ventole) ora sta solo cercare di capire come unire il tutto e ovviamente cercare di unire anche tutti i codici da caricare su arduino, magari anche facendo una specie di menù pilotato da un pulsante che, premendolo scorre: data e ora >temperatura/umidità e magari, ci metto pure il sensore di livello acqua così da capire quando devo reintegrare l'acqua distillata alle mie piante carnivore:)

11. Temperatura e Umidità DHT-11 - PROGETTI ARDUINO

13. Arduino RTC Ora e Data Display - PROGETTI ARDUINO

15. Arduino Motore Ponte-H L293D SN754410 - PROGETTI ARDUINO (in quest'ultimo però al posto del motore DC dovrei metterci due ventole da pc:unsure:)

aero330 11 maggio 17 22:57

Mi sembra un progetto neanche troppo complicato, direi fattibilissimo anche per uno che non ci "smanetta"...tutto sta nel partire dagli esempi più semplici e stupidi per poi progredire in qualcosa di sempre più complesso.
Quindi prima leggere il sensore di temperatura, poi scrivere sul display, unire le cose e realizzare un termometro ecc ecc....

andore 12 maggio 17 12:49

Citazione:

Originalmente inviato da aero330 (Messaggio 5039045)
Mi sembra un progetto neanche troppo complicato, direi fattibilissimo anche per uno che non ci "smanetta"...tutto sta nel partire dagli esempi più semplici e stupidi per poi progredire in qualcosa di sempre più complesso.
Quindi prima leggere il sensore di temperatura, poi scrivere sul display, unire le cose e realizzare un termometro ecc ecc....

Per il cablaggio ci sono quasi, il problema rimane i codici separati da unire tutti in un solo codice e poi caricarlo su arduino. Non penso che sia possibile incollare i codici di orologio, termometro e ventole ad cazzum sul programma no?! :unsure::blink:

aero330 12 maggio 17 13:38

Citazione:

Originalmente inviato da andore (Messaggio 5039126)
Per il cablaggio ci sono quasi, il problema rimane i codici separati da unire tutti in un solo codice e poi caricarlo su arduino. Non penso che sia possibile incollare i codici di orologio, termometro e ventole ad cazzum sul programma no?! :unsure::blink:

Basterebbe anche il semplice copia/incolla, ma bisogna farlo nei punti giusti e adattando in maniera opportuna il vecchio codice a quello nuovo perchè, tanto per fare un esempio, magari alcuni pin di INPUT/OUTPUT sono in comune ai singoli codici di termometro, orologio, ventole...:wink:

andore 13 maggio 17 10:27

Citazione:

Originalmente inviato da aero330 (Messaggio 5039136)
Basterebbe anche il semplice copia/incolla, ma bisogna farlo nei punti giusti e adattando in maniera opportuna il vecchio codice a quello nuovo perchè, tanto per fare un esempio, magari alcuni pin di INPUT/OUTPUT sono in comune ai singoli codici di termometro, orologio, ventole...:wink:

Infatti era proprio quello che intendevo dire.

Comunque ora mi dedico un attimo a studiare bene il circuito e poi passo alla parte codice :)

Appena finisco posto uno sketch così magari mi correggete se ho sbagliato qualcosa:)

andore 13 maggio 17 15:14

Ok tutto funziona a meraviglia; orologio e temperatura

ora viene il bello!

Come faccio ad unire i due codici?

Codice:

#include <DHT.h>
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
#include "DHT.h"
#define DHTPIN 8
// 8 è il pin di Arduino a cui collego il sensore di temperatura
#define DHTTYPE DHT11
// dht11 è il tipo di sensore che uso
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// connessione display (pin)
char buffer1[20];
char buffer2[20];
RTC_DS1307 RTC;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int setpin = 6;
boolean statepin = 0;
 
void setup() {
lcd.begin(16, 2);
// imposto il tipo di display (colonne, righe)
lcd.setCursor(0,0);
lcd.print("Temperatura");
lcd.setCursor(0,1);
lcd.print("Umidita'");
lcd.setCursor(15,0);
lcd.print("C");
lcd.setCursor(15,1);
lcd.print("%");

pinMode (6, INPUT);
  digitalWrite (6, HIGH);
  Wire.begin();
  RTC.begin();
  lcd.begin(16, 2);
  if (! RTC.isrunning()) {
    RTC.adjust(DateTime(__DATE__, __TIME__));

}
void loop() {
int t = dht.readTemperature();
int h = dht.readHumidity();
// posiziono il cursore alla colonna 12 e riga 0
lcd.setCursor(12, 0);
lcd.print(t);
lcd.setCursor(12, 1);
lcd.print(h);

 statepin = digitalRead (setpin);
  if (statepin == LOW)
  {
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  DateTime now = RTC.now();
  sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  lcd.setCursor(0,0);
  lcd.print( buffer1 );
  sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
  lcd.setCursor(0,1);
  lcd.print( buffer2 );
  delay(1000);

}


void setup () {
 
  }
}

In questo modo e dannatamente e ignorantissimamente SBAGLIATO:icon_rofl:fiu:

aero330 13 maggio 17 15:51

Prova questo...nel tuo originale c'erano alcune cose che non andavano: doppia definizione della funzione LiquidCrystal lcd, doppio lcd.begin(16,2) e la doppia definizione di void setup() alla fine che non c'entra nulla)

Codice:

#include <DHT.h>
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
#include "DHT.h"

#define DHTPIN 8  // 8 è il pin di Arduino a cui collego il sensore di temperatura
#define DHTTYPE DHT11  // dht11 è il tipo di sensore che uso

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // connessione display (pin)

char buffer1[20];
char buffer2[20];

RTC_DS1307 RTC;

const int setpin = 6;
boolean statepin = 0;
int t;
int h;

void setup() {
        lcd.begin(16, 2); // imposto il tipo di display (colonne, righe)
        lcd.setCursor(0,0);
        lcd.print("Temperatura");
        lcd.setCursor(0,1);
        lcd.print("Umidita'");
        lcd.setCursor(15,0);
        lcd.print("C");
        lcd.setCursor(15,1);
        lcd.print("%");

        pinMode (6, INPUT);
        digitalWrite (6, HIGH);

        Wire.begin();
        RTC.begin();

        if (! RTC.isrunning()) {
        RTC.adjust(DateTime(__DATE__, __TIME__));
        }
}

void loop() {
       
        t = dht.readTemperature();
        h = dht.readHumidity();  // posiziono il cursore alla colonna 12 e riga 0
        lcd.setCursor(12, 0);
        lcd.print(t);
        lcd.setCursor(12, 1);
        lcd.print(h);

        statepin = digitalRead (setpin);
       
        if (statepin == LOW)
        {
                RTC.adjust(DateTime(__DATE__, __TIME__));
        }
       
        DateTime now = RTC.now();
        sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
        lcd.setCursor(0,0);
        lcd.print( buffer1 );
        sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
        lcd.setCursor(0,1);
        lcd.print( buffer2 );
        delay(1000);
}


andore 13 maggio 17 17:15

Citazione:

Originalmente inviato da aero330 (Messaggio 5039405)
Prova questo...nel tuo originale c'erano alcune cose che non andavano: doppia definizione della funzione LiquidCrystal lcd, doppio lcd.begin(16,2) e la doppia definizione di void setup() alla fine che non c'entra nulla)

Codice:

#include <DHT.h>
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
#include "DHT.h"

#define DHTPIN 8  // 8 è il pin di Arduino a cui collego il sensore di temperatura
#define DHTTYPE DHT11  // dht11 è il tipo di sensore che uso

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // connessione display (pin)

char buffer1[20];
char buffer2[20];

RTC_DS1307 RTC;

const int setpin = 6;
boolean statepin = 0;
int t;
int h;

void setup() {
        lcd.begin(16, 2); // imposto il tipo di display (colonne, righe)
        lcd.setCursor(0,0);
        lcd.print("Temperatura");
        lcd.setCursor(0,1);
        lcd.print("Umidita'");
        lcd.setCursor(15,0);
        lcd.print("C");
        lcd.setCursor(15,1);
        lcd.print("%");

        pinMode (6, INPUT);
        digitalWrite (6, HIGH);

        Wire.begin();
        RTC.begin();

        if (! RTC.isrunning()) {
        RTC.adjust(DateTime(__DATE__, __TIME__));
        }
}

void loop() {
       
        t = dht.readTemperature();
        h = dht.readHumidity();  // posiziono il cursore alla colonna 12 e riga 0
        lcd.setCursor(12, 0);
        lcd.print(t);
        lcd.setCursor(12, 1);
        lcd.print(h);

        statepin = digitalRead (setpin);
       
        if (statepin == LOW)
        {
                RTC.adjust(DateTime(__DATE__, __TIME__));
        }
       
        DateTime now = RTC.now();
        sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
        lcd.setCursor(0,0);
        lcd.print( buffer1 );
        sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
        lcd.setCursor(0,1);
        lcd.print( buffer2 );
        delay(1000);
}


OK ti ringrazio e sto cominciando a capirci qualcosa, di fatti avevo notato degli errori grossolani ma, il problema rimane sul fatto che ora, sul display però e tutto accavallato come da foto :shutup: come faccio a intervallare ora e temperatura in maniera ciclica?

http://imgur.com/a/3PBsy
Imgur: The most awesome images on the Internet

Altra domanda: per azionare il motore DC ho a disposizione due tipi di transistor NPN ovvero (PN2222 e S8050) quale dovrei usare?

aero330 13 maggio 17 18:09

Con il seguente codice visualizzi alternativamente temperatura/umidità e ora/data ogni 0,5s....cambia il valore del delay a tuo piacere.
*nota che ho spostato alcune righe di codice dal setup al loop per riscrivere tutte le volte temp/umidità

Codice:

#include <DHT.h>
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
#include "DHT.h"

#define DHTPIN 8  // 8 è il pin di Arduino a cui collego il sensore di temperatura
#define DHTTYPE DHT11  // dht11 è il tipo di sensore che uso

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // connessione display (pin)

char buffer1[20];
char buffer2[20];

RTC_DS1307 RTC;

const int setpin = 6;
boolean statepin = 0;
int t;
int h;

void setup() {
        lcd.begin(16, 2); // imposto il tipo di display (colonne, righe)
        lcd.setCursor(0,0);

        pinMode (6, INPUT);
        digitalWrite (6, HIGH);

        Wire.begin();
        RTC.begin();

        if (! RTC.isrunning()) {
        RTC.adjust(DateTime(__DATE__, __TIME__));
        }
}

void loop() {
       
       
        t = dht.readTemperature();
        h = dht.readHumidity();  // posiziono il cursore alla colonna 12 e riga 0
       
        lcd.print("Temperatura");
        lcd.setCursor(0,1);
        lcd.print("Umidita'");
        lcd.setCursor(15,0);
        lcd.print("C");
        lcd.setCursor(15,1);
        lcd.print("%");
        lcd.setCursor(12, 0);
        lcd.print(t);
        lcd.setCursor(12, 1);
        lcd.print(h);
       
        delay(500);       
       
        lcd.clear();  //pulisce tutto lo schermo e cursore in alto a sinistra (0,0)
       
        statepin = digitalRead (setpin);
        if (statepin == LOW)
        {
                RTC.adjust(DateTime(__DATE__, __TIME__));
        }
       
        DateTime now = RTC.now();
        sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
        lcd.setCursor(0,0);
        lcd.print( buffer1 );
        sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
        lcd.setCursor(0,1);
        lcd.print( buffer2 );

        delay(500);

        lcd.clear();
}

Per i transistor è indifferente, ho controllato i datasheet e sono pressochè identici

andore 13 maggio 17 18:23

Citazione:

Originalmente inviato da aero330 (Messaggio 5039422)
Con il seguente codice visualizzi alternativamente temperatura/umidità e ora/data ogni 0,5s....cambia il valore del delay a tuo piacere.
*nota che ho spostato alcune righe di codice dal setup al loop per riscrivere tutte le volte temp/umidità

Codice:

#include <DHT.h>
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
#include "DHT.h"

#define DHTPIN 8  // 8 è il pin di Arduino a cui collego il sensore di temperatura
#define DHTTYPE DHT11  // dht11 è il tipo di sensore che uso

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // connessione display (pin)

char buffer1[20];
char buffer2[20];

RTC_DS1307 RTC;

const int setpin = 6;
boolean statepin = 0;
int t;
int h;

void setup() {
        lcd.begin(16, 2); // imposto il tipo di display (colonne, righe)
        lcd.setCursor(0,0);

        pinMode (6, INPUT);
        digitalWrite (6, HIGH);

        Wire.begin();
        RTC.begin();

        if (! RTC.isrunning()) {
        RTC.adjust(DateTime(__DATE__, __TIME__));
        }
}

void loop() {
       
       
        t = dht.readTemperature();
        h = dht.readHumidity();  // posiziono il cursore alla colonna 12 e riga 0
       
        lcd.print("Temperatura");
        lcd.setCursor(0,1);
        lcd.print("Umidita'");
        lcd.setCursor(15,0);
        lcd.print("C");
        lcd.setCursor(15,1);
        lcd.print("%");
        lcd.setCursor(12, 0);
        lcd.print(t);
        lcd.setCursor(12, 1);
        lcd.print(h);
       
        delay(500);       
       
        lcd.clear();  //pulisce tutto lo schermo e cursore in alto a sinistra (0,0)
       
        statepin = digitalRead (setpin);
        if (statepin == LOW)
        {
                RTC.adjust(DateTime(__DATE__, __TIME__));
        }
       
        DateTime now = RTC.now();
        sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
        lcd.setCursor(0,0);
        lcd.print( buffer1 );
        sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
        lcd.setCursor(0,1);
        lcd.print( buffer2 );

        delay(500);

        lcd.clear();
}

Per i transistor è indifferente, ho controllato i datasheet e sono pressochè identici

Grazie mille e gentilissimo! ti sarebbe possibile spiegarmi in parole povere come bisogna procedere nel codice? Facendo copia e incolla non imparerò mai una fava:D

ps. da quel poco che ho capito, hai semplicemente messo un delay(500) ?

ElNonino 13 maggio 17 18:26

Non conosco molto il linguaggio wire, quindi non posso essere molto d'aiuto, però inizia a togliere il primo "#include <DHT.h>" anche se il compilatore non da errore la duplicazione degli include è bene evitarla e se non erro il primo #include è bene che sia il <wire.h>

Però aspetta quelli che ne sanno più di me.

:yeah:

ElNonino 13 maggio 17 18:41

ripeto perchè fuori tempo massimo per l'editazione.....

Non conosco molto il linguaggio wire, quindi non posso essere molto d'aiuto, però inizia a togliere il primo "#include <DHT.h>" anche se il compilatore non da errore la duplicazione degli include è bene evitarla e se non erro il primo #include è bene che sia il <wire.h>

Però aspetta quelli che ne sanno più di me.

Per fare in modo che ogni tot di tempo il display mostri dati diversi devi usare una variabile bool che passa da 0 ad 1 a 0 a 1 ad ogni giro, chiamiamola tic, quindi alla fine del loop metterai tic != tic (o tic not tic) non so come sia la sintassi corretta.

Quindi se inizializzi tic a 0 con tic = 0 prima di entrare nel loop al termine del primo giro tic varrà 1, al giro successivo sarà = a 0 e via di seguito.

All'interno del loop ti basterà implementare un if tipo
if tic = 0
display temperatura
else
display time

se dovessero servirti più display basterà che usi per tic una variabile byte che incrementerai ad ogni giro ed azzererai quando giro varrà giro +1:
tic = 0

switch tic
tic = 0: display temp
tic = 1 display time
tic = 2 display humidity
........
tic = 10 display hello

tic = tic + 1
if tic = 11 then tic = 0

è uno pseudo codice da adattare al linguaggio usato

poi ci sono metodi più furbi per fare il tutto specialmente se il numero di display da visualizzare è multiplo di 2.
:yeah:

andore 13 maggio 17 18:41

Citazione:

Originalmente inviato da ElNonino (Messaggio 5039426)
Non conosco molto il linguaggio wire, quindi non posso essere molto d'aiuto, però inizia a togliere il primo "#include <DHT.h>" anche se il compilatore non da errore la duplicazione degli include è bene evitarla e se non erro il primo #include è bene che sia il <wire.h>

Però aspetta quelli che ne sanno più di me.

:yeah:

In effetti non l'avevo notato e di fatti il DHT sul codice lo segna in nero, quindi non l'ha preso in considerazione, l'ho appena tolto e funziona tutto normalmente.

La posizione degli #include non è indifferente? Se no, perchè?:unsure:

Grazie anche a te nonino

Almeno quando sarà finito potrà essere di sicuro utile a qualcun'altro :)

aero330 13 maggio 17 20:05

Citazione:

Originalmente inviato da andore (Messaggio 5039428)
In effetti non l'avevo notato e di fatti il DHT sul codice lo segna in nero, quindi non l'ha preso in considerazione, l'ho appena tolto e funziona tutto normalmente.

La posizione degli #include non è indifferente? Se no, perchè?:unsure:

Grazie anche a te nonino

Almeno quando sarà finito potrà essere di sicuro utile a qualcun'altro :)

Confermo quanto detto da ElNonino (anche a me era sfuggito il DHT)

La posizione degli" include" alcune volte non è casuale ma sistemata in maniera opportuna, questo perchè, facendotela corta, in alcuni file header (quelli con estensione .h per l'appunto) sono contenute variabili (o altro) che sono definite/dichiarate in altri file .h

Il discorso è più complesso ma cerco di farti un esempio molto banale e terra terra:
Lavori in pizzeria e devi recapitare delle pizze (senza mangiartele :lol:) ad un certo Andrea, Matteo, Alessia, Marta.....tu non hai la ben minima idea di chi siano e dove abitano per cui rimani fermo dove sei

Supponi ora, lo stesso scenario, ma questa volta prima ti viene riferito che

Andrea: sta al 3 piano di via XX
Marta: via YY
Matteo: piazza ZZ
Alessia: viale TT

per cui le pizze giungeranno ai clienti perchè a priori qualcuno ti ha dato delle informazioni aggiuntive !!

Ecco, nel mondo della programmazione, avviene qualcosa di simile. Se scambi di posto due #include può accadere che il compilatore (quello che verifica la corretta sintassi del codice, detto mooooooooooolto semplicemente) si trovi a dover gestire delle situazioni in cui non ha abbastanza informazioni per proseguire il controllo del codice. Anche se queste vengono fornite a psteriori non c'è nulla da fare, vanno date prima che queste vengano utilizzate.

Non pretendo che tu abbia capito, ma spero di essermi spiegato :wacko::wacko:

Per il codice che ti ho scritto:
Premessa: devi pensare l'arduino, o meglio, il microntrollore a bordo della scheda Arduino, come un robot che esegue gli ordini (istruzioni di codice) che gli dai esattamente nell'ordine in cui le scrivi. Lui le mette in pratica senza fiatare in sequenza una dopo l'altro.

All'inizio del codice si includono le librerie necessarie per poter mettere in comunicazione la scheda con i sensori/oggetti esterni, nel tuo caso sensore, display e orologio.

Poi, in genere, la dichiarazione delle variabili che andranno utilizzate nel resto del codice

Nella funzione void setup() va scritto tutto quello che serve per configurare le porte della scheda come input/output, inizializzazione delle periferiche (display, sensore...), ovvero prepare Arduino a svolgere il lavoro pesante successivamente (vedila come una sorta d riscaldamento prima della partita)

Poi la parte principale del codice (nella programmazione in genere si chiama "main") espressa dalla funzione void loop() che viene eseguita ciclicamente fino a che non si interrompe l'alimentazione dalla scheda.
E' qui dentro che va scritto tutto quello che ti passa per la testa per il tuo progetto.
Nel caso specifico, quello che ho fatto, è stato leggere il sensore e riportare su display i valori di temperatura e umidità, attendere 500ms, pulire completamente il display e scrivere queta volta il valore di data/ora, attendere 500ms, pulire il display e ricominciare da capo con temperatura ecc ecc.
In pratica non ho fatto altro che riportare il mio pensiero logico in istruzioni macchina.

Ricorda questo: non esiste un unico modo per scrivere codice, possono esserci infiniti modi, chi lo scrive in 5 righe chi in 50, funziona tutto solo che il primo ha ottimizzato

Come si fa ad acquisire tutto ciò? Esperienza :wink:

Ho risposto un po' alla tua domanda?

P.s. valida anche la struttura switch/case di Elnonino ma siccome sei a digiuno di programmazione ho fatto le cose semplici semplici

andore 13 maggio 17 23:08

Citazione:

Originalmente inviato da aero330 (Messaggio 5039439)
Confermo quanto detto da ElNonino (anche a me era sfuggito il DHT)

La posizione degli" include" alcune volte non è casuale ma sistemata in maniera opportuna, questo perchè, facendotela corta, in alcuni file header (quelli con estensione .h per l'appunto) sono contenute variabili (o altro) che sono definite/dichiarate in altri file .h

Il discorso è più complesso ma cerco di farti un esempio molto banale e terra terra:
Lavori in pizzeria e devi recapitare delle pizze (senza mangiartele :lol:) ad un certo Andrea, Matteo, Alessia, Marta.....tu non hai la ben minima idea di chi siano e dove abitano per cui rimani fermo dove sei

Supponi ora, lo stesso scenario, ma questa volta prima ti viene riferito che

Andrea: sta al 3 piano di via XX
Marta: via YY
Matteo: piazza ZZ
Alessia: viale TT

per cui le pizze giungeranno ai clienti perchè a priori qualcuno ti ha dato delle informazioni aggiuntive !!

Ecco, nel mondo della programmazione, avviene qualcosa di simile. Se scambi di posto due #include può accadere che il compilatore (quello che verifica la corretta sintassi del codice, detto mooooooooooolto semplicemente) si trovi a dover gestire delle situazioni in cui non ha abbastanza informazioni per proseguire il controllo del codice. Anche se queste vengono fornite a psteriori non c'è nulla da fare, vanno date prima che queste vengano utilizzate.

Non pretendo che tu abbia capito, ma spero di essermi spiegato :wacko::wacko:

Per il codice che ti ho scritto:
Premessa: devi pensare l'arduino, o meglio, il microntrollore a bordo della scheda Arduino, come un robot che esegue gli ordini (istruzioni di codice) che gli dai esattamente nell'ordine in cui le scrivi. Lui le mette in pratica senza fiatare in sequenza una dopo l'altro.

All'inizio del codice si includono le librerie necessarie per poter mettere in comunicazione la scheda con i sensori/oggetti esterni, nel tuo caso sensore, display e orologio.

Poi, in genere, la dichiarazione delle variabili che andranno utilizzate nel resto del codice

Nella funzione void setup() va scritto tutto quello che serve per configurare le porte della scheda come input/output, inizializzazione delle periferiche (display, sensore...), ovvero prepare Arduino a svolgere il lavoro pesante successivamente (vedila come una sorta d riscaldamento prima della partita)

Poi la parte principale del codice (nella programmazione in genere si chiama "main") espressa dalla funzione void loop() che viene eseguita ciclicamente fino a che non si interrompe l'alimentazione dalla scheda.
E' qui dentro che va scritto tutto quello che ti passa per la testa per il tuo progetto.
Nel caso specifico, quello che ho fatto, è stato leggere il sensore e riportare su display i valori di temperatura e umidità, attendere 500ms, pulire completamente il display e scrivere queta volta il valore di data/ora, attendere 500ms, pulire il display e ricominciare da capo con temperatura ecc ecc.
In pratica non ho fatto altro che riportare il mio pensiero logico in istruzioni macchina.

Ricorda questo: non esiste un unico modo per scrivere codice, possono esserci infiniti modi, chi lo scrive in 5 righe chi in 50, funziona tutto solo che il primo ha ottimizzato

Come si fa ad acquisire tutto ciò? Esperienza :wink:

Ho risposto un po' alla tua domanda?

P.s. valida anche la struttura switch/case di Elnonino ma siccome sei a digiuno di programmazione ho fatto le cose semplici semplici

Ti sei spiegato benissimo!:D

però diciamo che non sono proprio a digiuno di programmazione, sono agli inizi di html5, javascript, css ma, diciamo proprio alla prima portata dell'antipasto :D

Per cui detto questo, purtroppo alcune cose ancora mi sfuggono e ancora non riesco a integrarmi, destreggiarmi e ragionare con metodo nei vari linguaggi

Veramente grazie per la tua disponibilità:)

aliante88 13 maggio 17 23:34

Citazione:

Originalmente inviato da andore (Messaggio 5039477)
Ti sei spiegato benissimo!:D

però diciamo che non sono proprio a digiuno di programmazione, sono agli inizi di html5, javascript, css ma, diciamo proprio alla prima portata dell'antipasto :D

Per cui detto questo, purtroppo alcune cose ancora mi sfuggono e ancora non riesco a integrarmi, destreggiarmi e ragionare con metodo nei vari linguaggi

Veramente grazie per la tua disponibilità:)

:fiu:

andore 13 maggio 17 23:36

Citazione:

Originalmente inviato da ElNonino (Messaggio 5039427)
ripeto perchè fuori tempo massimo per l'editazione.....

Non conosco molto il linguaggio wire, quindi non posso essere molto d'aiuto, però inizia a togliere il primo "#include <DHT.h>" anche se il compilatore non da errore la duplicazione degli include è bene evitarla e se non erro il primo #include è bene che sia il <wire.h>

Però aspetta quelli che ne sanno più di me.

Per fare in modo che ogni tot di tempo il display mostri dati diversi devi usare una variabile bool che passa da 0 ad 1 a 0 a 1 ad ogni giro, chiamiamola tic, quindi alla fine del loop metterai tic != tic (o tic not tic) non so come sia la sintassi corretta.

Quindi se inizializzi tic a 0 con tic = 0 prima di entrare nel loop al termine del primo giro tic varrà 1, al giro successivo sarà = a 0 e via di seguito.

All'interno del loop ti basterà implementare un if tipo
if tic = 0
display temperatura
else
display time

se dovessero servirti più display basterà che usi per tic una variabile byte che incrementerai ad ogni giro ed azzererai quando giro varrà giro +1:
tic = 0

switch tic
tic = 0: display temp
tic = 1 display time
tic = 2 display humidity
........
tic = 10 display hello

tic = tic + 1
if tic = 11 then tic = 0

è uno pseudo codice da adattare al linguaggio usato

poi ci sono metodi più furbi per fare il tutto specialmente se il numero di display da visualizzare è multiplo di 2.
:yeah:

Ti ringrazio ElNonino sei stato chiaro anche te, diciamo che vedendo il risultato pratico, poi leggere e capire lo script mi è risultato molto più facile:)

magari ora devo capire solo come far partire il motore DC in maniera pratica perchè, ho fatto una prova separatamente e non parte, forse mi serve energia aggiuntiva vero?

Intanto questo è lo schema che ho fatto, manca solo sto motore che non saprei come montarlo :wacko: io avevo pensato di mettere il negativo al pin 7 o pin 13 e il positivo che va al modulo di energia aggiuntivo più alla 5v del pin di arduino. Faccio la cazzata o è esatto?

Per il codice invece era quello di aggiungere la variabile (i) e se non sbaglio il motore DC va da 0 a 250 quindi, se per esempio la temperatura supera i 32 C° allora di accende il motore con la ventola, altrimenti rimane spento.https://s15.postimg.org/71u9bxhkr/Clima_serra.jpg

aero330 14 maggio 17 02:21

Citazione:

Originalmente inviato da andore (Messaggio 5039477)
Ti sei spiegato benissimo!:D

però diciamo che non sono proprio a digiuno di programmazione, sono agli inizi di html5, javascript, css ma, diciamo proprio alla prima portata dell'antipasto :D

Per cui detto questo, purtroppo alcune cose ancora mi sfuggono e ancora non riesco a integrarmi, destreggiarmi e ragionare con metodo nei vari linguaggi

Veramente grazie per la tua disponibilità:)

E che ci sta a fare il forum :lol::lol:

andore 14 maggio 17 21:02

Citazione:

Originalmente inviato da aero330 (Messaggio 5039507)
E che ci sta a fare il forum :lol::lol:

Ci sta a dare fastidio a te, ElNonino e ai prossimi che si aggiungeranno al thread:icon_rofl

aero330 15 maggio 17 00:21

Citazione:

Originalmente inviato da andore (Messaggio 5039644)
Ci sta a dare fastidio a te, ElNonino e ai prossimi che si aggiungeranno al thread:icon_rofl

Se rispondiamo è perche ci piace essere "infastiditi" di domande :icon_rofl

Per il motore in DC non dovresti aver problemi a pilotarlo: in rete se cerchi trovi SICURAMENTE come fare e come collegarlo.
Ti basta scegliere uno dei pin rimasti liberi, dichiararlo come uscita e accenderlo/spegnerlo se vuoi un controllo ON/OFF con "digitalwrite" oppure con controllo PWM (da 0 a max con valori ntermedi) con la funzione "analogwrite".
Circuitalmente parlando basta un resistore tra il pin che hai scelto e la base del transistor (il valore non ricordo ma almeno di qualche Kohm), l'emettitore a massa e il collettore a uno dei due fili del motore, l'altro filo a Vcc.
Occhio che i 5v forniti dall'arduino mediante cavo usb potrebbero non bastare per il motore in DC in quanto hanno la carattetristica di assorbire molta corrente per lo spunto inziiale per cui potresti vedere l'arduino resettarsi all'avvio del motore stesso. Ti consiglio di caricare il firmware e poi alimentare la scheda con un'altra fonte di energia a 5V

aero330 15 maggio 17 00:33

Dimenticavo...anche un diodo in antiparallelo al motore per evitare sovratensioni negative. Cerca in google e avrai le risposte, non sono a PC adesso

andore 15 maggio 17 11:38

Citazione:

Originalmente inviato da aero330 (Messaggio 5039711)
Dimenticavo...anche un diodo in antiparallelo al motore per evitare sovratensioni negative. Cerca in google e avrai le risposte, non sono a PC adesso

Si infatti, ho trovato molti circuiti ma in sostanza é lo stesso, il modulo di energia aggiuntiva c'è l'ho e quindi, mi tocca solo mettermi sotto oggi pomeriggio B)

andore 15 maggio 17 15:23

Collegamenti completati e schema finalmente finito:lol:

https://s21.postimg.org/8dwk643nb/Clima_serra_bb.jpg

Il problema ora sorge nel codice che, dal solo motore dc con monitor virtuale, invio 255 e parte, a 0 si ferma come dovrebbe essere, per cui qui tutto ok.

Ma visto che ora nel codice di certo non posso fare copia/incolla in questo modo:

Codice:

#include <Wire.h>
#include <DHT.h>
#include <RTClib.h>
#include <LiquidCrystal.h>

#define DHTPIN 8  // 8 è il pin di Arduino a cui collego il sensore di temperatura
#define DHTTYPE DHT11  // dht11 è il tipo di sensore che uso

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // connessione display (pin)

char buffer1[20];
char buffer2[20];

RTC_DS1307 RTC;

const int setpin = 6;
boolean statepin = 0;
int t;
int h;
int motorPin = 7;

void setup() {
  lcd.begin(16, 2); // imposto il tipo di display (colonne, righe)
  lcd.setCursor(0,0);

  pinMode (6, INPUT);
  digitalWrite (6, HIGH);

  Wire.begin();
  RTC.begin();

  if (! RTC.isrunning()) {
  RTC.adjust(DateTime(__DATE__, __TIME__));

  pinMode(motorPin, OUTPUT);
  Serial.begin(9600);
  while (! Serial);
  Serial.println("Speed 0 to 255");
  Serial.println("But the advice 50 to 255. Because the minimum voltage required to start the motor is 50.");
  }
}

void loop() {

  t = dht.readTemperature();
  h = dht.readHumidity();  // posiziono il cursore alla colonna 12 e riga 0
 
  lcd.print("Temperatura");
  lcd.setCursor(0,1);
  lcd.print("Umidita'");
  lcd.setCursor(15,0);
  lcd.print("C");
  lcd.setCursor(15,1);
  lcd.print("%");
  lcd.setCursor(12, 0);
  lcd.print(t);
  lcd.setCursor(12, 1);
  lcd.print(h);
 
  delay(5000);
 
  lcd.clear();  //pulisce tutto lo schermo e cursore in alto a sinistra (0,0)
 
  statepin = digitalRead (setpin);
  if (statepin == LOW)
  {
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
 
  DateTime now = RTC.now();
  sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  lcd.setCursor(0,0);
  lcd.print( buffer1 );
  sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
  lcd.setCursor(0,1);
  lcd.print( buffer2 );

  delay(5000);

  lcd.clear(); //Pulisco lo schermo e ricomincio da capo

  if (Serial.available())
  {
    int speed = Serial.parseInt();
    if (speed >= 0 && speed <= 255)
    {
      analogWrite(motorPin, speed);
    }
  }

}

Bisognerebbe dichiarare la i giusto?

per cui, ignorantemente parlando se

i=30C°

i>30C° (motorPin, LOW)

if i<30C° (motorPin; speed)

Una cosa del genere giusto?

andycar 15 maggio 17 17:11

Al posto di questo....
=======================================
if (Serial.available())
{
int speed = Serial.parseInt();
if (speed >= 0 && speed <= 255)
{
analogWrite(motorPin, speed);
}
}
========================================

metti...

=========================================
if (t > 30)
{
speed = 255 ;
}
else
{
speed = 0 ;
}
analogWrite(motorPin, speed);
=========================================

andore 15 maggio 17 17:56

Citazione:

Originalmente inviato da andycar (Messaggio 5039830)
Al posto di questo....
=======================================
if (Serial.available())
{
int speed = Serial.parseInt();
if (speed >= 0 && speed <= 255)
{
analogWrite(motorPin, speed);
}
}
========================================

metti...

=========================================
if (t > 30)
{
speed = 255 ;
}
else
{
speed = 0 ;
}
analogWrite(motorPin, speed);
=========================================

Gentilissimo, immaginavo fosse una cosa del genere:)

ora provo e vi faccio sapere^_^

andore 15 maggio 17 18:08

No, purtroppo mi restituise questo errore:shutup:

Codice:

Arduino:1.8.2 (Windows 10), Scheda:"Arduino/Genuino Uno"

C:\Users\USER\Desktop\Progetti Arduino\Clima_serra\Clima_serra.ino: In function 'void loop()':

Clima_serra:85: error: 'speed' was not declared in this scope

 speed = 255 ;

 ^

Clima_serra:89: error: 'speed' was not declared in this scope

 speed = 0 ;

 ^

Clima_serra:91: error: 'speed' was not declared in this scope

 analogWrite(motorPin, speed);

                      ^

exit status 1
'speed' was not declared in this scope

Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni"

Il codice che ho modificato è questo:

Codice:

//Con l'aiuto di aero330 ed ElNonino, utenti di www.baronerosso.it
#include <Wire.h>
#include <DHT.h>
#include <RTClib.h>
#include <LiquidCrystal.h>

#define DHTPIN 8  // 8 è il pin di Arduino a cui collego il sensore di temperatura
#define DHTTYPE DHT11  // dht11 è il tipo di sensore che uso

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // connessione display (pin)

char buffer1[20];
char buffer2[20];

RTC_DS1307 RTC;

const int setpin = 6;
boolean statepin = 0;
int t;
int h;
int motorPin = 7;

void setup() {
  lcd.begin(16, 2); // imposto il tipo di display (colonne, righe)
  lcd.setCursor(0,0);

  pinMode (6, INPUT);
  digitalWrite (6, HIGH);

  Wire.begin();
  RTC.begin();

  if (! RTC.isrunning()) {
  RTC.adjust(DateTime(__DATE__, __TIME__));
  }
 
  {
  pinMode(motorPin, OUTPUT);
  }
}

void loop() {

  t = dht.readTemperature();
  h = dht.readHumidity();  // posiziono il cursore alla colonna 12 e riga 0
 
  lcd.print("Temperatura");
  lcd.setCursor(0,1);
  lcd.print("Umidita'");
  lcd.setCursor(15,0);
  lcd.print("C");
  lcd.setCursor(15,1);
  lcd.print("%");
  lcd.setCursor(12, 0);
  lcd.print(t);
  lcd.setCursor(12, 1);
  lcd.print(h);
 
  delay(5000);
 
  lcd.clear();  //pulisce tutto lo schermo e cursore in alto a sinistra (0,0)
 
  statepin = digitalRead (setpin);
  if (statepin == LOW)
  {
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
 
  DateTime now = RTC.now();
  sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  lcd.setCursor(0,0);
  lcd.print( buffer1 );
  sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
  lcd.setCursor(0,1);
  lcd.print( buffer2 );

  delay(5000);

  lcd.clear(); //Pulisco lo schermo e ricomincio da capo

  if (t > 30)
{
speed = 255 ;
}
else
{
speed = 0 ;
}
analogWrite(motorPin, speed);

}

PS. Il pin 7 non è un digitalW:unsure:rite?

ElNonino 15 maggio 17 18:13

Devi dichiarare la variabile speed.
"
int speed;
"
o qualcosa di simile.

:yeah:

andycar 15 maggio 17 18:15

Non hai dichiarato la variabile: speed

Inserisci:

int speed = 0;

Prima del

void setup() {


Tutti gli orari sono GMT +2. Adesso sono le 19:54.

Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002