This shows you the differences between two versions of the page.
|
iothings:proiecte:2022sric:voltmeter [2023/06/01 21:50] eduard.olteanu1505 [Electronic schema] |
iothings:proiecte:2022sric:voltmeter [2023/06/01 23:40] (current) eduard.olteanu1505 |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ==== Voltmeter ==== | + | ==== Voltmeter with Esp32 ==== |
| Author: Olteanu Eduard-Florin | Author: Olteanu Eduard-Florin | ||
| ===== Introduction ===== | ===== Introduction ===== | ||
| + | |||
| + | The main focus of this project is to be able to accurately measure low-voltage batteries in order to determine whether or not they are still functional. | ||
| + | |||
| + | Additionally, the user can save the values in a database in order to be easier to remember or review the values at a later time and not measure them again. | ||
| ===== Hardware Description ===== | ===== Hardware Description ===== | ||
| Line 12: | Line 16: | ||
| * 16x2 I2C LCD | * 16x2 I2C LCD | ||
| * Push Button | * Push Button | ||
| + | * Multimeter cables | ||
| * Wires | * Wires | ||
| * Breadboard | * Breadboard | ||
| Line 18: | Line 23: | ||
| {{ :iothings:proiecte:2022sric:schematic_voltmetru.png?500 |}} | {{ :iothings:proiecte:2022sric:schematic_voltmetru.png?500 |}} | ||
| - | } ===== Software Description ===== | ||
| - | ===== Demo ===== | + | ===== Software Description ===== |
| + | The libraries used are: | ||
| + | <code> | ||
| + | #include <Adafruit_ADS1X15.h> | ||
| + | #include <WiFi.h> | ||
| + | #include <LiquidCrystal_I2C.h> | ||
| + | #include <Arduino.h> | ||
| + | #include <Firebase_ESP_Client.h> | ||
| + | </code> | ||
| + | |||
| + | Communication between the ESP 32 and both the ADS1115 and the LCD screen is done through the I2C protocol. | ||
| + | The button is connected to the GPIO4 pin and is used as a trigger to store in database the value read by the AIN0 pin from the ADS1115. | ||
| + | |||
| + | WiFi connection: | ||
| + | <code> | ||
| + | WiFi.begin(WIFI_SSID, WIFI_PASSWORD); | ||
| + | Serial.print("Connecting to Wi-Fi"); | ||
| + | while (WiFi.status() != WL_CONNECTED){ | ||
| + | Serial.print("."); | ||
| + | delay(300); | ||
| + | } | ||
| + | Serial.println(); | ||
| + | Serial.print("Connected with IP: "); | ||
| + | Serial.println(WiFi.localIP()); | ||
| + | Serial.println(); | ||
| + | </code> | ||
| + | |||
| + | Firebase connection: | ||
| + | <code> | ||
| + | /* Assign the api key (required) */ | ||
| + | config.api_key = API_KEY; | ||
| + | |||
| + | /* Assign the RTDB URL (required) */ | ||
| + | config.database_url = DATABASE_URL; | ||
| + | |||
| + | /* Sign up */ | ||
| + | if (Firebase.signUp(&config, &auth, "", "")){ | ||
| + | Serial.println("ok"); | ||
| + | signupOK = true; | ||
| + | } | ||
| + | else{ | ||
| + | Serial.printf("%s\n", config.signer.signupError.message.c_str()); | ||
| + | } | ||
| + | |||
| + | /* Assign the callback function for the long running token generation task */ | ||
| + | config.token_status_callback = tokenStatusCallback; //see addons/TokenHelper.h | ||
| + | |||
| + | Firebase.begin(&config, &auth); | ||
| + | Firebase.reconnectWiFi(true); | ||
| + | </code> | ||
| + | |||
| + | Voltage measurement: | ||
| + | <code> | ||
| + | adc0 = ads.readADC_SingleEnded(0); | ||
| + | delay(10); | ||
| + | volts0 = ads.computeVolts(adc0); | ||
| + | |||
| + | lcd.clear(); | ||
| + | lcd.setCursor(0, 0); | ||
| + | lcd.print("ADC0:"); | ||
| + | lcd.print(adc0); | ||
| + | lcd.setCursor(0, 1); | ||
| + | lcd.print(volts0); | ||
| + | lcd.print("V"); | ||
| + | </code> | ||
| + | |||
| + | Storing the value in the database: | ||
| + | <code> | ||
| + | // read the state of the switch/button: | ||
| + | currentState = digitalRead(BUTTON_PIN); | ||
| + | if ((lastState == LOW && currentState == HIGH) && Firebase.ready() && signupOK) { | ||
| + | sendDataPrevMillis = millis(); | ||
| + | Serial.print ("time: "); | ||
| + | Serial.println (sendDataPrevMillis); | ||
| + | |||
| + | entry_path = path + "/" + String(sendDataPrevMillis); | ||
| + | |||
| + | // Write an Float number on the database path test/float | ||
| + | if (Firebase.RTDB.setFloat(&fbdo, entry_path , volts0)) { | ||
| + | Serial.println("PASSED"); | ||
| + | Serial.println("PATH: " + fbdo.dataPath()); | ||
| + | Serial.println("TYPE: " + fbdo.dataType()); | ||
| + | } | ||
| + | else { | ||
| + | Serial.println("FAILED"); | ||
| + | Serial.println("REASON: " + fbdo.errorReason()); | ||
| + | } | ||
| + | } | ||
| + | lastState = currentState; | ||
| + | </code> | ||
| + | We use millis to store the value in order not to overwrite already known values. | ||
| + | |||
| + | ==== Problems and Improvements ==== | ||
| + | * One problem that I could not fix is the noise the ADS1115 is getting when reading, even if there is nothing measured the pin reads 0.9V, but that doesn't impact measurements. | ||
| + | * An improvement could be to add some other form of identification for the batteries when stored in the database. | ||
| + | * Another improvement could be to have a phone application that manages the database for the batteries and also that communicates with the ESP32. | ||
| + | |||
| + | ===== Results ===== | ||
| + | The main use-case of this project is to measure the voltage of batteries. | ||
| + | |||
| + | {{ :iothings:proiecte:2022sric:20230601_225009.jpg ?700 |}} | ||
| + | |||
| + | {{ :iothings:proiecte:2022sric:20230601_225034.jpg?700 |}} | ||
| + | We can see that the value is pretty accurate, only 0.01 error delta. | ||
| - | ===== Conclusion ===== | + | Also, if the button is pressed the value is stored in the database. |
| + | {{ :iothings:proiecte:2022sric:database_batteries.png?700 |}} | ||
| ===== Bibliography===== | ===== Bibliography===== | ||
| - | * [[https://ocw.cs.pub.ro/courses/iothings/laboratoare/2022/lab3]] | + | * [[https://ocw.cs.pub.ro/courses/iothings/laboratoare/2022/lab4]] |
| + | * [[https://how2electronics.com/how-to-use-ads1115-16-bit-adc-module-with-esp32/]] | ||
| + | * [[https://github.com/mobizt/Firebase-ESP-Client]] | ||
| + | * [[https://github.com/adafruit/Adafruit_ADS1X15]] | ||