Prezzemolo!

Era da un po’ di tempo che avevo in mente di creare una piattaforma “tiny” multiuso che impiegasse un ATtiny...ed è nato “prezzemolo”. Condivido il mio lavoro a beneficio di quanti ne possano essere interessati.

Beh non ho di certo inventato niente di nuovo, si tratta di una piccola piattaforma basata sul microcontrollore ATtiny85 che consente, opportunamente programmata, di svolgere operazioni di controllo che prevedano l’accensione di un utilizzatore.
Il punto essenziale di prezzemolo è che esso, grazie alle sue ridotte dimensioni (solo 50x37mm), può trovare agevolmente collocazione praticamente dappertutto, ad esempio all’interno di una cassetta di derivazione presente nell’impianto elettrico e di conseguenza può essere la giusta soluzione in tutte quelle occasioni nelle quali si prevede l’azionamento di un dispositivo funzionante a rete 230V (max 1000W) secondo una logica controllata.
Ecco una foto del prototipo.
Dopo un accurato collaudo ho fatto qualche piccola modifica allo schema per cui la versione attuale è “leggermente” differente da quella nella foto.

Esempi di applicazione possono essere:

  • Interruttore crepuscolare (fotoresistenza): può essere collegato all’impianto luci esterne di un edificio per regolare la loro accensione/spegnimento secondo soglie programmate.
  • Rilevazione movimento crepuscolare (PIR + fotoresitenza): può accendere le luci di un ambiente solo in presenza di qualcuno e solo se l’illuminazione ambientale scende sotto una certa soglia.
  • Lampeggiatore a frequenza regolabile
  • Temporizzatore luce scale
  • Attivazione di un carico con ritardo: Tipica applicazione di questo genere è il motore dell’autoclave che in caso di blackout della rete elettrica, durante il successivo ripristino potrebbe subire danneggiamenti a causa delle brusche variazioni della tensione di rete durante la fase di “assestamento”.
    Queste sono solo le prime applicazioni che ho già scritto per “prezzemolo”, ma praticamente potrebbe trovare impiego (e posto) dappertutto…proprio come il suo nome suggerisce :slight_smile:

Per ottenere una dimensione cosi contenuta (50x37mm) è stato necessario rinunciare al classica alimentazione con trasformatore e relativo stabilizzatore di tensione; il dispositivo, infatti, in questo caso viene alimentato direttamente dalla tensione di rete 230V AC sfruttando la reattanza capacitiva di un condensatore (quello blu nella foto), la tensione è poi stabilizzata tramite uno zener da 5,1V 1W. La corrente erogata è di circa 30mA, sufficiente per alimentare ATtiny85, un LED di segnalazione e l’optoisolatore che comanda il Triac (BTA06 400V).
L’optoisolatore è un comune fototriac MOC3063 che ha al suo interno un circuito di rilevamento dello “zero crossing” garantendo la commutazione del triac solo durante il passaggio dello “zero” di rete e limitando così i disturbi introdotti dalla commutazione. E’ presente, comunque, anche una piccola rete snubber.

Prezzemolo ha tre ingressi disponibili, essi possono essere impiegati come ingressi o uscite, una delle quali è anche utilizzabile come ingresso analogico. Questo permette di collegare al dispositivo componenti quali pulsanti, fotoresistenze, PIR e sensori di temperatura. Inoltre è possibile usare i tre ingressi come dip switch per settare impostazioni.
Ecco una foto con un sensore mini PIR e la fotoresistenza durante la prova dello sketch “Rilevazione di movimento crepuscolare

Nonostante la semplicità dello schema elettrico, la sua realizzazione NON è assolutamente consigliabile a coloro che sono ancora alle prime armi con l’elettronica. Si ha a che fare, infatti, direttamente con la tensione di rete 230V ed è quindi un circuito potenzialmente pericoloso, ragione per la quale NON pubblicherò lo schema elettrico e il relativo assemblaggio.
Dato, comunque, che non ho problemi a rendere pubblico il mio lavoro, se qualcuno fosse interessato alla realizzazione pubblicherò lo schema ma solo dopo l’autorizzazione del moderatore del forum e/o il benestare degli “anziani” :slight_smile:

Il codice delle applicazioni, invece, posso pubblicarlo da subito...ma nel post seguente, perchè qui ho già esaurito il limite di lunghezza disponibile :slight_smile:

*** INTERRUTTORE CREPUSCOLARE ***

