#include <HX711.h>
#include <ESP32Servo.h>
#define SERVO_PIN 14 // ESP32 pin GPIO26 connected to servo motor
// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 5;
const int LOADCELL_SCK_PIN = 4;
const int LED_PIN = 2;
const int buttonPin = 0;
int lastButtonState; // the previous state of button
int currentButtonState; // the current state of button
float reading=0;
int lock=0;
int cs=0;
HX711 scale;
Servo servoMotor;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // set ESP32 pin to input pull-up mode
servoMotor.attach(SERVO_PIN, 500, 2400);
delay(1000);
servoMotor.write(0);
delay(1000);
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
}
void loop()
{
//+++++++++++++++++
//******
cs=0;
Serial.println("IV DRIP AUTOMATION");
digitalWrite(LED_PIN, HIGH);
Serial.println("Tare... remove any weights from the scale. Then press the button");
while(cs==0)
{
currentButtonState = digitalRead(buttonPin);
lastButtonState = currentButtonState; // save the last state
delay(100);
currentButtonState = digitalRead(buttonPin); // read new state
//Serial.println(currentButtonState);
if(lastButtonState == HIGH && currentButtonState == LOW)
{
Serial.println("cs1");
cs=1;
}
}
//******
digitalWrite(LED_PIN, LOW);
if (scale.is_ready())
{
// first time set scale balank i.e scale.set_scale()
// Then get the reading for a known weight
// calibration factor = reading / known weight
// scale.set_scale(INSERT YOUR CALIBRATION FACTOR);
scale.set_scale(420);
delay(1000);
scale.tare();
Serial.println("Tare done...");
digitalWrite(LED_PIN, HIGH);
servoMotor.write(90);
delay(2000);
Serial.println("HANG THE IV BOTTLE. THEN PRESS THE BUTTON");
cs=1;
while(cs==1)
{
currentButtonState = digitalRead(buttonPin);
lastButtonState = currentButtonState; // save the last state
delay(100);
currentButtonState = digitalRead(buttonPin); // read new state
//Serial.println(currentButtonState);
if(lastButtonState == HIGH && currentButtonState == LOW)
{
cs=2;
Serial.println("cs2");
digitalWrite(LED_PIN, LOW);
}
}
//Serial.print("Place a known weight on the scale...");
//delay(5000);
//reading = scale.get_units(10);
//Serial.print("Result: ");
//Serial.println(reading);
}
else {
Serial.println("HX711 not found.");
cs=100;
while(true)
{
digitalWrite(LED_PIN, HIGH);
delay(2000);
digitalWrite(LED_PIN, LOW);
delay(1000);
}
}
//+++++++++++++++++
lock=0;
while(cs==2)
{
Serial.print("reading...");
delay(3000);
reading = scale.get_units(10);
Serial.print("Result: ");
Serial.println(reading);
if (reading<=0.20 && lock==0)
{
lock=1;
servoMotor.write(180);
delay(1000);
cs=3;
Serial.println("IV drip locked");
}
delay(1000);
}
currentButtonState = digitalRead(buttonPin);
while(cs==3 && currentButtonState == HIGH )
{
digitalWrite(LED_PIN, HIGH);
delay(500);
digitalWrite(LED_PIN, LOW);
delay(500);
currentButtonState = digitalRead(buttonPin);
}
servoMotor.write(0);
delay(2000);
digitalWrite(LED_PIN, HIGH);
}