Alkomat jest to uogólnioną nazwą dla urządzeń służących do pomiaru zawartości alkoholu we krwi na podstawie próbki powietrza. Alkomat można oczywiście kupić, a czemu nie zbudować samemu ?
Do tego projektu wykorzystam prosty czujnik alkoholu MQ3. Jest to czujnik półprzewodnikowy zdolny do wykrywania obecności alkoholu w powietrzu w stężeniach od 0,05 mg/L do 10 mg/L. Sam czujnik wykorzystuje reakcję chemiczną do określenia poziomu alkoholu, a podstawowym elementem wykrywającym w tym czujniku jest SnO2. Jak na czujnik półprzewodnikowy posiada w miarę wysoką czułość na alkohol i dobrą odporność na zakłócenia powodowane przez dym, jednak nie aż tak dobrą jak czujniki elektrochemiczne. Wadą czujnika MQ-3 jest fakt czasu nagrzewania, w oficjalnych dokumentacji jest mowa o 24h. Jednak z moich obserwacji wygrzewanie które ustawiłem w kodzie czyli 30000ms czyli 30s jest wystarczający. Nie mówimy tu oczywiście o wynikach dowodowych, gdyż ten czujnik nie bardzo się do tego nadaje. Jednak do potrzeb domowych raczej większości osób wystarczy.
Potrzebne komponenty:
- Arduino np. Nano
- Moduł MQ-3 (czujnik półprzewodnikowy)
- Ekran LCD 2 x 16,z modułem I2C
- Przewody połączeniowe
- Opcjonalnie płytka stykowa
Zapewne ktoś zaraz się oburzy, czemu nie zrobiłaś tego na ekranie OLED SSD1306 jest mniejszy itp. Najnormalniej w świece skończyły się w zapasach.
Specyfikacja czujnika alkoholu MQ-3
- Napięcie zasilania (Vc): 5 V
- Zakres wykrywalnego stężenia alkoholu: 0,04 mg/l ~ 10mg/l
- Temperatura pracy: -20°C do 50°C
- Temperatura przechowywania -20 do 70°C
- Czas nagrzewania: Ponad 24 godziny
- Wymiary modułu: 32,4 mm x 20,4 mm
- Regulacja czułości: Możliwość regulacji za pomocą potencjometru
Pełna nota katalogowa
Schemat połączenia
Połączenie modułu czujnika MQ-3
GND → GND
5V → 5 V
VIN → A0
Połączenie ekranu
GND → GND
VDD → 5 V
SCK → A5 (SCL)
SDA → A4 (SDA)
Co do samego kodu znajduje się poniżej, jednak dobrze by było o ile macie taką możliwość dokonać korekt kalibracyjnych. Jednak do tej czynności potrzebę były by wam ciecze wzorcowe. Jeżeli macie jakiś zaprzyjaźnimy serwis który wykonuje kalibracji to udajcie się do niego. W moim przypadku trzeba było co nie co korekt nanieść aby były wyniki prawidłowe a nie zawyżone.
Kod programu
Kod programu znajduje się poniżej
|
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 |
// by swistak tranzystor.pl // pobrano z www.tranzystor.pl #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F, 16, 2); const int MQ3_PIN = A0; // wstępna kalibracja, dobierz doświadczalnie const float MAX_PROMILE = 2.0; int zeroLevel = 0; byte znak_e[8] ={ B00000, B01110, B10001, B11111, B10000, B01110, B00010, B00001}; byte znak_s[8] ={ B00001, B01110, B10000, B10000, B01110, B00001, B11110, B00000}; void setup() { Serial.begin(9600); lcd.init(); lcd.backlight(); lcd.createChar(1, znak_e); lcd.createChar(2, znak_s); lcd.setCursor(0, 0); lcd.print("Tranzystor.pl"); lcd.setCursor(0, 1); lcd.print(""+String("\2")+"wistak"); delay(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wst"+String("\1")+"pna"); lcd.setCursor(0, 1); lcd.print("Kalibracja..."); delay(30000); long suma = 0; for (int i = 0; i < 100; i++) { suma += analogRead(MQ3_PIN); delay(20); } zeroLevel = suma / 100; Serial.println("=== MQ-3 ==="); Serial.print("Poziom zerowy ADC: "); Serial.println(zeroLevel); lcd.clear(); } void loop() { int adc = analogRead(MQ3_PIN); int correctedADC = adc - zeroLevel; if (correctedADC < 0) { correctedADC = 0; } float promile = ((float)correctedADC / (1023.0 - zeroLevel)) * MAX_PROMILE; if (promile < 0.01) { promile = 0.0; } float voltage = adc * (5.0 / 1023.0); // LCD lcd.setCursor(0, 0); lcd.print("Dmuchnij..."); lcd.setCursor(0, 1); lcd.print(promile, 3); lcd.print(" o/oo "); lcd.print(" "); // PORT SZEREGOWY Serial.print("ADC="); Serial.print(adc); Serial.print(" ZERO="); Serial.print(zeroLevel); Serial.print(" U="); Serial.print(voltage, 2); Serial.print("V PROM="); Serial.print(promile, 2); Serial.println(" o/oo"); delay(500); } |

