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 15 maggio 17 18:17

Citazione:

Originalmente inviato da andycar (Messaggio 5039845)
Non hai dichiarato la variabile: speed

Inserisci:

int speed = 0;

Prima del

void setup() {

Infatti me ne sono accorto e la stavo dichiarando :fiu::D

andycar 15 maggio 17 18:26

Tieni presente che è "case sensitive".

speed non è uguale a Speed

andore 15 maggio 17 18:31

Citazione:

Originalmente inviato da andycar (Messaggio 5039853)
Tieni presente che è "case sensitive".

speed non è uguale a Speed

Si infatti questo lo sapevo:)

Ora per aggiungere anche l'umidità dovrei mettere

if (t > 30, h > 60)

giusto?

andore 15 maggio 17 18:42

Funziona tutto alla grande!:D

Non mi resta che provarlo sulla serra appena posso :lol:

aero330 17 maggio 17 14:45

Non voglio essere di certo pignolo ma ho cambiato qualcosina nel codice, per ottimizzarlo il più possibile, per quella che è la mia "povera" esperienza.
Non ho modificato il comportamento del progetto ma solo riscritto in una forma più corretta possibile :lol: Visto che si parla anche di programmazione consiglio di farla bene fin da subito, per cui ho inserito i commenti ove necessario.
Non voglio passare per quello che se la tira perchè ne sa di più (anzi esattamente il contrario) ma mi piacerebbe trasmettere quello che imparato fin'ora. :wink:

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>

// Generalmente quando ci sono delle costanti in gioco che non cambiano mai (come delle soglie, temperature di riferimento....) meglio definire delle
// "variabili particolari" chiamate "MACRO": queste non occupano memoria riducendo la "complessità" del codice (non entro nei dettagli).
// Tali MACRO sono quelle che iniziano con "#define".

// Esempio: scrivendo " #define PIPPO 3 " vuol dire che in qualsiasi parte del codice ogni volta viene richiamata la parola PIPPO, ad essa viene associato il numero costante 3
// E' buona regola definire le costanti in questo modo nel mondo della programmazione.

//----- Sensore -----
#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

#define MAX_TEMP 30    // soglia di temperatura (default 30)
#define MAX_HUM  60    // soglia di umidità (default 60)
#define RANGE  2    // ampiezza dell'isteresi. Brevemente: quando si controllano dei valori rispetto a delle soglie (come il caso della Temperatura>30°)
            // in genere è meglio farlo non su un singolo valore ma su 2 distinti, altrimenti il motore (leggi ventola) potrebbe accendersi/spegnersi in continuazione
            // perchè la temperatura oscilla repentinamente intorno ai 30°. Inserendo un controllo su due soglie distinte, ad esempio 30°+2 e 30°-2 si riesce a
            // contenere questo fenomeno. Sia chiaro, non è necessario, ma potrebbe far comodo in futuro: se non ti interessa questa cosa metti semplicemente 0 al posto di 2
           
//----- Motore -----
#define MOTOR_PIN 7    // pin7 collegato al motore

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 = false;  //definendo una variabile booleana, meglio utilizzare treu/false anziché i numeri
int t;
int h;
int speed;

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

  pinMode (6, INPUT);
  digitalWrite (6, HIGH);
 
  pinMode (MOTOR_PIN, OUTPUT);  // pin 7 collegato al motore
  digitalWrite (MOTOR_PIN, LOW);  // spengo il motore per sicurezza

  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(5000);

  lcd.clear();  //pulisce tutto lo schermo e cursore in alto a sinistra (0,0)

  statepin = digitalRead (setpin);
  if (statepin == false)
  {
    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

// Adesso avviene il controllo della temperatura/umidità con le famose soglie distinte

  if ( (t > MAX_TEMP+RANGE) && (h > MAX_HUM+RANGE) ){
    speed = 255 ;
  }
  if ( (t < MAX_TEMP-RANGE) && (h < MAX_HUM-RANGE) ){
    speed = 0 ;
  }
  analogWrite(MOTOR_PIN, speed);

}


andore 18 maggio 17 00:55

Citazione:

