Differences

This shows you the differences between two versions of the page.

Link to this comparison view

iothings:proiecte:2023sric:alcoholbreath [2024/05/30 08:33]
dumitru_razvan.dinu
iothings:proiecte:2023sric:alcoholbreath [2024/05/30 08:38] (current)
dumitru_razvan.dinu
Line 49: Line 49:
 {{:​iothings:​proiecte:​2023sric:​app_mob.png?​450|}} {{:​iothings:​proiecte:​2023sric:​app_mob.png?​450|}}
  
 +
 +<​code>​
 +#include <​DHT.h>​
 +#include <​Wire.h>​
 +#include "​BluetoothSerial.h"​
 +#include <​LiquidCrystal.h>​
 +
 +
 +#define MQ3_PIN 35
 +#define DHT_PIN 4
 +#define DHT_TYPE DHT11
 +#define BUZZER_PIN 14 
 +
 +#define rs 16
 +#define E 17
 +#define D4 18
 +#define D5 19
 +#define D6 21
 +#define D7 22
 +#define V0 23
 +
 +LiquidCrystal lcd(rs, E, D4, D5, D6, D7);
 +
 +BluetoothSerial SerialBT;
 +DHT dht(DHT_PIN,​ DHT_TYPE);
 +
 +char received;
 +const float RL = 10.0;   
 +const int NUM_READINGS = 100;  ​
 +const int COLLECTION_PERIOD = 10000;  ​
 +
 +float R0;
 +
 +bool startCollection = false;
 +
 +void setup() {
 +  SerialBT.begin("​ESP32_Alcohol_Test"​);​
 +  Serial.begin(115200);​
 +  pinMode(MQ3_PIN,​ INPUT);
 +  pinMode(BUZZER_PIN,​ OUTPUT);
 +  digitalWrite(BUZZER_PIN,​ LOW);
 +  dht.begin();​
 +
 +  lcd.begin(16,​ 2);
 +  lcd.print("​Initializing..."​);​
 +
 +  pinMode(V0, OUTPUT);
 +  analogWrite(V0,​ 100);
 +}
 +
 +void loop() {
 +  if (SerialBT.available()) {
 +    received = SerialBT.read();​
 +    if (received == '​C'​) { 
 +      R0 = calibrateMQ3();​
 +    } else if (received == '​S'​) {
 +      startCollection = true;
 +    }
 +  }
 +
 +  if (startCollection) {
 +    collectAndSendSensorData();​
 +    startCollection = false;
 +  }
 +}
 +
 +float calibrateMQ3() {
 +  R0 = readRS();
 +  Serial.print("​R0 in clean air: ");
 +  Serial.print(R0);​
 +  Serial.println("​ kOhm"​);​
 +
 +  lcd.clear();​
 +  lcd.print("​Calibrated"​);​
 +
 +  SerialBT.println("​Ready to use!"​);​
 +  return R0;
 +}
 +
 +float readRS() {
 +  long totalReadings = 0;
 +
 +  for (int i = 0; i < NUM_READINGS;​ i++) {
 +    totalReadings += analogRead(MQ3_PIN);​
 +    delay(100);  ​
 +  }
 +
 +  int avgReading = totalReadings / NUM_READINGS;​
 +  float sensorVoltage = avgReading * (3.3 / 4095.0);  ​
 +  float RS = ((3.3 * RL) / sensorVoltage) - RL;       
 +
 +  return RS;
 +}
 +
 +void collectAndSendSensorData() {
 +  digitalWrite(BUZZER_PIN,​ HIGH);
 +  float temperature = dht.readTemperature();​
 +  float humidity = dht.readHumidity();​
 +
 +  Serial.println("​temperature: ​ " + String(temperature));​
 +  Serial.println("​humidity: ​ " + String(humidity));​
 +  ​
 +  float mq3_value = readRS();
 +
 +  if (isnan(temperature) || isnan(humidity)) {
 +    Serial.println("​Failed to read from DHT sensor!"​);​
 +    return;
 +  }
 +  ​
 +  float alcohol_concentration;​
 +
 +  float dif = R0 - mq3_value;
 +
 +  if (dif < 2) {
 +   ​alcohol_concentration = 0;
 +  } else {
 +    float compensated = dif / (1 + (0.02 * (temperature - 20)) + (0.05 * (humidity - 65)));  ​
 +    alcohol_concentration = calculateAlcoholConcentration(compensated);​
 +      Serial.println("​compensated: ​ " + String(compensated));​
 +
 +  }
 +  ​
 +  Serial.println("​R0: ​ " + String(R0));​
 +  Serial.println("​Mq-3: ​ " + String(mq3_value));​
 +  Serial.println("​dif: ​ " + String(dif));​
 +  ​
 +
 +  String alcohol_concentration_str = "​Alcohol Concentration:​ " + String(alcohol_concentration) + " mg/L";
 +
 +  Serial.println(alcohol_concentration_str);​
 +
 +  lcd.clear();​
 +  lcd.print(String(alcohol_concentration) + " mg/​L"​);​
 +
 +  SerialBT.println(alcohol_concentration_str);​
 +  digitalWrite(BUZZER_PIN,​ LOW);
 +
 +}
 +
 +float calculateAlcoholConcentration(float ratio) {
 +  float m = 45;  ​
 +  float b = -0.77; ​  
 +  double alcohol_ppm = (log10(ratio) - b) / m ;  ​
 +  double alcohol_mg_per_l = alcohol_ppm * 1.25; 
 +  return alcohol_mg_per_l;​
 +}
 +</​code>​
  
 ===== Mod de functionare ===== ===== Mod de functionare =====
iothings/proiecte/2023sric/alcoholbreath.1717047183.txt.gz · Last modified: 2024/05/30 08:33 by dumitru_razvan.dinu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0