Der AM2301 (von Aosong) ist ein kombinierter Luftfeuchte- und Temperatur-Sensor.
An dieser Stelle ein DANKE an ”Joerg” der mir den Sensor zugesendet hat.
Der Sensor wird über einen 1Draht-Bus angesteuert, benötigt also nur einen PortPin der CPU. Allerdings ist der Bus nicht mit dem One-Wire-Bus-Protokoll kompatibel und es kann auch nur ein Sensor an den Bus angeschlossen werden.
Der Datenpin ist als “OpenDrain-Output” geschaltet und es muss zwingend ein externer PullUp (gegen 3,3V) von ca. 4k7 eingebaut werden. (Im H-File wird der Pin festgelegt)
Die Auflösung vom Temperatur-Sensor ist 0,1Grad und reicht von -40,0°C bis +80,0°C
Die Auflösung vom Feuchte-Sensor ist 0,1% und reicht von 0% bis 99,9%
Der Sensor darf nur alle 2sec abgefragt werden (laut Datasheet), ich hab das so gelöst das man die “Read-Funktion” beliebig pollen kann und ein “AM2301_NOTREADY” zurückbekommt solange die 2sec noch nicht um sind. Wenn die Sensor-Daten ausgelesen wurden ist der Rückgabewert “AM2301_OK” und die beiden Messwerte stehen als float in der Struktur “AM2301″. (siehe Beispiel)
Bilder :
Pinbelegung :
1 | PD3 = Datenpin |
Voraussetzungen :
1 2 | Benutzte Module der CooCox-IDE : GPIO, TIM, MISC Benutzte Librarys : keine |
Enumerationen :
1 2 3 4 5 | typedef enum { AM2301_OK =0, // Auslesen war OK AM2301_NOTREADY, // Sensor noch nicht bereit AM2301_ERROR // Fehler beim auslesen }AM2301_STATUS_t; |
Funktionen :
1 2 | void UB_AM2301_Init(void); // zum init vom Sensor AM2301_STATUS_t UB_AM2301_Read(void); // zum auslesen vom Sensor |
Beispiel :
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 | //-------------------------------------------------------------- // File : main.c // Datum : 20.12.2013 // Version : 1.0 // Autor : UB // EMail : mc-4u(@)t-online.de // Web : www.mikrocontroller-4u.de // CPU : STM32F4 // IDE : CooCox CoIDE 1.7.4 // GCC : 4.7 2012q4 // Module : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der AM2301-Library // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_am2301.h" int main(void) { float humidity,temperatur; SystemInit(); // Quarz Einstellungen aktivieren // init vom AM2301 UB_AM2301_Init(); while(1) { // Daten vom AM2301 auslesen if(UB_AM2301_Read()==AM2301_OK) { // wenn Daten lesen erfolgreich humidity=AM2301.humidity; temperatur=AM2301.temperature; } } } |
Hier die Library zum Download :
Hier der komplette CooCox-Projektordner zum Download :
Ich danke dir, auch die Küken werden es dir danken, dass in einer wohlig temperierten und nasenschonender Luftfeuchte sich entwickeln durften
Ich würde die LIB gerne zusammen mit DS1820 LIB nutzen, so kollidiert leider Tim7.
Dann öffne das C-File mit einem Texteditor deiner Wahl und führe ein “ersetzen” von “TIM7″ mit “TIM6″ durch. (es geht auch jeder andere Timer der an APB1 hängt)
Ich habe das jetzt versucht. Bekomme aber immer die Fehlermeldung : “TIM6_IRQn’ undeclared (first use in this function)” Wo wird der denn deklariert ?
Ich habe mal die geänderte Lib angehängt. https://dl.dropboxusercontent.com/u/98706767/stm32_ub_am2301.zip
du kannst in CoIDE auf eine Konstante (z.B. TIM7_IRQn) mit rechter Maustaste klicken und dann auf “F3 = open declaration” dann siehst du in welchem File der Wert definiert wird. Und “TIM6_IRQn” gibt es nicht…sorry da hatte ich nicht daran gedacht. Beim Timer6 lautet die ISR “TIM6_DAC_IRQn” der Rest müsste passen.
Hallo Uwe,
ich versuche leider vergeblich den Sensor mit deiner STemWIn zum laufen zu bringen, leider vergeblich.
Hier mal das Projekt. https://dl.dropboxusercontent.com/u/98706767/Demo_F429_24.zip
Grüße
Jörg
Hi, da sind ein paar Fehler drin :
1. Die Timer-Frq ist falsch, richtig = “#define AM2301_PERIOD 44″
2. Für sprintf wird “#include ” benötigt
3. Die sprintf von CoIDE kann keine Float umwandeln !!
man braucht eine extra Funktion die das macht
(ich sende dir die Main.c als Email, das ist einfacher)
Gruss
Hallo Uwe,
ich habe nun lange gesucht warum diese und die DS18B20 Lib nicht funktioniert wenn ich sie in neue ST Demos benutzen will.
Es liegt wohl an der Std Lib Version. Coocox benutzt die allererste 1.0 Version und die emWin Demo läuft mit 1.31
Es betrifft nur diese beiden Libs, deine PWM Lib und andere Funktionieren problemlos.
Hast du eine Idee was man ändern muss damit es funktioniert?
Grüße
Jörg
Wenn man “uint32_t tim7_akt_delay; // fuer den Timer”
in
“volatile uint32_t tim7_akt_delay; // fuer den Timer”
ändert läuft es.
Das gleiche beim DS18B20
Thank you again, I’m modify the code to use with stm32f103rb connect to DHT-11, it’s OK.
http://www.electoday.com/index.php/topic,12425.0.html