Innehållsförteckning:

Arduino CO-monitor med MQ-7-sensor: 8 steg (med bilder)
Arduino CO-monitor med MQ-7-sensor: 8 steg (med bilder)

Video: Arduino CO-monitor med MQ-7-sensor: 8 steg (med bilder)

Video: Arduino CO-monitor med MQ-7-sensor: 8 steg (med bilder)
Video: Как использовать оптопару Mosfet HW-532 для управления скоростью двигателя постоянного тока до 30 В или нагрузкой с помощью Arduino 2024, Juli
Anonim
Arduino CO-monitor med MQ-7-sensor
Arduino CO-monitor med MQ-7-sensor
Arduino CO-monitor med MQ-7-sensor
Arduino CO-monitor med MQ-7-sensor

Några ord varför denna instruerbara skapades: en dag ringde min flickväns mamma oss mitt i natten för att hon kände sig riktigt sjuk - hon hade yrsel, takykardi, illamående, högt blodtryck, hon svimmade till och med under okänd tid (förmodligen ~ 5 minuter, men det finns inget sätt att berätta), allt utan någon uppenbar anledning. Hon bor i en liten by långt bort från sjukhus (60 km från vår plats, 30 km till närmaste sjukhus, 10 km utan någon normal väg däremellan), så vi rusade till henne och kom dit strax efter ambulansen. Hon blev sjukhus och på morgonen mådde hon nästan bra, men läkarna kunde inte hitta orsaken till det. Nästa dag hade vi en idé: det kunde ha varit CO-förgiftning, eftersom hon har gasvattenpanna (på bilden) och satt nära det hela kvällen när det hände. Vi köpte nyligen MQ-7 CO-sensor, men hade aldrig tid att montera en schema för det, så det här var den perfekta tiden att göra det. Efter en timmes sökning på internet efter några instruktioner insåg jag att jag inte kan hitta någon guide som samtidigt följer sensortillverkarens instruktioner i dess datablad och förklarar någonting alls (ett exempel verkade ha ganska bra kod, men det var inte klart hur man applicerade det, andra var förenklade och fungerade inte bra). Så vi spenderade cirka 12 timmar på att utveckla scheman, göra och skriva ut 3d -fodral, testa och kalibrera sensorn och gick dagen efter till den misstänksamma pannan. Det visade sig att CO -nivåerna där var extremt höga och kan vara dödliga om CO -exponeringstiden var längre. Så jag tror att alla som har liknande situation (som gaspanna eller annan förbränning som händer i ett bostadsutrymme) borde få en sådan sensor för att förhindra att något dåligt händer.

Allt som hände för två veckor sedan, sedan dess har jag förbättrat schemat och programmerat ganska mycket, och nu verkar det vara ganska bra och relativt enkelt (inte 3-rader-kod enkelt, men ändå). Även om jag hoppas att någon med exakt CO -mätare kommer att ge mig lite feedback på standardkalibrering som jag lade in i skissen - jag misstänker att det är långt ifrån bra. Här är en komplett guide med några experimentella data.

Steg 1: Materialförteckning

Materialförteckning
Materialförteckning

Du behöver: 0. Arduino -bräda. Jag föredrar den kinesiska klonen Arduino Nano för dess enastående pris på $ 3, men alla 8-bitars arduino fungerar här. Sketch använder vissa avancerade timers -drift och testades endast på atmega328 mikrokontroller - även om det förmodligen kommer att fungera bra på andra också. MQ-7 CO-sensor. Vanligtvis tillgänglig med denna Flying Fish-sensormodul måste den genomgå en liten ändring, detaljer i nästa steg, eller så kan du använda en separat MQ-7-sensor.

2. NPN bipolär transistor. Nästan alla NPN -transistorer som klarar 300 mA eller mer fungerar här. PNP-transistorn fungerar inte med en nämnd Flying Fish-modul (eftersom den har värmestift som är lödt på sensorns utgång), men kan användas med en diskret MQ-7-sensor.