/* 
 * ** PREZZEMOLO ** APPLICAZIONE #1: INTERRUTTORE CREPUSCOLARE + LUCE TEMPORIZZATA
 * ==================================================================================
 * Hardware: - Fotoresistenza collegata su ANALOG1 con resistenza da 10K verso GND (R4 nello schema)
 *           - Pulsante collegato su SENS1 (SWITCH) lato GND.
 *
 * Interruttore crepuscolare. Due funzionalità:
 * 1) Accende il carico quando la luce ambientale diminuisce sotto la soglia minima e 
 *    lo spegne quando la luce aumenta oltre la sogla massima.
 * 2) Premendo il pulsante si ottiene l'accensione temporizzata del carico (1 min)
 *
 * FUNZIONAMENTO ESCLUSIVO COME LUCE TEMPORIZZATA
 * Se si vuol far funzionare il dispositivo solo come "luce temporizzata" (ad esempio per 
 * utilizzarlo come temporizzatore per luce scala) inserire un jumper in ANALOG1 verso Vcc.
*/  
#define LED           3    // fpin 2
#define TRIAC         4    // fpin 3
#define SWITCH        0    // fpin 5 (ingresso SENS1)
#define ANALOG1       1    // fpin 7
#define LOAD_ON       PORTB &= ~(1 << DDB4)            // Attuatore ACCESO (uscita stato logico LOW)
#define LOAD_OFF      PORTB |= (1 << DDB4)             // Attuatore SPENTO (uscita stato logico HIGH)
#define LED_ON        PORTB |= (1 << DDB3)             // LED ACCESO
#define LED_OFF       PORTB &= ~(1 << DDB3)            // LED SPENTO
#define LED_TOGGLE    PORTB ^= (1 << DDB3)             // LED TOGGLE

#define PHOTOR_PORT              1
#define PHOTOR_TIME            100                     // Tempo di refresh per la lettura della fotoresistenza (ogni 100 mS)
#define PHOTOR_NUM_READ          4                     // Numero di letture prima di fare la media (ogni 4 letture calcola la media)
#define PHOTOR_TRESHOLD_LIGHT   50                     // Soglia per alta luminosità: valori da 1 a 99
#define PHOTOR_TRESHOLD_DARK    20                     // Soglia per bassa luminosità: valori da 1 a 99
#define SWITCH_TIME          60000                     // Durata del pulsante temporizzato (2 min)

unsigned long current_PHOTOR;                          // contatore riservato alla temporizzazione della fotoresistenza
byte PHOTOR_value;                                     // valore corrente MEDIO della fotoresistenza
int PHOTOR_read;                                       // valore letto dalla porta e totalizzato x la media
byte PHOTOR_counter_media;                             // contatore per numero di letture prima della media
boolean PHOTOR_flag;                                   // indica se si sono superati i valori di soglia (True=Buio, False=Luce)

boolean SWITCH_flag;                                   // on/off pulsante accensione temporizzata
unsigned long current_SWITCH;                          // contatore riservato alla temporizzazione del pulsante
unsigned long current_LED;                             // contatore riservato alla temporizzazione del LED (lampeggio durante temporizzazione) 


void setup() {    
  pinMode(LED, OUTPUT);                                // Definisce Uscite:
  pinMode(TRIAC, OUTPUT);
  pinMode(SWITCH, INPUT);                              // ingresso Pulsante per luce temporizzata
  pinMode(ANALOG1, INPUT);                             // ingresso Fotoresistenza 
  digitalWrite(SWITCH, HIGH);                          // pull up per interruttore. E' attivo quando LOW
  digitalWrite(ANALOG1, LOW);                          // nessun pull up per fotoresistenza
  LOAD_OFF;                                            // attuatore SPENTO
  lamp(10);                                            // esegue 5 lampeggi del LED per segnalare inizializzazione effettuata.
  delay(1000);                                         // attende un secondo...
}  
  
void loop() {  

  /* Gestione della fotoresistenza */
   if ( (millis() - current_PHOTOR) > PHOTOR_TIME ) {
      current_PHOTOR = millis();
      PHOTOR_read += analogRead( PHOTOR_PORT );
      if (++PHOTOR_counter_media == PHOTOR_NUM_READ) {
         PHOTOR_counter_media = 0;
         // converte i valori della fotoresistenza tra 1=BUIO e 99=MAX LUCE
         PHOTOR_value = map(PHOTOR_read / PHOTOR_NUM_READ, 5, 1023, 1, 99);
         PHOTOR_read = 0;
         
        // controllo soglia di bassa luminosità: ACCENDE e stacca lampeggio
        if ( !SWITCH_flag && !PHOTOR_flag && (PHOTOR_value <= PHOTOR_TRESHOLD_DARK) ) {
            PHOTOR_flag = true;
            LOAD_ON;
            digitalWrite(LED, HIGH);
        }
        // controllo soglia: SPEGNE; solo se la linea non è occupata
        if ( !SWITCH_flag && PHOTOR_flag && (PHOTOR_value >= PHOTOR_TRESHOLD_LIGHT) ) {
            PHOTOR_flag = false;
            LOAD_OFF;
            digitalWrite(LED, LOW);
        }        
      }
   }
   
   /* ATTIVAZIONE PULSANTE LUCE TEMPORIZZATA.
      Dispositivo di debounce per disturbi nella linea elettrica:
      Il pulsante deve essere premuto per almeno 30ms, altrimenti
      viene scambiato per un disturbo della linea e non viene considerato.
      La pressione del pulsante causa un'accensione forzata temporizzata del carico(vedi SWITCH_TIME)
      Un pulsante dev'essere collegato su ingresso SENS1 */
   if (!SWITCH_flag && (digitalRead(SWITCH) == LOW)) {     // la pressione del pulsante deve durare almeno 20mS
     delay(30);                                            // aspetta 30 mS
     if ((digitalRead(SWITCH) == LOW)) {                   // Se il pulsante è ancora premuto allora...
       SWITCH_flag = true;                                 // abilita temporizzatore e disattiva gestione fotoresistenza
       PHOTOR_flag = false;                                // disattiva eventuale attivazione precedente della fotoresitenza
       LOAD_ON;                                            // ACCENDE attuatore
       current_SWITCH = millis();                          // prepara per la temporizzazione
       current_LED = millis();                             // prepara per il lampeggio
     }
   }
   
   // Controllo tempo di switch raggiunto
   if (SWITCH_flag) {
     if (millis() - current_SWITCH > SWITCH_TIME) {         // TEMPO RAGGIUNTO.
       SWITCH_flag = false;                                 // disabilita temporizzatore e riabilita gestione fotoresistenza
       LOAD_OFF;                                            // SPEGNE attuatore
       LED_OFF;                                             // SPEGNE LED
       delay(1000);                                         // aspetta un secondo prima di passare nuovamente alla gestione della fotoresistenza
     }
     else {                                                 // TEMPORIZZAZIONE IN CORSO...
        if (millis() - current_LED > 200) {                 // lampeggio del LED
          current_LED = millis();
          LED_TOGGLE;
        }
     }
   }  
}  

// Esegue n/2 lampeggi del LED
void lamp(byte n) {
  for (byte i=0; i<n; i++) {  
    LED_TOGGLE;
    delay(70);
  }
  LED_OFF;
}

Per chi fosse interessato posso pubblicare anche gli altri sketch...

Guarda, stavo per pubblicare lo stesso lavoro !!!
Ma ero dubbioso per il fatto che essendo alimentato dal 220, e' molto pericoloso in mani non esperte.

Io ho utilizzato un Atmega328, in attesa che arrivino gli Atmega8.
Ho collegato 4 triac ed ho tutti gli ingressi disponibili. (nessun opto)
Se mi avanza tempo, ci metto un ricevitore IR ed un IRF24L01.

Appropostto del tuo schema, hai detto che usi un condensatore .... mettici una resistenza in serie !
(pensa se lo colleghi l' alimentazione nel momento in cui l' onda e' nel punto piu' alto...)

Beh, la filosofia di prezzemolo si basa principalmente sul fatto che la basetta debba essere piccola abbastanza per entrare dentro le scatole di derivazione, e la destinazione d'uso è tipicamente "monouso": si programma la logica di comportamento si nasconde nell'impianto...e via!

Per l'alimentazione tranquillo...ho citato il condensatore solo per indicare il "principio di funzionamento", nella realtà ci sono due resistenze: una in parallelo al C e una in serie nell'altro ramo della AC in funzione di limitatore dei picchi di corrente :slight_smile:

Un consiglio dettato dall'esperienza: se usi TRIAC, disaccoppiare la parte di potenza con il circuito di gate è quasi un "must" per la salute di tutto il resto del circuito...se ti è mai capitato di mettere in corto accidentalmente il carico sai a cosa mi riferisco...e non c'è fusibile che tenga :-=)

Mi piace questo lavoro !
Bravo ! :wink:

Grazie :slight_smile:

Guarda, stavo per pubblicare lo stesso lavoro !!!
Ma ero dubbioso per il fatto che essendo alimentato dal 220, e' molto pericoloso in mani non esperte.

molto bello da parte tua, ma guarda che con una scossetta 220 non è mai morto nessuno, solo un sacco di paura!! :)) Te lo dice uno che ne ha prese davvero tante a partire da 14 anni :slight_smile:

bel lavoro e pubblica tranquillamente lo schema, interessa sicuramente a molti e va tranquillo, non siamo nel forum della barbie ]:smiley: di scosse sul 220 ne abbiamo prese e ne prenderemo ancora molte, servono a migliorare l'attenzione, nulla di piu' :wink:

Concordo con il pubblicare lo schema. E' meglio mettere un progetto funzionante che lasciare nel dubbio un utente inesperto che potrebbe invece fare seri danni cercando di "fare da sé".

Ok, pubblico il tutto.

Nel file zip allegato trovate:

  1. Schema elettrico formato JPG (realizzato con Kicad)
  2. File PDF del PCB dimensione 1:1. Basta stamparlo e procedere alla "stiratura" (io ho smesso di stirare...ora lascio fare alla laminatrice!!)
  3. File PDF della serigrafia dimensione 1:1
  4. Dato che ci sono due "ponticelli", inserisco anche un'altra visione della board che li evidenzia (colorati di rosso).

PREZZEMOLO.zip (221 KB)

reizel:
bel lavoro e pubblica tranquillamente lo schema, interessa sicuramente a molti e va tranquillo, non siamo nel forum della barbie ]:smiley: di scosse sul 220 ne abbiamo prese e ne prenderemo ancora molte, servono a migliorare l'attenzione, nulla di piu' :wink:

A giudicare dal tuo avatar, l'ultima scossa deve essere stata quasi letale :stuck_out_tongue_closed_eyes:

@ Dalubar: concordo anch'io sulla pubblicazione dello schema; hai dato le necessarie avvertenze e mi pare sia sufficiente.

@ acik: lo stesso vale per te, se ti va di condividere il tuo lavoro.

Faccio i miei complimenti ad entrambi, ottime idee, realizzabili e utili!

Note sullo schema elettrico:

  • A seconda delle applicazioni che si vogliono eseguire, R4 potrebbe anche non essere necessaria (vedi asterisco *).
    Nel caso si inserisca una fotoresistenza, invece, dovrà essere inserita.
  • R8, R9 e R10 sono da 1/2 W
  • R6 tende a scaldare un po' quindi conviene montarla leggermente sollevata dal pcb.
  • R3 è stata inserita per scaricare più velocemente C4 quando si toglie l'alimentazione.

Com'è scritto nello schema, è necessario rispettare FASE e NEUTRO nel collegamento dell'alimentazione. Allo scopo si può usare un semplice cercafase per individuare...la fase, appunto.

Qualche chiarimento: se alimenti tutto da 220V i + 5V da dove li tiri fuori? MI sarei aspettato ai capi dello zener D3 ma tu ci scrivi -5V, e questo riferimento poi lo trov anche sulla R che hai messo sul reset del micro, che dovrebbe essere una pull-up; sinceramente non capisco questa cosa, puoi chiarirmela? grazie.

Sarà un problema di visualizzazione del file jpg...io aprendolo con il semplice "visualizzatore foto di Windows" vedo chiaramente "+5V".

dalubar:
Sarà un problema di visualizzazione del file jpg...io aprendolo con il semplice "visualizzatore foto di Windows" vedo chiaramente "+5V".

Hai ragione, posto lo schema come lo vedo io all'apertura, ma se uso la lente per ingrandire appare il + invece del -, mah!

Già...scaricando la tua versione in effetti si vede chiaramente che nell'immagine mancano, oltre alla stanghetta verticale che forma il "+", diverse altre linee verticali (vedi connettori P1 e P2)... Scherzi della risoluzione JPG.

Posto la versione in PDF, cosi non dovrebbero esserci problemi.

Prezzemolo_schema.pdf (44 KB)

Bene, grazie, io intanto ho rimosso la mia immagine, meglio evitare possibili errori...

Ho provato a compilare il tuo sketch per l'uso "crepuscolare" , e proverò con una simulazione l'uso.
Posta anche gli altri sketch, se vuoi, così tutti possono apportare eventuali miglioramenti o spunti per altri usi.
Ottimo lavoro

ATTENZIONE, QUESTO PROGETTO E' PERICOLOSO. SCONSIGLIO A CHIUNQUE DI REALIZZARLO: NON MI ASSUMO NESSUNA RESPONSABILITA' IN CASO DI DANNI A PERSONE O COSE.
Il mio progetto e' minimalissimo.
Ridotto tutto all' osso per farlo stare in una "scatola" dell' impianto elettrico.
La millefori che ho realizzato qualche setimana fa misura 3cm x 6cm.

Eccolo qui:

CIAO

.

@acik:
non è pericoloso ponticellare con fili di rami scoperti? :sweat_smile: