#include "HX711.h" #include #include #include #include #include #include #include #include // 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 }