3. Motstånd: 2 x 1k (från 0,5k till 1,2k kommer att fungera bra) och 1 x 10k (det är bäst att hålla exakt - även om du absolut måste använda ett annat värde, justera referens_resistor_kOhm -variabeln i skissen i enlighet därmed).

4. Kondensatorer: 2 x 10uF eller mer. Tantal eller keramik krävs, elektrolyt fungerar inte bra på grund av hög ESR (de kommer inte att kunna ge tillräckligt med ström för att släta ut högströmning).5. Gröna och röda lysdioder för att indikera aktuell CO-nivå (du kan också använda en enda tvåfärgad LED med 3 terminaler, som vi använde i vår gula lådprototyp).6. Piezo -summer för att indikera hög CO -nivå. Brödbräda och trådar (du kan också lödda allt till Nano -stift eller klämma in i Uno -uttag, men det är lätt att göra ett misstag på detta sätt).

Steg 2: Modulmodifiering eller diskret sensorledning

Modulmodifiering eller diskret sensorledning
Modulmodifiering eller diskret sensorledning

För modul måste du avlota motstånd och kondensator, som visas på bilden. Du kan avlöda i princip allt om du vill - modulelektronik är helt värdelös, vi använder den bara som hållare för själva sensorn, men dessa två komponenter hindrar dig från att få korrekta avläsningar, Om du använder en separat sensor, fäst värmestiften (H1 och H2) till 5V och transistorns kollektor på motsvarande sätt. Anslut en avkänningssida (någon av A -stiften) till 5V, en annan avkänningssida (någon av B -stiften) till 10k -motståndet, precis som den analoga stiftet på modulen i scheman.

Steg 3: Funktionsprincip

Driftsprincip
Driftsprincip
Driftsprincip
Driftsprincip

Varför behöver vi alla dessa komplikationer alls, varför inte koppla 5V, jord och bara få avläsningar? Tja, du kommer tyvärr inte att få något användbart på detta sätt. Enligt MQ-7-datablad måste sensorn köra igenom hög- och lågvärmecykler för att få korrekta mätningar. Under lågtemperaturfas absorberas CO på plattan och producerar meningsfulla data. Under högtemperaturfasen avdunstar absorberat CO och andra föreningar från sensorplattan och rengör det för nästa mätning.

Så i allmänhet är driften enkel:

1. Applicera 5V i 60 sekunder, använd inte dessa avläsningar för CO -mätning.

2. Applicera 1,4V i 90 sekunder, använd dessa avläsningar för CO -mätning.

3. Gå till steg 1.

Men här är problemet: Arduino kan inte ge tillräckligt med ström för att driva den här sensorn från sina stift - sensorns värmare kräver 150 mA, medan Arduino -stift inte kan ge mer än 40 mA, så om den är ansluten direkt brinner Arduino -stift och sensorn vann fortfarande fungerar inte. Så vi måste använda någon form av strömförstärkare som tar liten ingångsström för att styra stor utström. Ett annat problem är att få 1,4V. Det enda sättet att på ett tillförlitligt sätt få detta värde utan att introducera många analoga komponenter är att använda PWM (Pulse Width Modulation) -metod med feedback som styr utspänningen.

NPN-transistorn löser båda problemen: när den ständigt slås på är spänningen över sensorn 5V och den värms för högtemperaturfas. När vi applicerar PWM på dess ingång pulserar strömmen, sedan utjämnas den av kondensatorn och medelspänningen hålls konstant. Om vi använder högfrekvent PWM (i skissen har den en frekvens på 62,5 KHz) och genomsnittligt många analoga avläsningar (i skissen genomsnitt vi över ~ 1000 avläsningar), då är resultatet ganska tillförlitligt.

Det är viktigt att lägga till kondensatorer enligt scheman. Bilder här illustrerar skillnaden i signal med och utan C2 -kondensator: utan den är PWM -krusning tydligt synlig och den förvränger avläsningarna avsevärt.

Steg 4: Schema och brödbräda

