Forum: Analoge Elektronik und Schaltungstechnik (Airwick) AS-MLV-P VOC-Sensor: Wie ansteuern?


von Dirk K. (dekoepi)


Lesenswert?

Hallo zusammen,

es gab zwar schon ältere Threads zum Applied Sensors VOC-Sensor aus dem 
Airwick Geruchssensor-Dingen, aber die führten bislang zu nichts außer 
Produktfotos: Beitrag "Geruchssensor - Air Wick Fresh Matic"

Ich habe mir so ein Teil auch mal bestellt und beherzt mit einem 
Taschenmesser auseinandergenommen, der Aufbau ist immer noch gleich. Der 
Sensor ist äußerst simpel aufgebaut: Ein Heizdraht und ein auf die 
Oxidationsprodukte reagierender Sensor. Man kann zwar keine Messung wie 
mit einem GCMS durchführen, aber "Luftverschmutzung" allgemein erkennen.

Das Datenblatt hat sogar ein Schaltbild - nur das verstehe ich schon 
nicht richtig. Da ist ein Widerstand drin, wenn ich das richtig sehe, 
zwischen GND und S2 (Sensor) - ist das ein Pulldown, also beispielsweise 
mit 10kOhm? Steht leider nicht konkret dran. Für die Heizung fehlt da 
ein Widerstand meiner Meinung nach, da der Heizdraht bis zu 41mA ziehen 
soll, bei ~2,7V @320°C Arbeitstemperatur.
https://www.appliedsensor.com/pdfs/AS-MLV-P.pdf (2 Seiten, wenig drauf.)

Habe ich das korrekt verstanden soweit? Dann bräuchte ich für 
3,3V-Speisung einen 15-Ohm-Widerstand laut der Online-Rechner für 
LED-Vorwiderstände (0,6V vernichten, 24mW Verlustleistung, 40mA kommen 
an. Bei 5V (ATmega/ATtiny) entsprechend 56,1Ohm (68 als nächster 
"Normwiderstand"), bei 2,3V zu vernichten und 33,8mA Leistung am 
Heizdraht bei 78mW Verlustleistung).

Wenn ich den Widerstand des Sensors über S1 (HIGH, OUTPUT) nach S2 
(INPUT) messe, zeigt der 50% der Spannung an für 15 Minuten an und 
danach kommen "echte" Ergebnisse.

Kommt das in etwa hin? Ich habe Google und die Board-Suche schon 
ordentlich gequält, aber keinen konkreten Aufbau gefunden dazu.

Was mich dabei wundert - der Sensor muss dann ja quasi die ganze Zeit 
laufen und zieht dann permanent 41mA (Heizdraht)+ x mA µC+ y mA Gemüse, 
was für Batteriebetrieb doch äußerst ungeeignet scheint. Oder misst man 
so etwas dann nur in einstündigen Intervallen?

Edit: Der Widerstand hängt laut Schaltbild zwischen Sensor und GND und 
nicht vor der Heizung, soweit korrigiert.

: Verschoben durch Admin
von Interessierter (Gast)


Lesenswert?

Zum strom-sparen wird immer nur kurzzeitig gemessen. Die Aufheizzeiten 
sind bei solchen Sensoren meist relativ kurz.

von Dirk K. (dekoepi)


Lesenswert?

Das wäre sinnvoll. Nur wenn eine Viertelstunde nur Quatsch-Werte kommen, 
passt das ja nicht. Oder meinen die 15 Minuten nur den Sensor-Anschluss 
selbst, also S1/S2? Die dauerhaft anlassen, sozusagen, und dann 
gelegentlich heizen?

von Dirk K. (dekoepi)


Lesenswert?

Die Suche nur nach 'VOC sensor' war jetzt hilfreich: Der gesuchte 
Widerstand Rl ist ein einfacher Pulldown am Sensor-Vcc. Ich werde vor 
die Heizung aber trotzdem einen kleinen Widerstand setzen zur 
Strombegrenzung. Wäre schade, wenn der Heizdraht durchglüht ...

Ein paar für mich verständlichere Bilder gibt es etwa hier: 
http://www.staceyk.org/airSensors/sensorsetup.php

von Dirk K. (dekoepi)


Angehängte Dateien:

Lesenswert?

Zur Dokumentation, falls andere damit auch mal arbeiten möchten:

Ich habe den Sensor jetzt tatsächlich als Schnellschuss so angesteuert, 
mit Minimalstprogramm auf Arduino (kann hier vor Ort grade keine 
richtige IDE installieren, daher Pfusch). Zum Funktionstest reicht das 
aber erstmal.

Bekomme derzeit Werte um die (int) 225, bei anhauchen sinkt der Wert auf 
rund (int) 210-215; dürfte vor allem erhöhter Luftfeuchte anzulasten 
sein. Scheint also zu klappen!

Folgende Verdrahtung (auf dem Foto ist da noch ein kleiner Fehler ;) ):
- Heizung GND an GND.
- Heizung Vcc via 75 Ohm an PinD2.
- Sensor 1 an PinC0 (Analog 0), Pulldown 32kOhm (fiel mir heute morgen 
grad in die Finger).
- Sensor 2 an +5V.

Folgendes Miniprogrämmchen nutze ich grad zur Anzeige der Werte:
1
#define heater 0b00000100  // Heater VCC on D2 (PinD2)
2
#define sensor 0b00000001  // Sensor VCC/Input on A0 (PinC0)
3
4
5
void setup() {
6
  Serial.begin(115200);
7
  DDRD |= heater;  // Heater is OUTPUT
8
  PORTD &= ~(heater);  // Heater is OFF
9
  DDRC &= ~(sensor);  // Sensor is INPUT
10
}
11
12
void loop() {
13
  Serial.print("> ");
14
  PORTD |= heater; // turn on heating (connected with 75 Ohm resistor)
15
  delay(20);
16
  PORTD &= ~(heater); // turn off heating
17
  delay(180);
18
  int sensor_val = analogRead(sensor);
19
  Serial.println(sensor_val);
20
  delay(800);
21
}

: Bearbeitet durch User
von Dirk K. (dekoepi)


Lesenswert?

Gegentest zum Anhauchen mit Herumwedeln eines 
Isopropylalkohol-getränkten Taschentuchs liefert Werte bis (int)250 und 
mehr, also bin ich auf dem richtigen Dampfer.
10 ms Aufheizen und 90 ms abwarten bis zur Messung scheinen auch zu 
reichen. Damit wäre das wirklich einigermaßen stromsparend. Muss bei 
Gelegenheit mal prüfen, was der Sensor ohne Heizung an Leistung zieht. 
Das wirkt aber wie geeignet für CR2032-getriebenen ATtiny85 (oder sogar 
nur ATtiny13), der bei schlechter Luft einen Piezopiepser anstößt :)

: Bearbeitet durch User
von Dirk K. (dekoepi)



Lesenswert?

Nach etwas Herumtesten scheint es, dass ich den Sensor tatsächlich 
korrekt bediene. Das angehängte ".c"-Programm ist direkt aus der 
Arduino-IDE rauskopiert, für eine richtige IDE sind also noch 
Korrekturen nötig.

Die 15 Minuten, die der Sensor Quatsch anzeigt, habe ich heute morgen 
mal mitprotokolliert. Da heizt er eigentlich nur auf und "verbrennt" im 
Wesentlichen alle Rückstände, die sich über Nacht angesammelt haben. Ich 
habe gestern auch mal tagsüber mitprotokolliert (habe die Ausgabe für 
LogView angepasst, im Anhang eine OpenFormat-.ini-Datei für LogView), 
wie das hier im Büro so aussah. Viel offenes Fenster ;) Heute sind die 
Werte wieder schlüssiger.

Vielleicht mag ja auch noch jemand damit Herumspielen. Es ist einfacher 
als vermutet :) Hier noch Bewegtbilder von dem Dingen in Aktion: 
http://youtu.be/7umR9nnQQuo

: Bearbeitet durch User
von Projekt-Gruppe (Gast)


Lesenswert?

Hallo Dirk,

wir versuchen gerade eben auch deinen Funktionsaufbau zu realisieren. 
Haben dazu aber noch eine kurze Frage: Die Heizung Vcc via 75 Ohm an 
PinD2 sind in deinem Fall die 3,3V oder?

