thenicktm
2015-06-12 17:25
Prima di intraprendere il mondo della chimica, alcune delle mie più grandi passioni erano l'informatica e l'elettronica, perciò un po di settimane fa decisi di combinare tutte le mie conoscenze per costruire un agitatore magnetico.
Dopo aver visto qualche video tutorial dove veniva usata una ventola come motore elettrico decisi di farlo anch'io. Mi riuscii subito ma non mi accontentai perchè le funzionalità dell'agitatore erano molto poche. Quindi misi su un progetto, tutto nella mia mente, e decisi di iniziare la parte elettronica ed informatica.
Vi allego alcune foto del progetto iniziale
Descrizione del funzionamento: grazie ad un potenziometro è possibile regolare il tempo di azionamento dell'agitatore magnetico, visualizzabile grazie ad un LCD 16X2. Una volta impostato il tempo e premuto il pulsante di avvio, il LED RGB inizia a lampeggiare molto velocemente da verde/rosso per indicare che il tutto è partito. Sulla sinistra si possono osservare 3 LED, rosso, giallo, verde che si accendono in funzione del tempo(ognuno quindi rappresenta il 33% del tempo totale). Una volta che l'agitatore ha terminato, un piezo elettrico (un comune speaker) emette un beep ad intervalli regolari di 1sec in contemporanea con il LED RGB rosso. E' possibile anche azionare il tutto senza obbligo di inserimento del tempo grazie ad uno switcher. Prossimamente sarà inserita la possibilità di regolare la velocità del motore elettrico( devo aspettare una ventola 120mm PWM), la possibilità di visualizzare la temperatura a cui l'agitatore magnetico sta operando e ci aggiungerò anche una piastra riscaldante ( che ancora non so dove trovare una resistenza elettrica capace di fare ciò).
Per il progetto iniziale ci ho messo la bellezza di 12 ore di una domenica (il giorno dopo mi è venuta la febbre e sono stato a casa 4 giorni ) più tutti i giorni successivi dove facevo upgrade e ne miglioravo il tutto. La parte più difficile è stata fare il codice perchè le funzioni standard non bastavano e grazie a 2 righe di un mio amico mi ha risolto il problema che mi affliggeva da tempo (in pratica non si riusciva a convertire i valori del potenziometro al tempo viste le differenze max di bit che operano i due). Ovviamente quando risolvevo la parte del codice mi si creavano problemi nell'hardware, quindi dovevo cercare di operare contemporaneamente sia nella parte elettronica che informatica (mi sentivo un po quantistico).
Una volta terminato il tutto procederò con lo sviluppo di un circuito stampato ed un adeguata struttura. Per chi volesse vedere il codice eccolo qua:
#include <LiquidCrystal.h>LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
unsigned long time;
int tasto = 15;
int led= 18;
int val = 0;
int vecchio_status = 0;
int stato = 0;
int rosso1 = 9;
int verde1 = 13;
int piezo = A5;
int notes[] = {294,349};
int rosso=6;
int giallo= 8;
int verde=7;
int potenziometro = A3;
long btnTime;
long m_timer;
void setup() {
lcd.begin(16, 2);
Serial.begin(9600);
pinMode(potenziometro, INPUT);
pinMode(tasto, INPUT);
pinMode(led, OUTPUT);
pinMode(rosso, OUTPUT);
pinMode(giallo, OUTPUT);
pinMode(verde, OUTPUT);
pinMode(rosso1, OUTPUT);
pinMode(verde1, OUTPUT);
btnTime = 0;
m_timer = 0;
}
void loop() {
lcd.clear();
val = digitalRead(tasto);
long prova = analogRead(A3);
long range = myMap(prova,0,1023, 1,60);
long range2 = myMap(range, 1, 60, 60000, 3600000);
digitalWrite(rosso1, HIGH);
digitalWrite(verde1, LOW);
lcd.setCursor(0, 0);
lcd.print("Imposta tempo";
lcd.setCursor(0,1);
lcd.print(range);
lcd.print(" min";
lcd.setCursor(10, 1);
if ((val == HIGH) && (vecchio_status == LOW)) {
digitalWrite(led, HIGH);
stato = 1;
m_timer = range2;
btnTime = millis();
delay(20);
}
vecchio_status = val;
if(stato == 1) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tempo:";
lcd.print(range);
lcd.print(" min";
lcd.setCursor(0,1);
lcd.print((millis()-btnTime)/1000);
//led in funzione del tempo
if ( (millis()-btnTime)> 0 && (millis()-btnTime)< m_timer/3 ){
digitalWrite(rosso, HIGH);
digitalWrite(giallo, LOW);
digitalWrite(verde, LOW);
digitalWrite(rosso1, LOW);
digitalWrite(verde1, HIGH);
}
if ((millis()-btnTime)> (m_timer/3) && (millis()-btnTime)< (m_timer/3)+(m_timer/3) ){
digitalWrite(rosso, HIGH);
digitalWrite(giallo, HIGH);
digitalWrite(verde, LOW);
digitalWrite(rosso1, LOW);
digitalWrite(verde1, HIGH);
}
if((millis()-btnTime)> (range2/3)+(range2/3) && (millis()-btnTime) <= range2 ){
digitalWrite(rosso, HIGH);
digitalWrite(giallo, HIGH);
digitalWrite(verde, HIGH);
digitalWrite(rosso1, LOW);
digitalWrite(verde1, HIGH);
}
//fine led
if(millis()-btnTime > m_timer) {
stato = 0;
digitalWrite(led, LOW);
digitalWrite(rosso, LOW);
digitalWrite(giallo, LOW);
digitalWrite(verde, LOW);
digitalWrite(rosso1, LOW);
digitalWrite(verde1, LOW);
for(int i=1; i<=4;i++){
digitalWrite(rosso1, HIGH);
tone(piezo, 350);
delay(1000);
digitalWrite(rosso1, LOW);
noTone(piezo);
delay(1000);
}
} else {
//viene eseguito finchè non finisce il tempo
}
}
delay(100);
}
long myMap(long v, long a, long b, long c, long d) {
return (long)(((float)(v-a))/((float)(b-a))*(d-c)+c);
}
Ecco invece una foto del circuito attuale (migliore rispetto al precedente):
Ed ecco finalmente il video : https://www.youtube.com/watch?v=vpgy5WWjeWg
Spero che qualcuno apprezzi il mio progetto
I seguenti utenti ringraziano thenicktm per questo messaggio: Mario, luigi_67, quimico, TrevizeGolanCz