Trink-Erinnerer mit Arduino

Untersetzer mit Trinkerinnerung

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);
    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

  1. Guten Abend,
    Schon mal fröliches neues Jahr wünsche ich Ihnen.
    Zum Projekt, ich habe kleine Sorgen.
    Musste zuerst den Befehl „int blinkCount = 0;“ einfügen, sonnst gabs Probleme.
    Der Glazzähler funktionniert, aber die blau LEDs bleiben ständig an wenn ich das 5V Spannung anschiesse bevor ich das Glas draufsetze.
    Sie bleiben ständig aus wenn ich das Glas draufmache bevor ich die 5V Spannung draufgeben
    Kennen mich im Programmieren nicht aus, muss ich halt mal dran.
    Oder mache ich da irgendwas flasch !

    1. Hallo Eric, die Variable blinkCount im loop war tatsächlich nicht deklariert und noch Überbleibsel von anderen Features. Hab den Code korrigiert. Danke für die Info! Hast Du RGB-LEDs mit gemeinsamer Anode oder Kathode? Ich kann den Fehler nicht erkennen – müsste ich nochmals nachstellen.

  2. Wow viel Arbeit aber die Idee ist echt genial. Ich merke selber wie ich täglich zu wenig trinke, das könnte eine schöne Lösung sein 🙂

Schreibe einen Kommentar

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