71-AM2301-Library (STM32F4)

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 :

am2301

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 :

ub_stm32f4_am2301_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_71_AM2301


10 Antworten auf 71-AM2301-Library (STM32F4)

  1. Joerg sagt:

    Ich danke dir, auch die Küken werden es dir danken, dass in einer wohlig temperierten und nasenschonender Luftfeuchte sich entwickeln durften :)

  2. Joerg sagt:

    Ich würde die LIB gerne zusammen mit DS1820 LIB nutzen, so kollidiert leider Tim7.

    • admin_ub sagt:

      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)

      • Joerg sagt:

        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

        • admin_ub sagt:

          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.

  3. Joerg sagt:

    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

    • admin_ub sagt:

      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

  4. Joerg B sagt:

    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

  5. Joerg B sagt:

    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

  6. Thamanoon sagt:

    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


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.