Trink-Erinnerer mit Arduino

Trink mehr!

Zu wenig trinken ist nicht gesund. Daher habe ich einen kleinen Trinkerinnerer gebastelt. Ist keine neue Idee – so etwas wird in unterschiedlichen Ausführungen angeboten. Aber wieso kaufen wenn man es auch selbst bauen kann?

Funktion

Immer wenn ein Glas darauf gestellt wird, startet ein Timer. Nach 30 Minuten werden die LEDs blau und ein Piep ertönt. Reagiert man nicht, blinkt es nach 45 Minuten. Und für die ganz Vergesslichen ist noch ein Zähler der getrunkenen Gläser integriert! Da ich das nur fürs Büro brauche, kommt der Strom einfach per USB. Ein- und Ausschalten geht dann einfach übers Notebook.

Bauteile

  • Arduino Nano
  • Micortaster mit Lasche (wurde umgebogen)
  • Microtaster
  • RGB-LEDs mit entsprechenden Widerständen für Blau und Grün
  • Minilautsprecher aus einem alten Telefon
  • Fürs Gehäuse ein Stück Hartholz, Plexiglas, Schrauben und Filz

Schaltplan

Code

Ich hatte nur RGB-LEDs mit gemeinsamer Anode (+) was eher unüblich ist und kein Problem darstellt, aber den Code etwas unleserlich macht. Daher hier der bereinigte, grundlegenden Code.

/* 
 *  Trinkerinnerer
 *  Erinnert nach 30 min ans Trinken
 *  Version 1.0 / Juni 2021
 *  Mike Unckel / www.unckel.de
 */

// Pins setzen
const int LED_BLUE[]  = {2, 4, 6, 8};
const int LED_GREEN[] = {3, 5, 7, 9};

const int BUTTON_GLASS = 12;
const int BUTTON_MODE = 10;

const int SPEAKER = 11; // PWM-Pin

// Timer-Variablen
unsigned long interval = 30; // in min.
unsigned long previousMillis = 0;
unsigned long currentMillis;

// Gläser-Zähler
int glassCount = 0;

// Pieps-Zähler
int beepCount = 0;

void setup() {

  // Umrechnung min in ms
  interval *= 60000;

  pinMode(BUTTON_GLASS, INPUT_PULLUP);
  pinMode(BUTTON_MODE, INPUT_PULLUP);

  pinMode(SPEAKER, OUTPUT);

  // LEDs und Taster initiieren
  for (int i = 0; i < 4; i++) {
    pinMode(LED_GREEN[i], OUTPUT);
    digitalWrite(LED_GREEN[i], LOW);
    pinMode(LED_BLUE[i], OUTPUT);
    digitalWrite(LED_BLUE[i], LOW);
  }

  // Start-Animation/Sound
  for (int i = 0; i < 4; i++) {
    tone(SPEAKER, 500*i+6000, 35);
    digitalWrite(LED_GREEN[i], HIGH);
    delay(35);
    digitalWrite(LED_GREEN[i], LOW);
    delay(35);
  }
}


void loop() {
  
  currentMillis = millis();
  
  // Alarm wenn Zeit um
  if (currentMillis - previousMillis > interval) {
    alarm(HIGH);
  }

  // Alarm rücksetzen sobald Glas aufgestellt wird
  if (digitalRead(BUTTON_GLASS) == HIGH) {
    alarm(LOW);
    blinkCount = 0;
    previousMillis = currentMillis;

    beepCount = 0;
  }

  // Gläser-Zähler (LOW = gedrückt da Pullup)
  if (digitalRead(BUTTON_MODE) == LOW) {
    
    glassCount++;
    if (glassCount > 4) {
      glassCount = 0;
    }
    glasses(glassCount);
    
    delay(250); // Entprellung
  }
    
  delay(10);
}


void alarm(bool state) {

  // Grün (Gläser-Zähler) aus wenn Blau (Alarm) an
  if (state) {
    for (int i = 0; i < 4; i++) {
      digitalWrite(LED_GREEN[i], LOW);
    }
  }
  else {
    for (int i = 0; i < glassCount; i++) {
      digitalWrite(LED_GREEN[i], HIGH);
    }
  }

  // Blaue LEDs an/aus
  for (int i = 0; i < 4; i++) {
    digitalWrite(LED_BLUE[i], !state);
    delay(35);
  }
}


// Gläser-Zähler
void glasses(int cnt) {

  for (int i = 0; i < 4; i++) {
    digitalWrite(LED_GREEN[i], LOW);
  }
  
  for (int i = 0; i < cnt; i++) {
    digitalWrite(LED_GREEN[i], HIGH);
  }
}

Verbesserungen

Statt des Micortasters mit Lasche, was nicht gerade schön aussieht und auch eine gewisse Höhe des Gehäuses mit sich bringt, könnte man unsichtbar einen Drucksensor verwenden. Da entstehen dann schnell weitere Ideen wie die Messung des Gewichts usw… Schick wäre auch anstatt des kleinen Microtasters zur Gläserzählung ein unter dem Holz versteckter Touchtaster. Und die vier RGB-LEDs könnte man natürlich gegen schicke Neopixel u.ä. tauschen. Aber man muss es ja nicht gleich übertreiben 🙂

Noch ein paar Bilder

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.