Originalmente inviato da aero330 (Messaggio 5040174)
Non voglio essere di certo pignolo ma ho cambiato qualcosina nel codice, per ottimizzarlo il più possibile, per quella che è la mia "povera" esperienza.
Non ho modificato il comportamento del progetto ma solo riscritto in una forma più corretta possibile :lol: Visto che si parla anche di programmazione consiglio di farla bene fin da subito, per cui ho inserito i commenti ove necessario.
Non voglio passare per quello che se la tira perchè ne sa di più (anzi esattamente il contrario) ma mi piacerebbe trasmettere quello che imparato fin'ora. :wink:

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>

// Generalmente quando ci sono delle costanti in gioco che non cambiano mai (come delle soglie, temperature di riferimento....) meglio definire delle
// "variabili particolari" chiamate "MACRO": queste non occupano memoria riducendo la "complessità" del codice (non entro nei dettagli).
// Tali MACRO sono quelle che iniziano con "#define".

// Esempio: scrivendo " #define PIPPO 3 " vuol dire che in qualsiasi parte del codice ogni volta viene richiamata la parola PIPPO, ad essa viene associato il numero costante 3
// E' buona regola definire le costanti in questo modo nel mondo della programmazione.

//----- Sensore -----
#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

#define MAX_TEMP 30    // soglia di temperatura (default 30)
#define MAX_HUM  60    // soglia di umidità (default 60)
#define RANGE  2    // ampiezza dell'isteresi. Brevemente: quando si controllano dei valori rispetto a delle soglie (come il caso della Temperatura>30°)
            // in genere è meglio farlo non su un singolo valore ma su 2 distinti, altrimenti il motore (leggi ventola) potrebbe accendersi/spegnersi in continuazione
            // perchè la temperatura oscilla repentinamente intorno ai 30°. Inserendo un controllo su due soglie distinte, ad esempio 30°+2 e 30°-2 si riesce a
            // contenere questo fenomeno. Sia chiaro, non è necessario, ma potrebbe far comodo in futuro: se non ti interessa questa cosa metti semplicemente 0 al posto di 2
           
//----- Motore -----
#define MOTOR_PIN 7    // pin7 collegato al motore

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 = false;  //definendo una variabile booleana, meglio utilizzare treu/false anziché i numeri
int t;
int h;
int speed;

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

  pinMode (6, INPUT);
  digitalWrite (6, HIGH);
 
  pinMode (MOTOR_PIN, OUTPUT);  // pin 7 collegato al motore
  digitalWrite (MOTOR_PIN, LOW);  // spengo il motore per sicurezza

  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(5000);

  lcd.clear();  //pulisce tutto lo schermo e cursore in alto a sinistra (0,0)

  statepin = digitalRead (setpin);
  if (statepin == false)
  {
    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

// Adesso avviene il controllo della temperatura/umidità con le famose soglie distinte

  if ( (t > MAX_TEMP+RANGE) && (h > MAX_HUM+RANGE) ){
    speed = 255 ;
  }
  if ( (t < MAX_TEMP-RANGE) && (h < MAX_HUM-RANGE) ){
    speed = 0 ;
  }
  analogWrite(MOTOR_PIN, speed);

}


Cavolo, è fin troppo quello che hai fatto e ti ringrazio del tempo dedicatomi da te come gli altri:)

Intanto sto cercando di studiare e mi sono trovato una decina di libri che esplicano solo progetti ma, credo che il migliore sia questo "arduino language reference" dove veramente ti spiega tutti i codici chiave che in un "normale" linguaggio C o C++, java ecc. non ci sono:wacko:

Da quanto ho capito, il miglior modo per imparare è copiare e studiare i progetti creati da altri...

Intanto ti ringrazio di nuovo, mi studio il codice e poi nei prossimi giorni vi darò di nuovo fastidio per la costruzione di un braccio robot:fiu:

aero330 18 maggio 17 02:37

Citazione:

Originalmente inviato da andore (Messaggio 5040277)
Cavolo, è fin troppo quello che hai fatto e ti ringrazio del tempo dedicatomi da te come gli altri:)

Intanto sto cercando di studiare e mi sono trovato una decina di libri che esplicano solo progetti ma, credo che il migliore sia questo "arduino language reference" dove veramente ti spiega tutti i codici chiave che in un "normale" linguaggio C o C++, java ecc. non ci sono:wacko:

Da quanto ho capito, il miglior modo per imparare è copiare e studiare i progetti creati da altri...

Intanto ti ringrazio di nuovo, mi studio il codice e poi nei prossimi giorni vi darò di nuovo fastidio per la costruzione di un braccio robot:fiu:

Di nulla, figurati !!!
Ci sono molti pdf online riguardo su come si struttura un codice in arduino con spiegazioni passo passo, però, se posso consigliarti, meglio "studiarsi" un buon libro su C/C++ per il semplice motivo che non bisogna sapere quali funzioni arduino mette a disposizione, ma come si struttura e si scrive un buon codice. E' come voler progettare un'autovettura ma concentrarsi esclusivamente sul motore...non sarebbe meglio avere una visione più globale anche su freni, ruote, volante, centralina...ecc ecc? :wink:
Ovviamente deve piacerti perchè altrimenti diventa noioso e lasci perdere alla seconda pagina.

P.s. il codice l'ho compilato e non presenta errori, ma bisogna vedere se funziona! :icon_rofl:icon_rofl

dex1 18 maggio 17 10:58

buongiorno.

a breve vorrei realizzare un multi voltmetro con lcd con arduino nano.
per la realizzazione fisica problemi zero,
la compilazione dello sketc stendiamo un velo pietoso,ho letto qualcosa
non so non mi entra molto in testa ultimamente.
in rete ho trovato un progetto simile a quello che servirebbe a me.
chi mi da una mano?

grazie
dex1

aero330 18 maggio 17 11:08

Citazione:

Originalmente inviato da dex1 (Messaggio 5040317)
buongiorno.

a breve vorrei realizzare un multi voltmetro con lcd con arduino nano.
per la realizzazione fisica problemi zero,
la compilazione dello sketc stendiamo un velo pietoso,ho letto qualcosa
non so non mi entra molto in testa ultimamente.
in rete ho trovato un progetto simile a quello che servirebbe a me.
chi mi da una mano?

grazie
dex1

Qualcosa di più nel dettaglio?

italo.driussi 18 maggio 17 11:51

Citazione:

Originalmente inviato da dex1 (Messaggio 5040317)
buongiorno.

a breve vorrei realizzare un multi voltmetro con lcd con arduino nano.
per la realizzazione fisica problemi zero,
la compilazione dello sketc stendiamo un velo pietoso,ho letto qualcosa
non so non mi entra molto in testa ultimamente.
in rete ho trovato un progetto simile a quello che servirebbe a me.
chi mi da una mano?

grazie
dex1

menu file
apri sketch

Menu strumenti
tipo arduino
porta seriale
programmatore AVRISP mkII

menu sketch
verifica/compila


posta il link che hai trovato

andore 18 maggio 17 12:01

Citazione:

Originalmente inviato da aero330 (Messaggio 5040287)
Di nulla, figurati !!!
Ci sono molti pdf online riguardo su come si struttura un codice in arduino con spiegazioni passo passo, però, se posso consigliarti, meglio "studiarsi" un buon libro su C/C++ per il semplice motivo che non bisogna sapere quali funzioni arduino mette a disposizione, ma come si struttura e si scrive un buon codice. E' come voler progettare un'autovettura ma concentrarsi esclusivamente sul motore...non sarebbe meglio avere una visione più globale anche su freni, ruote, volante, centralina...ecc ecc? :wink:
Ovviamente deve piacerti perchè altrimenti diventa noioso e lasci perdere alla seconda pagina.

P.s. il codice l'ho compilato e non presenta errori, ma bisogna vedere se funziona! :icon_rofl:icon_rofl

il circuito è ancora montanto, più tardi lo provo e faccio sapere, magari ci faccio pure un video:lol:

andycar 18 maggio 17 12:11

Visto che ci siamo...

Qualcuno ha provato ad usare la "Jeti box" per leggere e scrivere sulla Eeprom di Arduino?

dex1 18 maggio 17 12:58

Citazione:

Originalmente inviato da aero330 (Messaggio 5040319)
Qualcosa di più nel dettaglio?

Citazione:

Originalmente inviato da italo.driussi (Messaggio 5040323)
menu file
apri sketch

Menu strumenti
tipo arduino
porta seriale
programmatore AVRISP mkII

menu sketch
verifica/compila


posta il link che hai trovato

Make a Mini Arduino Programmable 4 Channel DC-DVM: 8 Steps

aero330 18 maggio 17 13:18

Citazione:

Originalmente inviato da andore (Messaggio 5040329)
il circuito è ancora montanto, più tardi lo provo e faccio sapere, magari ci faccio pure un video:lol:

Ottimo! Son curioso !

Citazione:

Originalmente inviato da andycar (Messaggio 5040332)
Visto che ci siamo...

Qualcuno ha provato ad usare la "Jeti box" per leggere e scrivere sulla Eeprom di Arduino?

Purtroppo no.

Citazione:

Originalmente inviato da dex1 (Messaggio 5040342)

Interessante! Adesso ci do un'occhiata

italo.driussi 18 maggio 17 16:42

Citazione:

Originalmente inviato da andycar (Messaggio 5040332)
Visto che ci siamo...

Qualcuno ha provato ad usare la "Jeti box" per leggere e scrivere sulla Eeprom di Arduino?

La jeti box e un terminale nato per dialogare con i prodotti jeti** usa un suo protocollo, scrive sulla eeprom della cpu dei regolatori grazie al software inserito nel programma del regolatore


(** e altro come leggere l' amiezza segnale pwm delle riceventi ecc.)

andycar 18 maggio 17 17:23

Citazione:

Originalmente inviato da italo.driussi (Messaggio 5040382)
La jeti box e un terminale nato per dialogare con i prodotti jeti** usa un suo protocollo, scrive sulla eeprom della cpu dei regolatori grazie al software inserito nel programma del regolatore


(** e altro come leggere l' amiezza segnale pwm delle riceventi ecc.)

So bene cosa è la Jeti box... :)
Il problema è che sto provando ad usarla per scrivere e leggere la eeprom di Arduino, ma con scarsi risultati.:rolleyes:

italo.driussi 18 maggio 17 18:23

Citazione:

Originalmente inviato da andycar (Messaggio 5040393)
So bene cosa è la Jeti box... :)
Il problema è che sto provando ad usarla per scrivere e leggere la eeprom di Arduino, ma con scarsi risultati.
:rolleyes:

Io per leggere/scrivere diversi processori atmel (non protetti) uso il programmino
progisp 1.72, legge programma/eeprom/fuse

Nel tuo caso proverei a leggere la eeprom, salvarla, editarla e riscriverla

andore 18 maggio 17 18:26

2 Allegato/i
C'è un modo per collegare questo display touch resistivo con flat a 40pin ?

Sto cercando qualche adattatore ma non trovo nulla:unsure:

PS. il circuito lo script ottimizzato funziona alla grande e le spiegazioni sono state chiarissime!:lol:

andycar 18 maggio 17 18:27

Citazione:

Originalmente inviato da italo.driussi (Messaggio 5040406)
Io per leggere/scrivere diversi processori atmel (non protetti) uso il programmino
progisp 1.72, legge programma/eeprom/fuse

Nel tuo caso proverei a leggere la eeprom, salvarla, editarla e riscriverla

Probabilmente mi sono spiegato male, non ho nessun problema a leggere o scrivere sulla eeprom di Arduino usando il PC.
Vorrei farlo usando la Jeti box come interfaccia.

andycar 18 maggio 17 18:31

Citazione:

Originalmente inviato da andore (Messaggio 5040408)
C'è un modo per collegare questo display touch resistivo con flat a 40pin ?

Sto cercando qualche adattatore ma non trovo nulla:unsure:

PS. il circuito lo script ottimizzato funziona alla grande e le spiegazioni sono state chiarissime!:lol:

Trovane uno con protocollo I2C... te la cavi con 4 fili, cosa che semplifica parecchio.

(ammesso che "touch" esista. :) )

aero330 18 maggio 17 19:34

Citazione:

Originalmente inviato da andore (Messaggio 5040408)
C'è un modo per collegare questo display touch resistivo con flat a 40pin ?

Sto cercando qualche adattatore ma non trovo nulla:unsure:

PS. il circuito lo script ottimizzato funziona alla grande e le spiegazioni sono state chiarissime!:lol:

Ottimo!
Ci son tanti display in giro per la rete, proprio uno con 40 pin ??? :lol:

aero330 18 maggio 17 20:07

Citazione:

Originalmente inviato da dex1 (Messaggio 5040342)

Ho letto l'articolo, interessante.
In cosa avresti bisogno nello specifico?

andore 18 maggio 17 21:34

Citazione:

Originalmente inviato da aero330 (Messaggio 5040431)
Ottimo!
Ci son tanti display in giro per la rete, proprio uno con 40 pin ??? :lol:

Eh beh questo ho trovato a casa :icon_rofl

aero330 18 maggio 17 21:39

