Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Arduino-betriebene Wasserflasche

Komponenten und Verbrauchsmaterialien

SparkFun Arduino Pro Mini 328 - 5V/16MHz
× 1
Wasserdichter Ultraschallsensor
× 1
Echtzeituhr (RTC)
× 1
SparkFun 4-stellige 7-Segment-Anzeige mit gemeinsamer Kathode
× 1
Summer
× 1
SparkFun Drucktastenschalter 12 mm
× 1
Allzwecktransistor NPN
× 1
Li-Ionen-Akku 1000mAh
× 1
Adafruit USB-Li-Ionen-Akkuladegerät
× 1
Widerstand 221 Ohm
× 8
Widerstand 1k Ohm
× 4
Widerstand 4,75 kOhm
× 2

Notwendige Werkzeuge und Maschinen

Lötkolben (generisch)
Heißklebepistole (generisch)

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Einführung:

Ausreichend Wasser zu trinken ist sehr wichtig für unsere Gesundheit. Mehr Wasser zu trinken kann zu einer reineren Haut, einer besseren allgemeinen Gesundheit, einer verbesserten Produktivität und Gehirnfunktion, einem erhöhten Energieniveau und sogar einer Gewichtsabnahme führen.

In unserem geschäftigen Leben ist es wirklich schwer, sich daran zu erinnern, genug Wasser zu trinken. Und die meiste Zeit vergessen wir, genug Wasser zu trinken, egal ob zu Hause, im Büro oder unterwegs. Ungefähr 75 % der Amerikaner sind die ganze Zeit chronisch dehydriert.

Um eine gesunde Trinkgewohnheit aufzubauen, ist es also wichtig, Ihre Wasseraufnahme jeden Tag zu verfolgen.

Um meine Wasseraufnahme zu verfolgen, habe ich meine Wasserflasche mit Arduino intelligent gemacht. Es kann:

1. Verfolge meine tägliche Wasseraufnahme

2. Verfolgen Sie meine wöchentliche durchschnittliche Wasseraufnahme

3. Erinnere mich daran, Wasser zu nehmen

4. Verfolgen Sie die letzte Einnahmezeit

5. Mit einer einzigen Ladung mehr als einen Monat laufen.

RTC-Modul erstellen

Um Informationen zur Wasseraufnahme zu protokollieren oder zu verfolgen, müssen die aktuellen Zeit- und Datumsinformationen zusammen mit den gesammelten Daten gespeichert werden. Zur Bereitstellung der benötigten Informationen kann ein Real-Time Clock (RTC)-Chip wie DS1307 mit geeigneter Pufferbatterie verwendet werden. Der Programmierprozess des RTC-Chips (in Software) ist ebenfalls sehr einfach und wird in den meisten Programmierumgebungen unterstützt.

Hier ist das Design eines kompakten RTC-Moduls, basierend auf dem beliebten RTC-IC DS1307, für Ihre alltäglichen Mikrocontroller-Projekte. Die serielle Echtzeituhr (RTC) des DS1307 ist eine voll binär codierte Dezimaluhr/-kalender (BCD) mit geringem Stromverbrauch plus 56 Bytes NV-SRAM. Adresse und Daten werden seriell über einen bidirektionalen I2C-Bus übertragen. Die Uhr/der Kalender im 24-Stunden-/12-Stunden-Format bietet Sekunden, Minuten, Stunden, Tag, Datum, Monat und Jahr, einschließlich Korrekturen für das Schaltjahr.

Lassen Sie uns das Echtzeituhrmodul gemäß dem beigefügten Schaltplan erstellen. DS1307 RTC erfordert einen externen Quarz, um richtig zu funktionieren. Für den SCL- und SDA-Pin des ICs werden zwei Pull-Up-Widerstände benötigt. Der Wert des Widerstands kann etwa 2k bis 10k betragen. Ich habe 4,7k verwendet. Beim Löten habe ich versucht, das Modul so klein wie möglich zu halten, da der Platz für meine Schaltung begrenzt ist. Sie können DS3231 anstelle von DS1307 verwenden und der IC verfügt über einen internen Quarzoszillator. Sie müssen also keinen externen Kristall hinzufügen. Sie können auch ein fertiges kleines RTC-Modul kaufen, wenn Sie es nicht selbst herstellen möchten. Da das komplette System mit Batterie betrieben wird, habe ich den VBAT-Pin der RTC ohne Knopfzelle mit Masse verbunden.

Wichtige Pins von DS1307:

  • 5-V-Pin :Wenn dieser Pin hoch ist, sendet der ds1307 die Daten, und wenn er niedrig ist, läuft er auf der Backup-Knopfzelle.
  • GND :Dies ist der Erdungsstift für das Modul. Sowohl die Masse der Batterie als auch das Netzteil sind miteinander verbunden.
  • SCL :Es ist der I2C-Takt-Pin - der mit dem Mikrocontroller kommuniziert. Sollte mit dem Arduino SCL-Pin verbunden werden.
  • SDA :Es ist der I2C-Daten-Pin - der mit dem Mikrocontroller kommuniziert. Sollte mit dem Arduino SDA-Pin verbunden werden.
  • VBAT :Batterieeingang für jede Standard-3V-Lithiumzelle oder andere Energiequelle. Muss bei Nichtgebrauch geerdet werden.

Herstellung einer Sieben-Segment-Anzeigetafel

Für das Anzeigemodul hier habe ich ein eigenständiges, kompaktes Modul mit gemeinsamer Kathode verwendet, das vier numerische 7-Segment-LED-Anzeigen enthält, die sich gut zum Anzeigen numerischer Daten mit einigen einfachen Zeichen eignen.

Jedes Segment im Anzeigemodul ist gemultiplext, d. h. es teilt sich die gleichen Anodenanschlusspunkte. Und jede der vier Ziffern im Modul hat einen eigenen gemeinsamen Kathodenanschlusspunkt. Dadurch kann jede Ziffer unabhängig ein- oder ausgeschaltet werden. Außerdem macht diese Multiplexing-Technik die enorme Menge an Mikrocontroller-Pins, die zur Steuerung eines Displays erforderlich sind, auf nur elf oder zwölf (anstelle von zweiunddreißig)!

Die LED-Segmente des Displays benötigen Strombegrenzungswiderstände, wenn sie über einen 5 V-Logik-Pin gespeist werden. Der Widerstandswert liegt typischerweise zwischen 330 und 470 Ohm bei 5 V. Für den Betrieb mit Li-Ionen-Batterien kann er 220 Ohm betragen. Außerdem werden Treibertransistoren empfohlen, um die LED-Segmente mit zusätzlichem Treiberstrom zu versorgen, da jeder Pin eines Mikrocontrollers nur in der Nähe von 40 mA Strom liefern oder absenken kann. Wenn alle (sieben) Segmente des Displays gleichzeitig eingeschaltet werden (die Ziffer 8), überschreitet der Strombedarf diese 40-mA-Grenze. Das unten gezeigte Bild zeigt das grundlegende Schaltbild der Strombegrenzungswiderstände und Treibertransistoren.

Dieser 4-stellige 7-Segment-Anzeigeabschnitt ist um vier 7-Segment-LED-Anzeigen mit gemeinsamer Kathode und vier 2N2222-NPN-Transistoren herum verdrahtet. Die 1K-Widerstände dienen der Basisstrombegrenzung und die 220R-Widerstände begrenzen den Betriebsstrom der LED-Anzeigesegmente.

Auf der Arduino-Platine werden die digitalen Ausgänge von D10 bis D17 zum Ansteuern von Segmenten (a bis g &dp) und die digitalen Ausgänge D6 bis D9 für die Ziffern (D0-D3) der 4×7-LED-Anzeige verwendet.

Ein Tastenschalter wird mit dem Anzeigemodul hinzugefügt, um auf verschiedene Optionen zuzugreifen. Es wird auch verwendet, um das Arduino mit einem externen Hardware-Interrupt aus dem Ruhezustand zu wecken. Die Taste ist also mit dem Arduino-Digital-Pin #2 (INT0) verbunden.

Verbinden der Anzeigetafel mit Arduino Mini Pro

Gemäß dem Schema, das vor dem Löten aller Segmente mit dem Arduino-Mini-Pin bereitgestellt wird. Dann 4 gemeinsame Pins an den Kollektorpin des Transistors anlöten. Die Basen des Transistors sind mit dem Arduino-Pin verbunden. Nach dem Anschließen des Displays verbinden Sie den Taster mit dem Arduino Digital Pin 2 (INT 0). Stellen Sie sicher, dass Sie die Taste mit Arduino Pin 2 verbunden haben, da wir einen externen Hardware-Interrupt implementieren, um Arduino mit dieser Taste aus dem Ruhezustand zu wecken.

Anschließen von RTC-Modul und Summer

Verbinden Sie nun das RTC-Modul, das Sie zuvor erstellt haben, mit dem Arduino-Board. Der SDA-Pin des Moduls muss mit dem SDA (A4)-Pin des Arduino-Pins und der SCL-Pin des Moduls mit dem SCL (A5)-Pin des Arduino verbunden werden. Verbinden Sie dann den Summer mit dem Arduino-Board.

Anschlüsse:

RTC ------> Arduino Mini Pro

  • SDA ------> A4
  • SCL ------> A5
  • Summer ------> D3

Ultraschallsensor mit Flaschenverschluss anbringen

Machen Sie ein Loch in den Flaschenverschluss, wie im Bild gezeigt. Führen Sie vier Drähte des Ultraschallsensors durch das Loch und befestigen Sie den Ultraschallsensor in der Mitte des Flaschenverschlusses. Der Sensor muss an der Innenseite des Flaschenverschlusses angebracht werden und sollte sich in der Mittelposition befinden.

Anschlüsse:

Ultraschallsensor ------> Arduino Mini Pro

  • VCC ------> VCC
  • GND ------> GND
  • Trigger ------> D4
  • Echo ------> D5

Programm hochladen und testen

Nach Abschluss der gesamten Verbindung ist es der richtige Zeitpunkt, um das Programm auf das Arduino-Board hochzuladen und die Funktionalität zu testen. Sie benötigen mehrere Bibliotheken, damit das Programm ordnungsgemäß funktioniert. Für die Schaltflächenschnittstelle müssen Sie die OneButton-Bibliothek hinzufügen. Da das Gerät mit Batterie betrieben wird, ist der Stromverbrauch ein wichtiges Thema. Ich habe den Schlafmodus in meine Arduino-Skizze implementiert. Watchdog-Timer und externer Hardware-Interrupt wurden verwendet, um das Arduino aus dem Schlafmodus aufzuwecken. Arduino nimmt dreimal den Sensormesswert, mittelt ihn und berechnet die notwendigen Informationen und zeigt Informationen für 10 Sekunden an und geht dann für 1 Minute in den Schlafmodus. Es wacht jederzeit auf, wenn die Taste gedrückt wird, die mit INT0 (digitaler Pin 2) verbunden ist. Wenn Sie also die Informationen zu Ihrer Wasseraufnahme sehen möchten, drücken Sie einfach jederzeit die Optionstaste. Es wird für dich aufwachen. Ohne Tastendruck wird alle 1 Minute gelesen. Für die Implementierung des Schlafmodus habe ich die Arduino Low-Power-Bibliothek verwendet. Zum Lesen der Zeit vom DS1307 RTC-Modul habe ich die DS1307RTC-Bibliothek verwendet. Um das angehängte Programm zu kompilieren, fügen Sie also die gesamte Bibliothek zu Ihrer Umgebung hinzu.

Ich werde hier nur den Berechnungsalgorithmus kurz erläutern. Eine vollständige Skizze finden Sie in der beigefügten Füllung. Die Berechnung erfolgt aus dem Durchschnitt von fünf Sensormesswerten, um eine ausreichende Genauigkeit zu gewährleisten. Der tägliche Messwert wird nach 24 Stunden zurückgesetzt und für den neuen Tag für den neuen Tag vorbereitet.

Die durchschnittliche Wasseraufnahme wird aus dem Durchschnitt der täglichen Aufnahme der letzten sieben Tage berechnet. Wenn 2 Stunden ohne Wasseraufnahme vergangen sind, wird der Benutzer alle 15 Minuten mit einem doppelten Piepton alarmiert und stoppt für die nächsten 2 Stunden nach der Wasseraufnahme.

Laden Sie den beigefügten Code herunter und laden Sie ihn auf Ihren Arduino Mini Pro hoch. Schließen Sie alle Module an und schalten Sie sie ein, um zu testen, ob alle Komponenten richtig funktionieren oder nicht. Wenn das Display ein Ergebnis anzeigt, dann herzlichen Glückwunsch! Du hast die harten Dinge bereits getan.

