BME280 Sensor - Code für ATmega328 in C

OP #8085959
Lesenswert?

Hallo,

anbei ein ausgetesteter C Code für den ATmega328 (oder auch andere) zum Auslesen des BME280 Sensors. Hierzu wird das GY-BME280 Board verwendet, das mit einem I2C interface versehen ist und eine Versorgunsspannung von 5V benötigt. Hab's von AZ-Delivery für 7€ gekauft.

Berechnet wird:

  • der Luftdruck in hPa
  • die Temperatur in deg C * 10
  • die relative Feuchte in %

Alle notwendigen C Files sind im attached zip Ordner.

Vielleicht kann es jemand gebrauchen. Viel Spaß beim Ausprobieren.

Gruß Manni

Angehängte Dateien:
: Verschoben durch Admin
OP #8086191
Lesenswert?

@ Harald K.

Ich hasse es, mir den Quellcode im Browser anzusehen! Ich packe ihn lieber gleich ins Atmel Studio, da kann man gleich sehen, was falsch ist. Ansonsten ist die foreneigene Funktion schon sehr hilfreich - Danke dafür.

Ich muss den Compiler erst noch mal fragen, ob er do/while kennt :-) Ja - Du hast ja so recht, aber die do/while Anweisung ist in den alten grauen Zellen irgendwie verschütt gegangen.

@ N.M. (Mani)

Wieso soll das Delay_ms(10) unschön sein? Das Datenblatt sagt ausdrücklich, dass man auf das 0x01 Bit warten muss, bis es 0 wird. Unschön ist nur, dass ich kein Timeout eingebaut habe, der den Controller im Fehlerfall des Sensors im Endlos-Loop laufen lassen wird. Werde ich noch einbauen!

#8086199
Lesenswert?

Manfred L. schrieb:

Wieso soll das Delay_ms(10) unschön sein?

Weil es unnötig ist. Jede vernünftige Library macht das Warten über einen zusätzlichen State in einer Statemachine. Wenn das Mal ein paar us sind, OK. Kann man drüber diskutieren. Aber 10ms ist ne halbe Ewigkeit in der durch das delay nichts mehr anderes gemacht werden kann. Wenn das mehrere Programmteile so machen geht am Schluss garnichts mehr.

#8086233
Lesenswert?

Manfred L. schrieb:

Wieso soll das Delay_ms(10) unschön sein?

Weil es die CPU für 100.000 Takte bei 10 MHz lahmlegt, was sehr unvorteilhaft ist, wenn sie auch noch andere Dinge "parallel" zum Sensor-Auslesen tun soll, was ja nicht so ganz unwahrscheinlich ist.

Für solche in bestimmten Zeitabständen regelmäßig wiederkehrenden Aufgaben verwendet man einen Timer-Interrupt, den man gern auch als Trigger für verschiedene Aufgaben mehrfach benutzt (ggf. über Variablen hochzählen zur Erzeugung unterschiedlicher Wartezeiten).

#8086239
Lesenswert?

Manfred L. schrieb:

Ich hasse es, mir den Quellcode im Browser anzusehen! Ich packe ihn lieber gleich ins Atmel Studio, da kann man gleich sehen, was falsch ist.

Nun, eine zunehmende Anzahl der Forennutzer nutzt das Forum unterwegs auf ihrem Smartphone -- da gibts kein Atmel Studio.

Und da so ein in C geschriebener "Treiber" auch für andere Microcontroller interessant sein könnte, denke ich mir, daß auch andere sich den Kram ansehen wollen, ohne ihn eigens herunterladen, irgendwohin auspacken und mit der IDE ihrer Wahl ansehen möchten.

#8088393
Lesenswert?

Bei batteriebetrieben Anwendungen ist so ein delay, was mit 100% CPU-Stromverbrauch Däumchen dreht, immer ungern gesehen. Beim BME noch eher verschmerzbar, der ist (ohne Oversampling) flott. Bei z.B. DS18B20, der sich da mal 750ms genehmigt, unakzeptabel.

Idee: Mach dir eine "weak"-function

1
void BME280_yield(void) __attribute__((weak));
2
void BME280_yield(void) {
3
       Delay_ms(10);
4
}

und verwende die.

Falls jemand auf Kosten des Timings Strom sparen will, kann er einfach eine eigene Variante bereitstellen, die z.B. für x Timer-Ticks in den SLEEP geht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren