Tropfenzähler für Tropfflaschen
|
Automatischer Medikamentendosierer für Tropfen Funktionsweise
Tropfflasche wird ohne Deckel in die Klemme vertikal befestigt.
Auf die Waage soll ein Becher platziert werden. Ber Becher kann bereits etwas Wasser beinhalten. Bei meiner Ausführung passen sogar standard Trinkbecher 0,2 Liter.
Dann soll mittels Drehgeber die benötigte Anzahl der Tropfen eingestellt werden.
Nach dem Betätigung des Startbuttons wird die Medikamentenflasche mit Arzneimittel automatisch durch den Servomotor gekippt.
Flüssige Medikament tropft in das Bescher. Beim eintreffen der Tropfen ertönt ein Piepton und der Zählerstand auf der Anzeige ändert sich.
Wenn der zählerstand auf “0” wechselt dreht das Servo die Tropffläschchen um.
Damit ist die Dosierung abgeschlossen.
Neues Dosieren des Medikamets kann durch Betätigung des Startbuttons initialisiert werden.
Vorführung video
Schaltplan
Buteile kosten 12€
- Waage Max Gewicht 200g, Auflösung 0,01g - 3,25€
- HX711 Messverstärker - 0,80€
- Arduino Nano - 1,80€
- Servo Klassisch 9g SG90 -1,50€
- Rotary Encoder -1€
- Display 1,3 "OLED 128X64 3,32€
- Gesamt 11,67€ Alles vom AliExpress
Die Messmethode
Alle Arten der Tropfenzähler, die ich im Internet gesehen habe, basieren auf einer Lichtschranke. Der Tropfen überquert ein Lichtstrahl. Diese Unterbrechung des auf den Sensor anfallendes Lichts wird dann detektiert. Der Nachteil diese Methode besteht darin dass, der Tropfer sehr genau positioniert werden soll, sonst fallen die Tropfen an den Lichtstrahl vorbei. Der vorteil solchen Tropfenzählern ist die Störsicherheit und Zählgeschwindigkeit.
Ich habe mir eine andere Messmethode ausgedacht. Die Flüssigkeit im Becher wird gewogen. Genauer gesagt änderung des Gewichts wird registriert. Ich vermute,das ich der erste bin, der auf diese Idee kam. Ich habe nichts über solche Tropfenzähler / Dosierer im Internet gefunden. Der große Vorteil diese Art des Tropfen Zählen liegt daran, dass die Tropfen können an beliebiger stelle auf die Waagschale eintreffen. Die Tropfflasche muss nicht genau positioniert werden, und kann sogar von Hand gehalten werden. Es gibt aber 2 Nachteile dieser Messmethode. Messung kann vom Vibration des Tisches oder durch Luftzug gestört werden. Die Arzneimittel Tropfen wiegen sehr wenig und die Waage ist entsprechend sehr feinfühlig. Die Tropfgeschwindigkeit darf 5 Tropfen pro Sekunde nicht überschreiten. Diese Begrenzung entsteht dadurch, dass der Messwandler HX711 etwa 10 mal pro Sekunde misst. Um erschütterungen zu ignorieren, sollen pro Tropfen mindestens 2 Messungen durchgeführt werden.
Tropfen mit HX711 wiegen
Die Rohdaten vom HX711 Messverstärker sehen so aus. Die daten wurden über Arduino IDE Serieller Plotter visualisiert.
Hier sehen Sie das wiegen von 4 Tropfen
Die Waage
Ich habe mir die Waage über Aliexpress für 3,25€ bestellt. Max Gewicht 100g, Auflösung 0,01g. Angekommen war aber die Waage mit Max Gewicht 200g mit gleicher Auflösung.
Meine Experimente haben gezeigt dass der HX711 Modul nicht an USB 5V angeschlossen werden darf. So produzir das HX711 Waage Modul zuviel Rauschen in der Messung. Gute Ergebnisse lieferte das HX711 Modul bei der Einspeisung mit einem Akku für 3,7V. Aber ich wollte nur eine Stromquelle benutzen. Das Vin Eingang der Arduino Nano liefert die Spannung von 4,3V ( Freilaufdiode in Spannungsregler )
Quellcode Sketch
Voreinstellungen:
Am Anfang des Sketches werden Pins an jeweilige Hardware zugewiesen. Nur bei Adafruit SH1106 Bibliothek sind die I2C pins bereits vordefiniert das sind A4->SDA, A5->SCL.
Eigentlich ist ein Text-Display gar nicht nötig, eine 7-Segment-Anzeige mit TM1637 Chip wie bei Besucherzähler hätte es auch getahn.
In der Variable “Neigung” wird eingestellt ob die Tropfflasche gerade (180) oder schräg (150) gehalten soll. Randtropfer ohne das Belüftungsröhrchen sollen schräg (150) stehen. Zentraltropfer gerade (180).
In der Variable “rauschen” sollen minimale Gewichtsänderung die als Tropfen erkannt werden eingestellt. Dieses Wert soll das Rauschen der Messwerte übersteigen, sonst werden falsch Auslösungen gemacht. Hier das Sketch zur bestimmung des Rauschen der Messwerte.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
#include "HX711.h" #include <Servo.h> #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SH1106.h> #include <Fonts/FreeSans12pt7b.h> #include <Fonts/FreeMonoBold24pt7b.h> #include <RotaryEncoder.h> // HX711 Pins const int LOADCELL_DOUT_PIN = 2; // Waage DOUT const int LOADCELL_SCK_PIN = 3; // Waage SCK #define SERVO_PIN 4 // Servo #define PIEZO_PIN 5 // Piezo #define Start_PIN A1 // Button RotaryEncoder encoder(A2, A3); #define FilterFaktor 0.5 // running average Filter Einstellung int Neigung=180; // 150 einstellen für Randtropfer oder wenn zu schnell int rauschen=100; // Minimale Gewichtsänderung die als Tropfen erkannt werden soll long reading, val_f; int i, Tropfen; Adafruit_SH1106 display(-1); // Kein Reset Pin HX711 scale; Servo myservo; void setup() { pinMode(Start_PIN, INPUT_PULLUP); pinMode(PIEZO_PIN, OUTPUT); display.begin(SH1106_SWITCHCAPVCC, 0x3C); display.setFont(&FreeSans12pt7b); display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 18); display.println("Tropfen"); display.setCursor(0, 32 + 14); display.println("dosierer"); display.display(); Serial.begin(115200); Serial.println("HX711 Start"); myservo.attach(SERVO_PIN); // Servo in Startposition fahren myservo.write(0); delay(1000); myservo.detach(); scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN); delay(1000); reading = scale.read(); } // ende setup void loop() { Tropfen = 20; // Tropfenanzahl Voreinstellung encoder.setPosition(Tropfen); display.clearDisplay(); display.setFont(&FreeMonoBold24pt7b); display.setCursor(30, 32 + 12); display.println(Tropfen); display.display(); while (digitalRead(Start_PIN)) // Warte hier bis zu Betätigung des Startbuttons { encoder.tick(); // Rotary Encoder Abfrage int newPosition = encoder.getPosition(); // Rotary Encoder einlesen if (newPosition != Tropfen) // wenn neue Wert vom Rotary Encoder { Tropfen = newPosition; // auf dem Display anzeigen display.clearDisplay(); display.setCursor(30, 32 + 12); display.println(Tropfen); display.display(); } // ende neue Wert vom Rotary Encoder } // Start Knopf wurde betätigt delay(500); val_f = scale.read(); myservo.attach(SERVO_PIN); int pos = 0; for (pos = 0; pos <= Neigung; pos += 1) { myservo.write(pos); delay(10); } myservo.detach(); // Serwo macht Wibrationen deswegen delay(100); // 0,1s warten bis die Waage sich beruhigt while (Tropfen) // Solange Tropfenzähler meher als 0 ist { if (scale.is_ready()) // Nur wenn Waage bereit ist { reading = scale.read(); // Gewicht einlesen if (val_f < reading - rauschen) // gewicht mit vorherigem Mittelwert vergleichen { // nur wenn neue Wert um meher als Rauschen dann delay(100); // nach 0,1s messung wiederholen reading = scale.read(); // um Falschalarm durch Vibration auszuschlissen if (val_f < reading - rauschen) { tone(PIEZO_PIN, 1000); // Pieps starten val_f = reading ; Tropfen--; // Zähler für Tropfenrunterzählen display.clearDisplay(); // LCD Anzeige display.setCursor(30, 32 + 12); display.println(Tropfen); display.display(); } // ende Gewicht Bestätigung nach 0,1s } // ende Gewicht gestiegen, Tropfen erkannt val_f = reading * FilterFaktor + val_f * (1 - FilterFaktor); // mittelwert Filter } delay(100); // Messung nach 0,1s wiederholen noTone(PIEZO_PIN); // Pieps ausmachen } // ende Tropfenanzahl ist 0 Tropfen abgezählt myservo.attach(SERVO_PIN); // Servo einschalten for (pos = Neigung; pos >= 0; pos -= 1) // Tropfflasche aufrecht stellen { myservo.write(pos); delay(4); } myservo.detach(); display.clearDisplay(); display.setFont(&FreeSans12pt7b); display.setCursor(20, 32 + 6); display.println("Fertig!"); display.display(); while (digitalRead(Start_PIN)); // Hier stehen bleiben bis zu Betätigung des Startbuttons display.clearDisplay(); // Noch mahl Tropfenzählen display.setFont(&FreeSans12pt7b); display.setCursor(20, 32 + 6); display.println("Tariere"); display.display(); delay(1000); // warten damit die Hand vom Startbutton weg kommt val_f = scale.read(); // Mittelwert Startzustand einstellen } |
Verwendete bibliotheken:
https://github.com/bogde/HX711
https://github.com/mathertel/RotaryEncoder
https://github.com/wonho-maker/Adafruit_SH1106
Gleitender Mittelwert Filter
Erklärung für diese Zeile:
val_f = reading * FilterFaktor + val_f * (1 - FilterFaktor); // mittelwert Filter
reading - Eingangdaten - Blau
val_f - Ausgangdaten -Rot
Download Excel Datei zum ausprobieren verschiedener Eingangsdaten
Excel Simulation
Für Blinde
Dieses Gerät kann als Hilfsmittel für Menschen mit Blindheit und Sehbehinderung nützlich sein. Ich habe mir die Frage gestellt, wie dosieren und abmessen die Arzneimittel die Menschen die Blind sind.
Mein Tropfenzähler eignet sich hervorragend als Blindenhilfsmittel.
Es muss lediglich die steuerung der Vorwahl der Tropfenzahl geändert werden.
Statt des rotary encoders und des Displays sollen als Steuerelemente 2 Drehschalter (Stufen-Drehschalter) mit 12 Positionen verwendet werden. Die Positionen der Zahlen, wie bei der Uhr, ist leicht zu erraten.
Durch ertasten des Zeigerknopfs kann die aktuelle Einstellung der Anzahl der Tropfen abgelesen werden.