Arduino mit Kronkorken reparieren

Mit Heißkleber befestigen Sie Arduino mini an der Oberseite des Flaschenverschlusses. Denken Sie daran, dass Sie alle Komponenten im Flaschenverschluss befestigen müssen. Fügen Sie genug Kleber hinzu, damit er fest am Flaschenverschluss haftet.

Anbringen des Akku- und Lademoduls

Befestigen Sie nun den Li-Ionen-Akku oben im Arduino. Seien Sie vorsichtig, wenn Sie die Batterie mit einem offenen Stift kurzschließen. Verbinden Sie dann das Lademodul mit der Kappe. Halten Sie den USB-Anschluss von der Außenseite leicht zugänglich, damit er problemlos mit dem Ladegerät verbunden werden kann.

Alle Schaltkreise wasserdicht machen

Nachdem Sie alle Komponenten und Module angeschlossen haben, ist es an der Zeit, unser Gerät vollständig wasserdicht zu machen. Dies ist sehr wichtig, da es sich um eine Wasserflasche handelt und jederzeit Wasser in den Kreislauf tropfen und den Kreislauf beschädigen kann. Um es vollständig wasserdicht zu machen, fügen Sie in jedem äußeren Teil der Schaltungen ohne den USB-Anschluss genügend Klebstoff hinzu. Sie können die Kappe mit Klebstoff schön machen, um sie bei der Originalkappe rund zu machen.

Versenke den Kronkorken nicht im Wasser.

Viel Spaß damit

Code

  • Arduino-Skizze
Arduino-SkizzeArduino
// Datums- und Uhrzeitfunktionen mit einer DS1307 RTC, die über I2C und Wire lib verbunden ist#include #include #include #include #include " LowPower.h"#include "OneButton.h"OneButton button(2, true);const byte interruptPin =2;volatile int state =0;const int trigPin =4;const int echoPin =5;int piezoPin =3;const int digit[4] ={9,6,7,8};int digit_value[4];int digit_value1[4];int button_press_count =1;const int segment[8] ={16,10,12,14,15, 17,11,13};konstante Bytenummer[10][8] ={{1,1,1,1,1,1,0,0}, //0 {0,1,1,0,0, 0,0,0}, //1 {1,1,0,1,1,0,1,0}, //2 {1,1,1,1,0,0,1,0}, / /3 {0,1,1,0,0,1,1,0}, ///4 {1,0,1,1,0,1,1,0}, //5 {1,0,1 ,1,1,1,1,0}, //6 {1,1,1,0,0,0,0,0}, //7 {1,1,1,1,1,1,1 ,0}, //8 {1,1,1,1,0,1,1,0}}; //9konstantes Byte d[8] ={0,1,1,1,1,0,1,1};konstantes Byte a[8] ={1,1,1,0,1,1,1,1 };konstantes Byte r[8] ={0,0,0,0,1,0,1,1};konstantes Byte t[8] ={0,0,0,1,1,1,1,1 };int Sekunden, Minuten, Stunden;int water_in_ounch[15];int water_intake_ounch[15];int water_intake_days[7];int water_intake_times =0;int previous_water_amount =0;int total_water_intake_today =0;int mean_intake_last_week =0; . inatke_day =1;float Average_water_level =0; // Durchschnitt mehrerer Messwerte speichernint water_amount_in_ounce =0; // berechnete Wassermenge speichernint Idle_time =0;int Intake_day =1;int previous_value =0;void setup () { Serial.begin (9600); pinMode (interruptPin, INPUT_PULLUP); // Geben Sie Ihren Setup-Code hier ein, um ihn einmal auszuführen:for(int i=6; i<=17; i++) pinMode(i, OUTPUT); pinMode (trigPin, AUSGANG); pinMode (echoPin, EINGANG); button.attachClick(gedrückt); button.attachDoubleClick(Doppelklick); button.attachLongPressStart (longPressStart); button.attachDuringLongPress(longPress);}long previous_state =millis();int count =1;int daily_intake =0;intweek_intake =0;long sleep_time =millis();void loop() { read_time(); button.tick(); // Beobachte weiter die Druckknöpfe:Berechnung(); daily_intake =total_water_intake_in_day(); wöchentliche_einnahme =durchschnittliche_wasser_einnahme_letzte_woche(); if(button_press_count ==1){display_d(); display_number (tägliche_intake); aufrechtzuerhalten. Sonst if(button_press_count ==2){display_a(); display_number (wöchentliche_intake); aufrechtzuerhalten. Sonst if(button_press_count ==3){display_r(); display_number (water_amount_in_ounce); aufrechtzuerhalten. Sonst if (button_press_count ==4) {display_first_2 (Stunden); display_last_2 (Minuten); } if(idle_time>=120){alert(); Alarm(); } if((millis() - sleep_time)>=15000{display_off(); attachInterrupt(digitalPinToInterrupt(interruptPin), leer, FALLING); LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); detachInterrupt(digitalPinToInterrupt(interruptPin)); sleep_time =millis(); } }void display_digit(int digit){ for(int i=0; i<8; i++){ digitalWrite(segment[i], number[digit][i]); } }void display_number(int number){int i=0; while(Zahl>0){ digit_value[2-i] =Zahl%10; Zahl =Zahl/10; i++; } digitalWrite (Ziffer[1], HIGH); digitalWrite (Ziffer [2], LOW); digitalWrite (Ziffer [3], LOW); display_digit(digit_value[0]); Verzögerung(5); digitalWrite (Ziffer [1], LOW); digitalWrite (Ziffer [2], HIGH); digitalWrite (Ziffer [3], LOW); display_digit(digit_value[1]); Verzögerung(5); digitalWrite (Ziffer [1], LOW); digitalWrite (Ziffer [2], LOW); digitalWrite (Ziffer [3], HIGH); display_digit(digit_value[2]); Verzögerung(5); digitalWrite (Ziffer [3], LOW); digit_value[0] =0; digit_value[1] =0; digit_value[2] =0; }void display_first_2 (int number) { digitalWrite (Ziffer [2], LOW); digitalWrite (Ziffer [3], LOW); int i=0; while(Zahl>0){ digit_value[1-i] =Zahl%10; Zahl =Zahl/10; i++; } digitalWrite (Ziffer [0], HOCH); digitalWrite (Ziffer [1], LOW); display_digit(digit_value[0]); Verzögerung(3); digitalWrite (Ziffer [0], LOW); digitalWrite (Ziffer[1], HIGH); display_digit(digit_value[1]); Verzögerung(3); }void display_last_2 (int number) { digitalWrite (digit[0], LOW); digitalWrite (Ziffer [1], LOW); int i=0; while(Zahl>0){ digit_value1[1-i] =Zahl%10; Zahl =Zahl/10; i++; } digitalWrite (Ziffer [2], HOCH); digitalWrite (Ziffer [3], LOW); display_digit(digit_value1[0]); Verzögerung(3); digitalWrite (Ziffer [2], LOW); digitalWrite (Ziffer [3], HIGH); display_digit(digit_value1[1]); Verzögerung(3); }void display_d () { digitalWrite (digit [0], HIGH); for(int i=0; i<8; i++){ digitalWrite(segment[i], d[i]); } Verzögerung(5); digitalWrite (Ziffer [0], LOW); }void display_a () { digitalWrite (digit [0], HIGH); for(int i=0; i<8; i++){ digitalWrite(segment[i], a[i]); } Verzögerung(5); digitalWrite (Ziffer [0], LOW); aufrechtzuerhalten. Void display_r () { DigitalWrite (Ziffer [0], HIGH); for(int i=0; i<8; i++){ digitalWrite(segment[i], r[i]); } Verzögerung(5); digitalWrite (Ziffer [0], LOW); aufrechtzuerhalten. Void display_t () { DigitalWrite (Ziffer [0], HIGH); for(int i=0; i<8; i++){ digitalWrite(segment[i], t[i]); } Verzögerung(5); digitalWrite (Ziffer [0], LOW); }void display_off () { digitalWrite (digit [0], LOW); digitalWrite (Ziffer [1], LOW); digitalWrite (Ziffer [2], LOW); digitalWrite (Ziffer [3], LOW); for(int i=0; i<8; i++){ digitalWrite (segment[i], LOW); } Verzögerung(5); }void read_time() { tmElements_t tm; if (RTC.read(tm)) { Sekunden =tm.Second; Minuten =tm.Minute; Stunden =tm.Stunde; } }int distance_in_cm(){ lange Dauer, cm; // Der Sensor wird durch einen HIGH-Impuls von 10 oder mehr Mikrosekunden ausgelöst. // Vorher einen kurzen LOW-Puls geben, um einen sauberen HIGH-Puls zu gewährleisten:digitalWrite(trigPin, LOW); VerzögerungMikrosekunden(2); digitalWrite (trigPin, HOCH); VerzögerungMikrosekunden(10); digitalWrite (trigPin, LOW); // Lesen Sie das Signal vom Sensor:ein HIGH-Impuls, dessen // Dauer die Zeit (in Mikrosekunden) vom Senden // des Pings bis zum Empfang seines Echos von einem Objekt ist. Dauer =pulseIn(echoPin, HIGH); // die Zeit in eine Distanz umrechnen cm =microsecondsToCentimeters(duration); zurück cm; }long microsecondsToCentimeters(long microseconds) {// Die Schallgeschwindigkeit beträgt 340 m/s oder 29 Mikrosekunden pro Zentimeter. // Der Ping wandert hin und zurück. Um die Entfernung des // Objekts zu ermitteln, nehmen wir die Hälfte der zurückgelegten Entfernung. Mikrosekunden zurückgeben / 29 / 2; }Void Alert () { Ton (PiezoPin, 2000, 50); Ton (PiezoPin, 2000, 200); // Verzögerung (10); aufrechtzuerhalten. Leerzeichen () {//Ton (PiezoPin, 2000, 100); //state++;}// Diese Funktion wird aufgerufen, wenn die Taste1 1 Mal gedrückt wurde (und kein 2. Tastendruck folgte).void gedrückt() { //Serial.println("Taste 1 Klick."); button_press_count++; Alarm(); if(button_press_count ==5){button_press_count =1; }} // click// Diese Funktion wird aufgerufen, wenn die Taste 1 innerhalb eines kurzen Zeitraums zweimal gedrückt wurde.void doubleclick() { Serial.println("Button 1 doubleclick.");} // doubleclick// Diese Funktion wird wird einmal aufgerufen, wenn button1 lange gedrückt wird.void longPressStart() { Serial.println("Button 1 longPress start");} // longPressStart// Diese Funktion wird oft aufgerufen, während button1 gedrückt wird eine lange Zeit.void longPress () { Serial.println ( "Button 1 longPress ..."); water_intake_ounch[water_intake_times - 1] =0; // letzten Wert ignorieren} // LongPressvoid-Berechnung () { float water_level =0; // Füllstand in jedem Schritt speichern Int read_value =0; // Sensorablesung in cm lesen für (int i =0; i <5; i ++) {// nehmen Sie fünf Messwerte read_value =distance_in_cm (); if(read_value>16 || read_value<3){// instabile Leserückgabe; // zurück zur aufrufenden Funktion, weil das Lesen instabil ist} else if(read_value<=16 &&read_value>=3){//gültiger Wert water_level =water_level + read_value; } Verzögerung(10); } Average_water_level =17 - water_level/5; // Durchschnitt aus fünf Messwerten ermitteln, 17 =Botole-Höhe water_amount_in_ounce =int (average_water_level * 1,87);//16 cm Wasserstand =30 ounch if (water_intake_times==0) ​​{ previous_water_amount =water_amount_in_ounce; water_intake_times =1; } if((water_amount_in_ounce  previous_water_amount){//Wasser wird nachgefüllt //Wasser hier nachfüllen previous_water_amount =water_amount_in_ounce; aufrechtzuerhalten. Sonst if (water_amount_in_ounce ==previous_water_amount) {//kein Wasser verbraucht oder Leerlaufzeit + 1 auffüllen; } if(hours==23 &&minutes==59){// ein Tag ist vorbei und alle Werte beginnen bei null für den neuen Tag for(int i=0; i<15; i++){ water_intake_ounch[i] =0; } water_intake_times =0; Aufnahmetag++; if(intake_day==8){intake_day =1; } }}int total_water_intake_in_day () {//Berechnung der gesamten Wasseraufnahme an einem Tag total_water_intake_today =0; for(int i=0; i 

Schaltpläne


Herstellungsprozess

  1. Rasenregner
  2. Geschirrspüler
  3. Wasserpistole
  4. Toilette
  5. Feuerhydrant
  6. Isolierte Flasche
  7. Wasser
  8. Shampoo
  9. Trockenbau
  10. MOSMusic