Schema och brödbräda
Schema och brödbräda
Schema och brödbräda
Schema och brödbräda
Schema och brödbräda
Schema och brödbräda

Här är schemat och panelenheten.

VARNING! Modifiering av en standard breakout -modul krävs! Modulen utan modifiering är värdelös. Modifiering beskrivs i det andra steget

Det är viktigt att använda stiften D9 och D10 för lysdioder, eftersom det har utgångar från hårdvarutimern1, det gör det möjligt att smidigt ändra deras färger. Stift D5 och D6 används för summer, eftersom D5 och D6 är utgångar från hårdvarutimern0. Vi kommer att konfigurera dem att vara inversa varandra, så att de växlar mellan (5V, 0V) och (0V, 5V) tillstånd, och producerar därmed ljud på summer. Varning: detta påverkar Arduinos huvudsakliga tidsavbrott, så alla tidsberoende funktioner (som millis ()) kommer inte att ge korrekta resultat i denna skiss (mer om detta senare). Pin D3 har maskinvara Timer2-utgång ansluten till den (liksom D11 - men det är mindre bekvämt att sätta kabel på D11 än på D3) - så vi använder den för att tillhandahålla PWM för spänningsstyrande transistor. Motstånd R1 används för att styra ljusstyrkan på lysdioder. Det kan vara allt från 300 till 3000 Ohm, 1k är ganska optimalt i ljusstyrka/strömförbrukning. Motstånd R2 används för att begränsa transistorns basström. Det bör inte vara lägre än 300 ohm (för att inte överbelasta Arduino -stift) och inte högre än 1500 ohm. 1k finns det ett säkert val.

Motstånd R3 används i serie med sensorplatta för att skapa en spänningsdelare. Spänningen på sensorns utgång är lika med R3 / (R3 + Rs) * 5V, där Rs är strömgivarens motstånd. Sensormotståndet beror på CO -koncentrationen, så spänningen ändras i enlighet med detta. Kondensator C1 används för att jämna in PWM -spänning på MQ -7 -sensorn, desto högre är dess kapacitans desto bättre, men den måste också ha låg ESR - så keramik (eller tantal) kondensatorn är att föredra här, kommer den elektrolytiska inte att fungera bra.

Kondensator C2 används för att jämna ut sensorns analoga utgång (utspänningen beror på ingångsspänningen - och vi har ganska hög ström PWM här, som påverkar alla scheman, så vi behöver C2). Den enklaste lösningen är att använda samma kondensator som C1. NPN -transistorn leder antingen ström hela tiden för att ge hög ström på givarens värmare, eller fungerar i PWM -läge, vilket minskar värmeströmmen.

Steg 5: Arduino -program

Arduino -programmet
Arduino -programmet

VARNING: SENSOR KRÄVER MANUELL KALIBRERING FÖR ALL PRAKTISK ANVÄNDNING. UTAN KALIBRERING, beroende på parametrar i din speciella sensor, KAN DENNA SKETCH STÄNGA PÅ LARM I REN LUFT ELLER INTE DETektera LETHAL CARBON MONOXIDE CONCENTRATION

Kalibrering beskrivs i följande steg. Grov kalibrering är mycket enkel, exakt är ganska komplex.

På den allmänna nivån är programmet ganska enkelt:

Först kalibrerar vi vår PWM för att producera stabila 1,4V som krävs av sensorn (korrekt PWM -bredd beror på många parametrar som exakta motståndsvärden, den här sensorns motstånd, transistorns VA -kurva etc etc - så det bästa sättet är att prova olika värden och använd en som passar bäst). Därefter går vi kontinuerligt igenom en cykel på 60 sekunder uppvärmning och 90 sekunder mätning. Vid implementering blir det något komplicerat. Vi måste använda hårdvarutimrar eftersom allt vi har här behöver högfrekvent stabil PWM för att fungera korrekt. Koden är bifogad här och kan laddas ner från vår github, samt schematisk källa i Fritzing. I programmet finns det 3 funktioner som hanterar timers: setTimer0PWM, setTimer1PWM, setTimer2PWM. Var och en av dem ställer in timern i PWM -läge med givna parametrar (kommenteras i koden) och ställer in pulsbredd enligt ingångsvärden. hantera allt inuti. och ställ in rätt timervärden för att växla mellan 5V och 1,4V uppvärmning. LED-tillstånd ställs in med funktionssetLEDs som accepterar grön och röd ljusstyrka på sin ingång (i linjär 1-100 skala) och omvandlar den till motsvarande timerinställning.

Summerstatus styrs med hjälp av funktioner buzz_on, buzz_off, buzz_beep. På/av -funktioner aktiverar och avaktiverar ljudet, pipfunktionen producerar en specifik pipsekvens med en period på 1,5 sekunder om den periodiskt anropas (den här funktionen återkommer omedelbart så att det inte pausar huvudprogrammet - men du måste ringa det igen och igen för att producera pipmönster).

Programmet kör först funktionen pwm_adjust som tar reda på korrekt PWM -cykelbredd för att uppnå 1,4V under mätfasen. Sedan piper det några gånger för att indikera att sensorn är klar, går över till mätfas och startar huvudslingan.

I huvudslingan kontrollerar programmet om vi spenderade tillräckligt med tid i den aktuella fasen (90 sekunder för mätfasen, 60 sekunder för uppvärmningsfasen) och om ja, ändrar den nuvarande fasen. Det uppdaterar också ständigt sensoravläsningar med hjälp av exponentiell utjämning: new_value = 0.999*old_value + 0.001*new_reading. Med sådana parametrar och mätcykel, ger den en genomsnittlig signal över cirka 300 millisekunder. UTAN KALIBRERING, beroende på parametrar i din speciella sensor, KAN DENNA SKETCH STÄNGA PÅ LARM I REN LUFT ELLER INTE DETektera LETHAL CARBON MONOXIDE CONCENTRATION.

Steg 6: Första körningen: Vad du kan förvänta dig

Första körningen: vad du kan förvänta dig
Första körningen: vad du kan förvänta dig

Om du har monterat allt ordentligt, efter att ha kört skiss kommer du att se något liknande i seriell bildskärm:

justera PWM w = 0, V = 4,93

justera PWM w = 17, V = 3,57PWM resultat: bredd 17, spänning 3,57

och sedan en serie siffror som representerar aktuella sensoravläsningar. Denna del är att justera PWM -bredd för att producera sensors värmarspänning så nära 1,4V som möjligt, uppmätt spänning dras från 5V, så vårt ideala mätvärde är 3,6V. Om denna process aldrig slutar eller slutar efter ett enda steg (vilket resulterar i bredd lika med 0 eller 254) - då är det något fel. Kontrollera om din transistor verkligen är NPN och är ordentligt ansluten (se till att du använde bas, uppsamlare, sändarpinnar rätt - basen går till D3, kollektorn till MQ -7 och sändaren till marken, räkna inte med Fritzing breadboard view - det är fel för vissa transistorer) och se till att du har anslutit sensorns ingång till Arduinos A1 -ingång. Om allt är bra ska du se i Serial Plotter från Arduino IDE något som liknar bilden. Uppvärmnings- och mätcykler på 60 och 90 sekunders längd körs efter varandra, med CO ppm mätt och uppdaterat i slutet av varje cykel. Du kan ta en öppen låga nära sensorn när mätcykeln nästan är klar och se hur det kommer att påverka avläsningarna (beroende på flamtyp kan den producera upp till 2000 ppm CO -koncentration i friluft - så även om endast en liten del av det går faktiskt in i sensorn, det kommer fortfarande att slå på larmet och det går inte förrän i slutet av nästa cykel). Jag visade det på bilden, liksom svaret på eld från tändaren.

Steg 7: Sensorkalibrering

Sensorkalibrering
Sensorkalibrering
Sensorkalibrering
Sensorkalibrering

Enligt tillverkarens datablad ska sensorn köra uppvärmnings- och kylcykler i 48 timmar i rad innan den kan kalibreras. Och du borde göra det om du tänker använda det länge: i mitt fall förändrades sensoravläsningen i ren luft i cirka 30% under 10 timmar. Om du inte tar hänsyn till detta kan du få 0 ppm resultat där det faktiskt finns 100 ppm CO. Om du inte vill vänta i 48 timmar kan du övervaka sensoreffekten i slutet av mätcykeln. När det över en timme inte ändras på mer än 1-2 poäng - kan du sluta värma där.

Grov kalibrering:

Efter att ha kört skissen i minst 10 timmar i ren luft, ta det råa sensorvärdet i slutet av mätcykeln, 2-3 sekunder innan uppvärmningsfasen startar, och skriv in det i sensor_reading_clean_air variabel (rad 100). Det är allt. Programmet uppskattar andra sensorparametrar, de kommer inte att vara exakta, men borde räcka för att skilja mellan 10 och 100 ppm koncentration.

Exakt kalibrering:

Jag rekommenderar starkt att hitta en kalibrerad CO -mätare, göra 100 ppm CO -prov (detta kan göras genom att ta lite rökgas i sprutan - CO -koncentration kan lätt ligga i intervallet flera tusen ppm - och långsamt lägga den i en sluten burk med kalibrerad mätare och MQ-7-sensor), ta rå sensoravläsning vid denna koncentration och sätt in den i sensor_reading_100_ppm_CO variabel. Utan detta steg kan din ppm -mätning vara fel flera gånger åt båda hållen (fortfarande ok om du behöver larm för farlig CO -koncentration hemma, där det normalt inte borde finnas någon CO, men inte bra för någon industriell tillämpning).

Eftersom jag inte hade någon CO -mätare använde jag ett mer sofistikerat tillvägagångssätt. Först förberedde jag en hög koncentration av CO med förbränning i isolerad volym (första fotot). I detta dokument fann jag de mest användbara uppgifterna, inklusive CO -utbyte för olika flamtyper - det finns inte på bilden, men det sista experimentet använde propangasförbränning, med samma inställning, vilket resulterade i ~ 5000 ppm CO -koncentration. Därefter späddes den ut 1:50 för att uppnå 100 ppm, som illustreras på det andra fotot, och användes för att bestämma sensorns referenspunkt.

Steg 8: Några experimentella data

Några experimentella data
Några experimentella data

I mitt fall fungerade sensorn ganska bra - den är inte särskilt känslig för riktigt låga koncentrationer, men tillräckligt bra för att upptäcka något högre än 50 sid / min. Jag försökte öka koncentrationen gradvis, ta mätningar och byggde en uppsättning diagram. Det finns två uppsättningar av 0ppm linjer - ren grön före CO -exponering och gulgrön efter. Sensorn tycks något ändra sitt rena luftmotstånd efter exponering, men denna effekt är liten. Det verkar inte klart kunna skilja mellan 8 och 15, 15 och 26, 26 och 45 ppm koncentrationer-men trenden är väldigt tydlig, så det kan avgöra om koncentrationen ligger i 0-20 eller 40-60 ppm. För högre koncentrationer är beroende mycket mer distinkt - när den utsätts för avgaser från öppen låga går kurvan upp från början utan att gå ner alls, och dess dynamik är helt annorlunda. Så för höga koncentrationer råder det ingen tvekan om att det fungerar pålitligt, även om jag inte kan bekräfta dess precision eftersom jag inte har någon märkt CO -mätare. Även denna uppsättning experiment gjordes med 20k lastmotstånd - och efter det bestämde jag mig att rekommendera 10k som standardvärde, det borde vara mer känsligt på det här sättet. Det är det. Om du har en pålitlig CO -mätare och har monterat detta kort, vänligen dela lite feedback om sensorns precision - det skulle vara bra att samla in statistik över olika sensorer och förbättra standardskissantaganden.

Rekommenderad: