Altro post tecnico e scacciafiga, ma a fini pucciosi

FotoProblema: non c’avevo abbastanza da fare.

Problema 2: i miei genitori hanno tre gatti, tre ciotole da riempire periodicamente di croccantini e acqua da rabboccare.

Soluzione: mi son messo di buzzo e ho realizzato un progetto che avevo in ponte da quando i gatti erano ancora due ma che era fallito per problemi meccanici: la NUTRIGATTI.

Come potete vedere dalla foto, la cupola sopra contiene non solo la circuiteria e i due selettori per i tempi, ma anche una presa per la fontanella a ricircolo che costruirò a brevissimo.

Come spero invece si capisce dallo schema qui sotto, il cuore della circuiteria è un Teensy , in quanto non c’è bisogno di aggiungere connettività WiFi, a questo progetto, ma avendolo appoggiato su una breadboard in miniatura invece che su uno stampato rende il circuito modificabile con pochissimo sforzo: sostituire il Teensy fritzingcon un Photon e aggiungere un comando via web sarebbe questione di qualche minuto e un paio di righe di codice.
Due moduli relay, convenientemente già optoisolati e alimentati dal Teensy, comandano direttamente un motore da girarrosto scelto per il basso numero di giri, la discreta potenza e l’alimentazione da rete e, attraverso la presa che si vede frontalmente alla cupola (un contenitore per alimenti dell’IKEA, che ho scoperto comodissimi per questi scopi), la pompa per l’acqua, una da acquario a 220V.

I due selettori dei tempi forniscono quattro selezioni dei due tempi, di alimentazione e di intervallo: ogni selettore mette a GND uno dei quattro piedini del Teensy preposti alla scelta di tempi preimpostati. Ovviamente i “fili” sono solo tre, in quanto uno dei tempi è già in “default” e corrisponde a un piedino non connesso alla sua posizione del Teensy; il cablarlo avrebbe solo fornito una “conferma” non necessaria.

nutrigatti sezioneIl lato meccanico, fallito alla prima mandata (costituita da una coclea da tritacarne che però talvolta sbriciolava i croccantini contro le pareti del contenitore) è costituito da una spazzola cilindrica per capelli mossa direttamente dal motore da girarrosto e resa solidale con un perno quadrato, nello specifico una vite a legno “grossa” fissata con resina da una parte e molata a sezione quadra dall’altra.. Risulta indifferente il senso di rotazione della spazzola stessa, in ogni caso i croccantini verranno spinti verso uno scivolo di metallo che, oltre a contenerli e indirizzarli verso la ciotola, produce uno scampanellìo inaspettato ma che potrebbe essere una sorta di “campanella del rancio” per i gatti che non ne sembrano infastiditi.

Questo il codice, non elegante ma funzionale:

#define RELAY1 21
#define RELAY2 20

int led = 11;

void setup()
{
// Initialise the Teensy data pins for OUTPUT
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(1, INPUT);
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(7, INPUT);
pinMode(8, INPUT);

// Serial.begin(38400);   Apre la comunicazione seriale, serviva per il debugging
}

void loop()
{

digitalWrite(1, HIGH);  //si settano tutti gli imput
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(led, HIGH);  //si comunica la funzionalità del Teensy

long time1 = 30000;  //20000 per 20 sec, in questo caso sono trenta secondi. Tempo in cui gira la spazzola
long time2 = 2400000; //1800000 per 30′, un cicloogni ora e mezzo. Tempo di pausa tra una “operazione” e l’altra.

// assegna la durata alimentazione – pin staccati 20sec
if (digitalRead(1) == LOW) (time1 = 30000 ); // 30sec – disconnesso da selettore
if (digitalRead(2) == LOW) (time1 = 60000 ); // 1 minuto
if (digitalRead(3) == LOW) (time1 = 90000 ); // 90sec
if (digitalRead(4) == LOW) (time1 = 120000 ); // 2 minuti

// assegna la durata pausa – pin staccati ogni 30min

if (digitalRead(5) == LOW) ( time2 = 2400000 ); // 40min – una volta ogni due circa – disc da selettore
if (digitalRead(6) == LOW) ( time2 = 3600000 ); // 1h – una volta ogni tre ore circa
if (digitalRead(7) == LOW) ( time2 = 4800000 ); // 1h20 una volta ogni quattro ore circa
if (digitalRead(8) == LOW) ( time2 = 7200000 ); // 2h una volta ogni sei ore circa

//Serial.println(digitalRead(1));   legge lo stato dei piedini e lo riporta sulla seriale. Serviva per il debug.
//Serial.println(digitalRead(2));
//Serial.println(digitalRead(3));
//Serial.println(digitalRead(4));
//Serial.println(digitalRead(5));
//Serial.println(digitalRead(6));
//Serial.println(digitalRead(7));
//Serial.println(digitalRead(8));
//Serial.println(time1);
//Serial.println(time2);

delay(5000); // Attende 5 seconds prima di iniziare tutto. Poi aziona i due relay.

digitalWrite(RELAY1,HIGH); // Turns ON Relays 1
digitalWrite(RELAY2,HIGH); // Turns ON Relays 2

delay(time1); // Attende time1, da 30sec a 2min

digitalWrite(RELAY1,LOW); // smette alimentazione dei croccantini

delay(90000); // Attende 90 seconds: la fontanella gira per un altro minuto e mezzo.

digitalWrite(RELAY2,LOW); // Turn Relay Off

delay(time2); // Wait time2 – da 30’ a 2h

digitalWrite(RELAY2,HIGH); // Turn ON Relay 2

delay(120000); // Wait 120 seconds: la fontanella gira per altri due minuti,

digitalWrite(RELAY2,LOW); // Turns Relay Off

delay(time2); // Attende time2 – da 30’ a 2h
delay(time2); // Attende time2 – da 30’ a 2h

}

Niente pulsanti di reset o di alimentazione manuale? No, perchè deve essere di facile utilizzo e comando: “Mamma, sfili la spina e la reinfili”. Niente display? Neppure, quattro più quattro scatti e una legenda scritta. Niente tempo reale? No, perchè? Non deve servire per fornire pranzi a ore precise, ma gli spuntini “poco e spesso” che servono ai gatti.

Ora si tratta di farla piacere ai miei, più che ai gatti.

Ah, costo totale, compreso Teensy, relays, motore da girarrosto, minuterie e connettori, e legno occasione IKEA: meno di trenta euro.
Un pomeriggio di lavoro, ma cos’è essere nerd se non trovare problemi sovraingenerizzati e costosi per problemi che non esistono?