Si dispone di un pulsante e un led
Lo stato del led segue quello del pulsante: premendo il pulsante, il led si accende; rilasciando il pulsante il led si spegne;
Ad ogni pressione del pulsante il led cambia stato;
Per il caso precedente evitare che la pressione ininterrotta generi cambiamenti di stato:
usando un ciclo while che attende il rilascio del pulsante
usando due variabili di stato per individuare il fronte di salita ( o discesa) del pulsante.
Bisogna attivare e disattivare un carico (led) in un ambiente normalmente non accessibile, attraverso due pulsanti posti all'esterno e lontani tra loro.
Ad ogni pulsante sono associati due LED: uno che si accende quando il carico è attivo e l'altro che si accende quando il carico è non attivo. In totale sono presenti 4 LED di segnalazione, due per ogni pulsante.
Ogni pulsante può attivare e/o disattivare il carico.
Prevedere la disattivazione forzata dopo 30 secondi.
Si dispone di un alimentatore e un multimetro. Verificare il funzionamento dei seguenti componenti aggiungendo se necessario altri componenti (dimensionandoli) per ottenere una tensione variabile in uscita:
potenziometro
sensore di forza
sensore di temperatura tmp
Confrontare le tre verifiche precedenti:
evidenziare le caratteristiche comuni e distintive dei componenti esaminati
determinare se possibile la sensibilità media (rapporto tra la variazione dell'uscita e la variazione dell'ingresso) dei tre dispositivi e la sensibilità del circuito utilizzato (in questo ultimo caso l'uscita è una tensione).
Verificare se la sensibilità è costante nel campo di variazione della grandezza fisica
Si dispone di un sensore di temperatura e di un multimetro. Al variare della temperatura visualizzare sul monitor seriale di Arduino:
il valore digitale acquisito
la tensione analogica corrispondente
la temperatura
float Ndig =0; //valore digitale convertito dall'ADC.
float Vana; //tensione analogica da convertire
float temp; // temperatura a cui è associata Vana
void setup()
{
Serial.begin(9600); //comunicazione con il monitor seriale
pinMode(A0, INPUT);
}
void loop()
{
Ndig = analogRead(A0); // converte in digitale il valore analogico di ingresso
Vana = Ndig*5/1024;
// calcola il valore analogico. Ndig deve essere dichiarato float altrimenti il calcolo
// Ndig*5/1024 viene trattato come intero e la sua parte decimale troncata; il valore
// assegnato a Vana sarà solo la parte intera.
temp = 100*Vana-50;
// calcola la temperatura dal valore analogico. La relazione si ottiene scrivendo
// l'equazione della retta che passa per i punti (0,1V; -40°C) e (1,75V; 125°C)
Serial.print("Ndig = ");
Serial.println(Ndig);
Serial.print("Vana = ");
Serial.println(Vana);
Serial.print("Temperatura = ");
Serial.println(temp);
delay(1000);
}
ES. Spiegare ed utilizzare nell'esempio precedente la funzione map di Arduino
long map(long x, long in_min, long in_max, long out_min, long out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
Visualizzare su un display lcd la temperatura acquisita con l'ADC di Arduino
Determinare la configurazione hw minima e verificare le funzioni della libreria relativa.
Caricando dalla libreria di tinkercad la coppia arduino + display si ottiene anche il relativo sw con le funzioni essenziali per la gestione del display
Gestire il condizionatore estivo in un ambiente (simulato da un led).
Si dispone di due sensori di temperatura, uno interno e l'altro esterno. Visualizzare le due temperature su un display lcd.
Si desidera una temperatura interna minore di quella esterna. Ad es. all'interno 20/25 °C, all'esterno 30 °C
Quando il condizionatore è spento la temperatura interna aumenta e raggiunge quella esterna (simulare il fenomeno agendo manualmente sul sensore).
Prevedere un funzionamento con isteresi. In fase di raffreddamento la temperatura scende dal suo valore fino al minimo (20°C), quindi il condizionatore si spegne, la temperatura risale fino al max (25°C) e il condizionatore si riaccende.
Un pulsante attiva e disattiva il condizionatore ma le due temperature continuano ad essere visualizzate
Gestire il condizionatore invernale (simulato da un led) in un ambiente .
Si dispone di due sensori di temperatura, uno interno e l'altro esterno. Visualizzare le due temperature su un display lcd.
Si desidera una temperatura interna maggiore di quella esterna. Ad es. all'interno 20/25 °C, all'esterno 15 °C
Quando il condizionatore è spento la temperatura interna diminuisce e raggiunge quella esterna (simulare il fenomeno agendo manualmente sul sensore).
Prevedere un funzionamento con isteresi. In fase di riscaldamento la temperatura aumenta dal suo valore fino al massimo (25°C), quindi il condizionatore si spegne, la temperatura riscende fino al minimo (20°C) e il condizionatore si riaccende.
Un pulsante disattiva e attiva il condizionatore (come al punto precedente) e la condizione è visualizzata sul display in qualche modo (lampeggiante). Le due temperature continuano ad essere visualizzate
Documentarsi sul sito ufficiale, attenzionando anche la nota riportata: https://www.arduino.cc/reference/en/language/functions/communication/wire/
Per approfondire: https://www.unisalento.it/documents/20152/8193641/SLIDES+LEZIONE+6+Dispensa+I2C+Interface.pdf/b1566d79-b022-cb1d-10a1-1b52e225e63e?version=1.0&download=true
Comprendere il seguente esempio: https://www.tinkercad.com/things/ksfidlZ3TeO-copy-of-i2c-arduino
Una callback è una funzione che tu scrivi, ma che non chiami direttamente. Invece, la passi ad un’altra funzione o libreria, che la chiamerà automaticamente quando serve — cioè quando si verifica un certo evento.
Nel caso della comunicazione I2C, quando usi:
Wire.onReceive(receiveEvent);
stai dicendo:
“Quando il master invia dei dati a questo dispositivo, esegui la funzione receiveEvent().”
Quindi, receiveEvent() è la callback.
Tu dichiari la funzione receiveEvent(int bytes).
Poi la registri con Wire.onReceive(receiveEvent);
Non la chiami mai direttamente.
Quando il master invia dati, la libreria Wire la chiama automaticamente.
Le callback su Arduino non sono vere interruzioni hardware, ma comportamenti gestiti in background da una libreria.
La funzione callback deve essere veloce e leggera, perché blocca altre attività finché non è completata.
Wire.onReceive() receiveEvent() Quando arrivano dati I2C
Wire.onRequest() requestEvent() Quando il master chiede dati
attachInterrupt() interruptHandler() Quando cambia lo stato di un pin
Ticker / Timer lib timerCallback() Dopo un certo intervallo di tempo
Bounce (bottoni) buttonPressed() Quando un bottone viene premuto (debounced)
Comprendere il seguente esempio: https://logicaprogrammabile.it/comunicazione-tra-arduino-tramite-i2c/
Progettare un antifurto con due schede Arduino: una gestisce un sensore PIR, l'altra un allarme (buzzer). Le due schede comunicano tramite I2C. Simulare due casi:
la scheda sensore è master
la scheda sensore è slave
Ha un LED collegato.
Ha una funzione di callback (receiveEvent()) che:
legge un comando inviato dal master (es. 0, 1, 2)
in base al comando:
0 → spegne il LED
1 → accende il LED
2 → imposta una variabile per far lampeggiare il LED nel loop()
Il loop() dello slave non è vuoto! Se il comando ricevuto è 2, fa lampeggiare il LED ogni mezzo secondo.
Ha tre pulsanti:
uno per accendere il LED
uno per spegnerlo
uno per farlo lampeggiare
Ogni pulsante invia il valore corrispondente (1, 0, 2) via I2C allo slave.
Si dispone di due schede Arduino Uno. La scheda A visualizza su un display lcd i valori di temperatura inviati dalla scheda B tramite comunicazione I2C. La scheda ricevente attiva un allarme se la temperatura supera una soglia predefinita.
funzioni di Arduino utilizzabili
Progettare con Arduino un sistema che utilizzi:
Due pulsanti
Due LED
Un ingresso analogico (es. un potenziometro o un sensore)
Funzionamento richiesto:
Il primo pulsante serve per impostare una soglia di riferimento:
Quando viene premuto, Arduino legge il valore analogico attuale e lo memorizza come "soglia".
Il secondo pulsante serve per resettare la soglia a un valore di default (ad esempio metà scala: 512).
In ogni momento Arduino deve leggere continuamente il valore del sensore analogico:
Se il valore supera la soglia memorizzata, si deve accendere il primo LED.
Se il valore è inferiore alla soglia, si deve accendere il secondo LED.
I due LED non devono mai essere accesi contemporaneamente.
Oltre al sw si richiede di disegnare lo schema elettrico in cui Arduino è un blocco in cui indicare soltanto i pin utilizzati.
Realizzare con Arduino un sistema di controllo per il livello di un liquido in un serbatoio (simulato da un sensore analogico, ad esempio un potenziometro).
Componenti richiesti:
Due pulsanti
Due LED
Un ingresso analogico
Funzionamento richiesto:
Il primo pulsante permette di salvare il valore attuale del livello del liquido come valore di riferimento "livello massimo consentito".
Il secondo pulsante permette di salvare un nuovo valore di riferimento "livello minimo di sicurezza".
Arduino deve continuamente leggere il valore analogico:
Se il livello è superiore al massimo salvato, si deve accendere il LED rosso (segnale di troppo pieno).
Se il livello è inferiore al minimo salvato, si deve accendere il LED giallo (segnale di livello basso).
Se il livello è compreso tra minimo e massimo, entrambi i LED devono rimanere spenti.
Non devono mai lampeggiare o accendersi contemporaneamente entrambi i LED.
Oltre al sw si richiede di disegnare lo schema elettrico in cui Arduino è un blocco in cui indicare soltanto i pin utilizzati.