von Dirk K. (dekoepi)


Lesenswert?

Arduino läuft mit 5V; den 3,3V-Anschluss habe ich nicht genutzt. Zudem 
geht die Heizung dort auf GND; an Pin D2 ist Heizung dann an bei setzen 
auf HIGH.

Bei 3,3V hatte ich irgendwas von 15 Ohm grob errechnet.
Mach das aber einfach per PWM, also einfach über rund 20ms jeweils 1ms 
an, 1ms aus.

von Rudolph (Gast)


Lesenswert?


von Projekt-Gruppe (Gast)


Lesenswert?

Hallo Dirk,

wir sind jetzt auch soweit jetzt versuchen wir gerade deinen code von 
hier:
http://pastebin.com/RVVtzSSh
in C zu übersetzen. Haben dabei gerade aber noch paar Probleme, da wir 
nicht viel Erfahrung mit Programmieren haben. Kannst du uns einen Ansatz 
zeigen wie wir es in C Programmieren könnten.
Vielen Dank für die Hilfe!

von Dirk K. (dekoepi)


Lesenswert?

Das Einfachst-Programm da oben kompiliert direkt in der Arduino-GUI 
1.5r2.
Der Pastebin-Code auch. Einfach reinkopieren, Board wählen, Prozessor 
wählen, fertig.

"In C" ist etwas - gelinde gesagt - schwammig formuliert. Mein Code dort 
ist C. Er nutzt nur die Ardiuno-Klassenbibliothek. Der Pastebin-Code ist 
davon so gut wie frei, da fehlen aber noch #include-Dateien. Auf Anhieb 
fallen mir da

#include <stdio.h>
#include <stdint.h>

... und sicherlich noch irgendwelche #include <avrXYZ.h>

für die Registerdefinitionen ein. Da ich aber hier auf der Arbeit meine 
"Plain C"-Entwicklungsumgebung nicht habe, kann ich da grad nicht 
nachgucken, welche includes das wohl wären.

Ich kenne zudem eure Toolchain nicht.

: Bearbeitet durch User
von flora (Gast)


Lesenswert?

HI dekoepi,

danke für deine Anleitung.

Ich versuche anhand diese Anleitung meine Schaltung zu bauen 
http://www.heise.de/make/artikel/Wider-dem-Mief-2235138.html?artikelseite=3

Es steht, dass man ein 10kOhm Widerstand nehmen kann, das ist mein Fall. 
Aber die RGB LED leuchtet blau und ich bekomme keine Werte in arduino 
console. Habe ich etwas falsches gemacht?

Liebe Grüße

von flora (Gast)


Lesenswert?

Hallo dekoepi,

sind die dargestellten Werten in ppm oder in ppb?

Liebe Grüßen

von Dirk K. (dekoepi)


Lesenswert?

Hallo Flora,

wie ich da geschrieben habe - der Widerstand ist willkürlich gewählt. 
10kOhm passen. Werte sollten auf jeden Fall kommen - hast du mit der 
korrekten Baudrate verbunden? Welche Version des Sketches/Programmes 
hast du genommen? Wirklich alles korrekt beschaltet? (Im Zweifel mal ein 
Foto machen.)

Die Werte sind ohne jede Einheit. Der Sensor lässt sich ohne 
Kalibrierung dafür nicht einsetzen, sondern kann dir nur grob anzeigen: 
Viel, mittel, wenig VOCs.

Du kannst selber die Schwellwerte anpassen, indem du bei der Messung den 
Sensor mal Isopropyl-Dämpfen (zB Händedesinfektion) oder Ethanol 
zuwedelst. damit kommst du an den oberen Grenzwert; damit lässt sich 
dann ein sinnvoller Wertebereich definieren. EInfach über längere Zeit 
laufen lassen und selber einschätzen - ja, jetzt könnte mal Frischluft 
fällig sein, was zeigt der Sensor an? :)

: Bearbeitet durch User
von smuk (Gast)


Lesenswert?

MoinMoin

leider scheint es das Air Wick ding nicht mehr zu geben. Habt ihr ne 
Idee wo man entweder noch einen bekommt oder eine Alternative?

vg Smuk

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.