fish feeder
Print Profile(1)

Bill of Materials
- arduino nano x 1:
- battery 18650 x 1:
- stepper motor 28BYJ-48 x 1:
- led 3,5v x 1:
- switch on/of x 1:
Description
arduino code:
//mangiatoia pesci senza modalità risparmio energetico
#include <Stepper.h>
const int stepsPerRevolution = 2048; // Passi per un giro completo
const int stepsForPartialRevolution = stepsPerRevolution / 4; // 0.25 giri
const int motorPin1 = 6; // Pin per il motore
const int motorPin2 = 4;
const int motorPin3 = 5;
const int motorPin4 = 3;
const int ledPin = 13; // Pin del LED esterno
const float thresholdVoltage = 3.5; // Soglia di tensione in Volt
Stepper myStepper(stepsPerRevolution, motorPin1, motorPin2, motorPin3, motorPin4);
unsigned long previousFeedingMillis = 0; // Per tenere traccia del tempo per l'alimentazione
const unsigned long feedingInterval = 21593750; // Intervallo di alimentazione: 6 ore in millisecondi
const unsigned long voltageCheckInterval = feedingInterval; // Intervallo per il controllo della tensione = Intervallo di alimentazione
unsigned long previousVoltageCheckMillis = 0;
unsigned long previousLedMillis = 0; // Per il lampeggio del LED
const unsigned long ledInterval = 250; // Intervallo per il lampeggio del LED
bool ledState = LOW; // Stato attuale del LED
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600); // Inizializza la comunicazione seriale per la lettura della tensione
// Prima lettura della tensione e controllo del LED
float initialVoltage = readVcc();
Serial.print("Tensione iniziale di alimentazione: ");
Serial.println(initialVoltage);
if (initialVoltage < thresholdVoltage) {
digitalWrite(ledPin, HIGH); // Accende il LED se la tensione è sotto la soglia
}
// Primo ciclo di alimentazione: 1/4 giro
myStepper.setSpeed(10);
// Imposta la velocità del motore a 10 giri al minuto
myStepper.step(stepsForPartialRevolution);
// Spegne i pin del motore per risparmiare energia
disableStepper();
}
void loop() {
unsigned long currentMillis = millis();
// Controlla la tensione della batteria ogni ciclo
if (currentMillis - previousVoltageCheckMillis >= voltageCheckInterval) {
previousVoltageCheckMillis = currentMillis;
float supplyVoltage = readVcc();
Serial.print("Tensione di alimentazione: ");
Serial.println(supplyVoltage);
if (supplyVoltage < thresholdVoltage) {
digitalWrite(ledPin, HIGH); // Accende il LED se la tensione è sotto la soglia
} else {
digitalWrite(ledPin, LOW); // Spegne il LED se la tensione è sopra la soglia
}
}
// Operazioni del distributore automatico di cibo
if (currentMillis - previousFeedingMillis >= feedingInterval) {
previousFeedingMillis = currentMillis;
// Inizia a lampeggiare il LED
previousLedMillis = millis();
ledState = HIGH; // Accende il LED all'inizio del movimento
digitalWrite(ledPin, ledState);
// Esegui il movimento del motore a passi, lampeggiando il LED
for (int i = 0; i < stepsForPartialRevolution; i++) {
myStepper.step(1); // Esegui un passo del motore
// Durante ogni passo, controlla se è il momento di far lampeggiare il LED
if (millis() - previousLedMillis >= ledInterval) {
previousLedMillis = millis();
ledState = !ledState;
digitalWrite(ledPin, ledState);
}
}
// Spegne i pin del motore per risparmiare energia
disableStepper();
// Spegni il LED quando il motore ha terminato il movimento
digitalWrite(ledPin, LOW);
}
}
void disableStepper() {
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
}
float readVcc() {
// Configura il riferimento di tensione interno a 1.1V
ADMUX = (1 << REFS0) | (1 << MUX3) | (1 << MUX2) | (1 << MUX1);
delay(2); // Tempo per la stabilizzazione del riferimento interno
// Inizia la conversione ADC
ADCSRA |= (1 << ADSC);
while (bit_is_set(ADCSRA, ADSC)); // Attende il completamento
// Legge il valore del riferimento interno
uint16_t result = ADC;
// Calcola la tensione di alimentazione (Vcc) usando il valore ADC e il riferimento di 1.1V
float vcc = (1.1 * 1024.0) / (float)result;
return vcc;
}
License
You shall not share, sub-license, sell, rent, host, transfer, or distribute in any way the digital or 3D printed versions of this object, nor any other derivative work of this object in its digital or physical format (including - but not limited to - remixes of this object, and hosting on other digital platforms). The objects may not be used without permission in any way whatsoever in which you charge money, or collect fees.









Comment & Rating (0)