Utente:Caldaia fotonica/Dispenser per mangime pesci con Arduino

Da Wikiversità, l'apprendimento libero.
Questa risorsa è stata scritta dagli studenti dell'Istituto ITIS "Enrico Mattei" di Urbino, della classe 3B/EN nell'a.s. 2021/2022, all'interno del corso di Sistemi Elettronici 1.

Per favore, prima di apportare modifiche, attendi sino alla fine dell'anno scolastico (termina il 30 giugno 2022) oppure contatta il docente di riferimento Giacomo Alessandroni nel caso venissero rilevati contenuti non in linea con le linee guida della comunità.

Se leggi questo avviso ad anno scolastico concluso puoi rimuoverlo.

laboratorio
laboratorio
Caldaia fotonica/Dispenser per mangime pesci con Arduino
Tipo di risorsa Tipo: laboratorio
Materia di appartenenza Materia: Sistemi Elettronici 1
Avanzamento Avanzamento: laboratorio completa al 25%

Dispenser per mangime pesci, questo progetto ha il fine di accendere e dare da mangiare ai pesci nel acquario ad un determinato orario ed di misurare la temperatura in esso.

Sensori e attuatori[modifica]

in questo progetto ho utilizzato: un modulo RTC che fornisce informazioni su data e orario otre a mesi, giorni e anni; il sensore di temperatura LM35; un servomotore e un relè.

Dispenser per pesci
Dispenser per pesci

Codice[modifica]

 
#include <Servo.h>                       //includo la libreria per il servo                         
#include <DS3231.h>                      //includo la libreria per il modulo RTC
DS3231  rtc(SDA, SCL);
Time t;
Servo myservo;
float temp;
int tempPin = 0;
int pos = 0;                             //definisco la posizione (pos) con 0 gradi
int giù = 5000;                          //definisco il tempo in cui il servo deve mantenere la posizione
int servo = 12;                          //definisco il pin del servo
int Relay = 10;                          //definisco il pin del relè
const int OnHour = 13;                   //setto le ore in cui svolgere un azione (ore  e secondi)
const int OnMin = 30;
const int OffHour = 23;                  //setto le ore in cui finisce un azione (ore  e secondi)
const int OffMin = 00;   

void setup() {
  Serial.begin(9600);
  myservo.attach(servo);
  rtc.begin();
  pinMode(Relay, OUTPUT);                 //metto il pin del relè come output
  digitalWrite(Relay, LOW);               //spengo il relè
}

void loop() {
  temp = analogRead(tempPin);             //leggo i dati
  temp = temp * 0.48828125;               //prendo i dati e li moltiplico così da ottenre la temperatura
  Serial.print("temperatura:");
  Serial.print(temp);                     //scrivo la temperatura sul monitor seriale
  delay(1000);
  
  t = rtc.getTime();                      //ricavo il tempo dal modulo
  Serial.print(t.hour);                   // scrivo ore e minuti sul MONITOR SERIALE
  Serial.print(" hour(s), ");
  Serial.print(t.min);
  Serial.print(" minute(s)");
  Serial.println(" ");
  delay (1000);
  
  if(t.hour == OnHour && t.min == OnMin){ //se le ore e minuti corrispondo con la sveglia esegue lazione
    for (pos = 0; pos <= 180; pos += 1) { //movimento del servomotore
    myservo.write(pos);
    delay (giù);
        for (pos = 180; pos >= 0; pos -= 1)//movimento contrario al primo
        myservo.write(pos);
    }
    digitalWrite(Relay,HIGH);             //relè acceso
    Serial.println("Sa");                 //scrivo servo acceso
    Serial.println("La");                 //scrivo luce acceso
    }
  else if(t.hour == OffHour && t.min == OffMin){ //invece se minuti ed ore corrispondono a quelle di fini azione spengono tutto
      digitalWrite(Relay,LOW);            //relè spento
      Serial.println("Ls");               //scrivo luce spento
    }
}

Espansioni suggerite[modifica]

Prossimamente andrò ad inserire un display così da visualizzare i dati, come temperatura e ora.