Citazione:

Originalmente inviato da andore (Messaggio 5040452)
Eh beh questo ho trovato a casa :icon_rofl

Il problema è poter mettere in comunicazione il controller del display con arduino. Forse il tuo ha un protocollo proprietario per cui è inutilizzabile (suppongo)...se c'è qualche sigla prova a digitarla su google per vedere se c'è una compatibilità (al di là di un adattatore)

ElNonino 18 maggio 17 22:04

Alcuni suggerimenti di valenza generale ed indipendenti dal hw o linguaggio di programmazione usato:

- quando è necessario leggere una tensione (anche quella fornita da un sensore) utilizzando un AD converter, sia esso integrato nel microprocessore od anche esterno è bene usare un circuito d'ingresso (con partitore) simile a questo:

http://win.wallytech.it/public/ADCIN.jpg

il condensatore C1 andrebbe posto fisicamente il più vicino possibile al relativo piedino d'ingresso analogico del convertitore.

L'insieme R3-C1 è un primitivo filtro bassa basso che garantisce una tensione stabile ed a bassa impedenza al convertitore AD e filtra eventuali spike.

- per ottenere una buona precisione di lettura è anche consigliato usare come Vref per il convertitore AD (se è disponibile un pin dedicato del micro) quella fornita da uno 'zener' apposito, ottimo per i convertitori AD a 12 bit usarne uno da 4,096V in modo che ogni step del convertitore corrisponda ad 1mV o multipli precisi dati dal partitore d'ingresso. Questo trucco consente anche di usare interi per le conversioni e l'elaborazione dei valori ottenuti anzichè con virgola che nei piccoli micro rallenta molto il tempo d'esecuzione. Naturalmente nel caso di ingresso ratiometrico (potenziometro o sensore con uscita equivalente) va benissimo usare i +5V di alimentazione del micro.

- per ottenere un dato stabile ed attendibile sul display è anche bene filtrare il segnale del ADC utilizzando una semplice media mobile su più campionamenti, se poi la media mobile è eseguita su un multiplo di 2 ci sono trucchetti (che se vi interessa dirò in altro intervento) per renderla estremamente veloce e semplice da implementare.

- non vedo troppo bene per andore la regolazione 'brutale' ON/OFF della ventola, meglio sarebbe renderla proporzionale alla temperatura usando una semplice regolazione PD o PI se non proprio PID, con poche righe di codice eviteresti la continua oscillazione della stessa.

:yeah:

dex1 19 maggio 17 13:06

Citazione:

Originalmente inviato da aero330 (Messaggio 5040440)
Ho letto l'articolo, interessante.
In cosa avresti bisogno nello specifico?

la compilazione e successive modifiche del software.
per esempio:
nel progetto ci sono tre varianti,
una lettura
due letture
quattro letture

pero solo su quella a due letture ce il valore minimo e massimo letti
almeno cosi mi sembra.
vorrei in futuro poterla implementare anche sulle altre.

a livello schematico,collegamenti partitori ecc ecc non ho problemi.

andore 19 maggio 17 15:45

Citazione:

Originalmente inviato da ElNonino (Messaggio 5040458)
Alcuni suggerimenti di valenza generale ed indipendenti dal hw o linguaggio di programmazione usato:

- quando è necessario leggere una tensione (anche quella fornita da un sensore) utilizzando un AD converter, sia esso integrato nel microprocessore od anche esterno è bene usare un circuito d'ingresso (con partitore) simile a questo:

http://win.wallytech.it/public/ADCIN.jpg

il condensatore C1 andrebbe posto fisicamente il più vicino possibile al relativo piedino d'ingresso analogico del convertitore.

L'insieme R3-C1 è un primitivo filtro bassa basso che garantisce una tensione stabile ed a bassa impedenza al convertitore AD e filtra eventuali spike.

- per ottenere una buona precisione di lettura è anche consigliato usare come Vref per il convertitore AD (se è disponibile un pin dedicato del micro) quella fornita da uno 'zener' apposito, ottimo per i convertitori AD a 12 bit usarne uno da 4,096V in modo che ogni step del convertitore corrisponda ad 1mV o multipli precisi dati dal partitore d'ingresso. Questo trucco consente anche di usare interi per le conversioni e l'elaborazione dei valori ottenuti anzichè con virgola che nei piccoli micro rallenta molto il tempo d'esecuzione. Naturalmente nel caso di ingresso ratiometrico (potenziometro o sensore con uscita equivalente) va benissimo usare i +5V di alimentazione del micro.

- per ottenere un dato stabile ed attendibile sul display è anche bene filtrare il segnale del ADC utilizzando una semplice media mobile su più campionamenti, se poi la media mobile è eseguita su un multiplo di 2 ci sono trucchetti (che se vi interessa dirò in altro intervento) per renderla estremamente veloce e semplice da implementare.

- non vedo troppo bene per andore la regolazione 'brutale' ON/OFF della ventola, meglio sarebbe renderla proporzionale alla temperatura usando una semplice regolazione PD o PI se non proprio PID, con poche righe di codice eviteresti la continua oscillazione della stessa.

:yeah:

Infatti, l'unico problema che ho appena notato è questo: dopo qualche secondo che il motore dc è acceso, il display e il led di arduino, oltre al led del modulo di alimentazione esterno, cominciano a sfarfallare:wacko:

Lo script funziona alla grande ma forse c'è qualcosa da modificare nel progetto, per renderlo più stabile.

aero330 19 maggio 17 17:39

Citazione:

Originalmente inviato da andore (Messaggio 5040591)
Infatti, l'unico problema che ho appena notato è questo: dopo qualche secondo che il motore dc è acceso, il display e il led di arduino, oltre al led del modulo di alimentazione esterno, cominciano a sfarfallare:wacko:

Lo script funziona alla grande ma forse c'è qualcosa da modificare nel progetto, per renderlo più stabile.

Il motore a spazzole è una brutta bestia...le commutazioni delle spazzolle sul collettore producono scintille e quindi picchi di tensione (leggi disturbi) che potrebbero dar fastidio a tutto il circuito. Probabilmente la tensione non è ben stabilizzata, io metterei un condensatore elettrolitico da qualche uF sull'alimentazione, ma ElNonino saprebbe indirizzarti meglio.

Per curiosità, questo modulo di alimentazione esterno com'è fatto? riesci a dare più info? tensione in uscita, corrente max fornita....

aero330 19 maggio 17 18:33

2 Allegato/i
Citazione:

Originalmente inviato da dex1 (Messaggio 5040560)
la compilazione e successive modifiche del software.
per esempio:
nel progetto ci sono tre varianti,
una lettura
due letture
quattro letture

pero solo su quella a due letture ce il valore minimo e massimo letti
almeno cosi mi sembra.
vorrei in futuro poterla implementare anche sulle altre.

a livello schematico,collegamenti partitori ecc ecc non ho problemi.

Allora:
1) collega la scheda arduino al PC
2) apri l'IDE di arduino, vai su "Strumenti ->Scheda" e selezioni quella che utilizzi
e poi "Strumenti -> Programmatore -> AVRISP mkII"
3) scarica i due file ZIP che ti ho messo in allegato
4) vai su "Strumenti -> Sketch -> #includi libreria -> Aggiungi libreria da file .ZIP"
e cerca i due file "Adafruit_GFX.ZIP" e "Adafruit_ST7735".
5) chiudi tutto e riapri l'IDE di arduino
6) "File -> Nuovo", cancelli tutto e incolli questo:
Codice:

#define sclk 13
#define mosi 11
#define cs  10
#define dc  9
#define rst  8  //  reset

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>

Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);

// number of analog samples to take per reading, per channel
#define NSAMP 100 // number of samples to take befor displaying

// voltage divider calibration values
#define Dv1    11.00
#define Dv2    11.001
#define Dv3    11.00
#define Dv4    10.985

// ADC reference voltage / calibration value
#define VREF    5.00

int sum[4] = {0};                // sums of samples taken
unsigned char Scount = 0;  // current sample number
float AVvolts[4] = {0.0};        // calculated voltages
char cnt1 = 0;                  // used in 'for' loops

float V_max[4] = {0.00 ,0.00, 0.00, 0.00};
float V_min[4] = {100.00, 100.00, 100.00, 100.00};

void setup()
{
  tft.initR(INITR_BLACKTAB);  // initialize a ST7735S chip, black tab
  tft.fillScreen(ST7735_BLACK); //  clear screen
  tft.setTextColor(ST7735_WHITE);
  tft.drawRoundRect(2, 20, 120, 110, 5,ST7735_WHITE);
  tft.setTextSize(1);
  tft.setCursor(5,0);
  tft.println("4 channel voltmeter");
  tft.setTextColor(0XFF00);
  tft.setCursor(0,140);
  tft.println(" Caution max voltage        55vdc");
}

       
void loop()
{
    // take a number of analog samples and add them up
    while (Scount < NSAMP) {
        // sample each channel A0 to A3
        for (cnt1 = 0; cnt1 < 4; cnt1++) {
            sum[cnt1] += analogRead(A0 + cnt1);
        }
        Scount++;
        delay(10);
    }
   
    // calculate the voltage for each channel
    for (cnt1 = 0; cnt1 < 4; cnt1++) {
        AVvolts[cnt1] = ((float)sum[cnt1] / (float)NSAMP * VREF) / 1024.0;
        if(AVvolts[cnt1] > V_max[cnt1]){ //get MAX value of sample
          V_max[cnt1] = AVvolts[cnt1];
        }
        if(AVvolts[cnt1] < V_min[cnt1]){ //get MIN value of sample
          V_min[cnt1] = AVvolts[cnt1];
        }       
    }
    // display voltages on TFT LCC Display
 
    // voltage 1 - V1(pin A0) 
    tft.setTextColor(ST7735_YELLOW,ST7735_BLACK); // set color for V1
    tft.setTextSize(2);
    tft.setCursor(15, 40);
    tft.print("V1 ");
    tft.print(AVvolts[0] * Dv1, 1);
    tft.print("V ");
    // voltage 2 - V2(pin A1)
    tft.setTextColor(ST7735_GREEN,ST7735_BLACK);// set color for V2
    tft.setCursor(15, 60);
    tft.print("V2 ");
    tft.print(AVvolts[1] * Dv2, 1);
    tft.print("V ");
    // voltge 3 - V3(pin A2)
    tft.setTextColor(ST7735_CYAN,ST7735_BLACK);// set color for V3
    tft.setCursor(15, 80);
    tft.print("V3 ");
    tft.print(AVvolts[2] * Dv3, 1);
    tft.print("V ");
    // voltage 4 - V4(pin A3)
    tft.setTextColor(ST7735_WHITE,ST7735_BLACK);// set color for V4
    tft.setCursor(15, 100);
    tft.print("V4 ");
    tft.print(AVvolts[3] * Dv4, 2);
    tft.print("V ");
    tft.drawRoundRect(2, 20, 120, 110, 5,ST7735_WHITE);
    // reset count and sums
    Scount = 0;
    for (cnt1 = 0; cnt1 < 4; cnt1++) {
        sum[cnt1] = 0;
    }
}

7)clicca in alto sulla freccia a destra ("carica")
8)se tutto è andato a buon fine non ottieni nessun errore ma solo "caricamento "completato"
9) fatto

Ho preso il codice quello completo con le 4 tensioni lette e aggiunto il calcolo dei valori massimi/minimi per ciascun canale.
L'unica cosa è che non li visualizzi perchè non c'è abbastanza spazio sul display, a meno che tu non mi dica come fare (esempio: visualizzo ogni singolo canale ciclicamente con sotto il max/min relativo, oppure i 4 canali contemporaneamente ma con i valori max/min scrittti a fianco più piccoli ecc ecc)

P.s. non ho il display in questione per cui sto facendo tutto al buio :lol:

ElNonino 19 maggio 17 21:46

@andore: per il problema dei disturbi prova a mettere un condensatore in parallelo al motorino, meglio due: un elettrolitico da 22uF..47uF ed un altro ceramico da 10nF, od anche tre, l'elettrolitico e due da 10nF saldati fra i fili di alimentazione del motore e la carcassa dello stesso.

@aero330: per mediare il valore letto dal convertitore AD è meglio usare una media mobile in potenza di 2 lavorando con interi e poi usare lo shift a destra al posto della divisione, solo alla fine fare un unico casting in float che ci sarebbe anche il modo di evitarlo (forse).

Il casting in float, i calcoli in float ed i prinf sono estremamente lenti sui piccoli micro ad 8 bit come quello di arduino 1.

Un altro suggerimento: è buona norma nel assegnare nomi alle variabili usare un prefisso che identifichi il formato della stessa, ad esempio:

- count è meglio chiamarla u8count od u8_count se si usa un intero ad 8 bit senza segno, etc.

:yeah:


Tutti gli orari sono GMT +2. Adesso sono le 21:15.

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