Search models, users, collections, and posts

fish feeder

Print Profile(1)

All
P1S
P1P
X1
X1 Carbon
X1E
A1
A1 mini
H2D
H2D Pro
H2S
P2S
H2C
X2D
A2L

0.2mm layer, 4 walls, 15% infill
0.2mm layer, 4 walls, 15% infill
Designer
3.1 h
1 plate

Open in Bambu Studio
Boost
8
17
0
1
16
3
Released 

Bill of Materials

Maker's Supply Kits and Parts
Select all
1 White 3030-LED Board with SH1.0 Connector 5V (2PCS) - KB002
List other parts
  • 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;
}

Comment & Rating (0)

(0/1000)

License

This user content is licensed under a Standard Digital File 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.