
Teil 2 <-
Teil 1Lassen Sie uns weiter mit dem Mikrocontroller STM32F103C8T6 experimentieren und einige I2C-Sensoren / -Displays an das „blaue Tablet“ anschließen.
Unterstützung für beliebte I2C-Displays implementiert:
Unterstützung für folgende Sensoren implementiert:
- BH1750 - Lichtsensor
- BME280 - Temperatur-, Druck-, Feuchtigkeitssensor
- CCS811 - CO2-Sensor, VOC (flüchtige organische Substanzen)
Um mit neuen Funktionen arbeiten zu können, müssen Sie ein neues Projekt erstellen.
Der Link zum Herunterladen des MIOC-Programms befindet sich im ersten Teil.
Sensoren
BH1750 Sensor

BH1750 16-Bit-Lichtsensor (Belichtungsmesser) mit I2C-Schnittstelle. Die Fotodiode am BH1750 bestimmt die Intensität des Lichts, das mit einem Operationsverstärker in die Ausgangsspannung umgewandelt wird. Der eingebaute ADC erzeugt digitale 16-Bit-Daten. Die interne Logik des BH1750 macht komplexe Berechnungen überflüssig, da wichtige digitale Daten direkt in Lux (Lux) ausgegeben werden.
Gemäß der Dokumentation ist der BH1750-Sensor empfindlich gegenüber sichtbarem Licht und wird praktisch nicht durch Infrarotstrahlung beeinflusst, d.h. reagiert auf ungefähr den gleichen Spektralbereich wie das menschliche Auge.
Um mit diesem Sensor zu arbeiten, wählen Sie auf der Registerkarte „Konfiguration“ die Option BH1750.
Die Messergebnisse werden in der globalen Variablen angezeigt:
uint32_t BH_L;
Anschließen des Sensors an den I2C2-Bus:

BME280 Sensor

Dieser Sensor misst die Umgebungsparameter: Temperatur, Luftdruck sowie Luftfeuchtigkeit.
Es gibt auch einen ähnlichen Sensor - BMP280, dem die Messung der Luftfeuchtigkeit fehlt. Aber es kostet viel weniger.
Neben der Tatsache, dass der Sensor alle oben genannten Parameter misst, weiß er auch, wie Rauschen gefiltert wird, und die Kalibrierung der Messwerte ist integriert. Im Gegensatz zu anderen Sensoren führt dieser Sensor all diese Messungen nicht nur schnell, sondern auch in größeren Bereichen durch. Beispielsweise wissen viele Sensoren nicht, wie eine Luftfeuchtigkeit von weniger als 20 Prozent gemessen werden soll.
Die deklarierten Eigenschaften des Sensors sind wie folgt:

Die Sensoren sind wie folgt an den I2C2-Bus angeschlossen:

Wenn BMP280 verwendet wird, müssen Sie in der Datei main / bme280.c alle mit // Kommentar für BMP gekennzeichneten Zeilen auskommentieren.
Die Messergebnisse werden in globalen Variablen angegeben:

Ein Beispiel für ein Programm, das mit den Anzeigen BH1750, BME280 und 1602 funktioniert:
#include "mx_init_hw.c" int main() { char s[64]; float t=0, p=0, h=0; Init_HW();
Das Ergebnis des Programms:

Das gleiche Programm zeigt Temperatur, Druck und Luftfeuchtigkeit auf dem Display der SSD1306 an
(Schließen Sie dieses Display an und wählen Sie es in der Konfiguration aus.):

Der BME280 kann die Temperatur genauer messen. Dazu muss es kalibriert werden. In der Hauptdatei / bme280.h gibt es eine Makrodefinition dafür:
# DT 3520 definieren
CCS811 Sensor

Die Luft um uns herum ist ein Gasgemisch und besteht hauptsächlich aus Stickstoff (ca. 78%) und Sauerstoff (ca. 21%). Der verbleibende Prozentsatz entfällt auf verschiedene Verunreinigungen (Inertgase, Kohlendioxid, Kohlenmonoxid, organische flüchtige Substanzen (VOC) usw.). Trotz der Tatsache, dass der Prozentsatz an Verunreinigungen gering ist, kann eine Änderung ihrer Konzentration für den Menschen sehr unangenehm und sogar gefährlich sein. Die Luftqualität in Büro- und Wohngebäuden hängt am häufigsten mit dem Gehalt an CO2 und VOC zusammen.
Organische flüchtige Substanzen umfassen mehr als 5000 Verbindungen. Die Erziehung der meisten von ihnen ist irgendwie mit den Prozessen des menschlichen Lebens verbunden.
Selbst eine einfache Anwesenheit von Menschen in einem geschlossenen Raum führt somit zu einer "Verschmutzung" der Luft und der Notwendigkeit einer Belüftung. Die Abschätzung der Konzentration von VOC in der Luft ist schwierig. Bisher wurden CO2-Sensoren verwendet, um die Konzentration von VOC abzuschätzen. Gleichzeitig wurde berücksichtigt, dass unter normalen Bedingungen die Konzentrationen von VOC und CO2 gebunden sind. Wenn man den Prozentsatz an CO2 kennt, kann man indirekt die Konzentration von VOC bestimmen. Wenn der Kohlendioxidgehalt in der Luft einen bestimmten Grenzwert erreicht hat, muss die Belüftung eingeschaltet werden.
In der Praxis ist die Beziehung zwischen VOC und CO2 nicht immer einfach. Beispielsweise führt das Rauchen in Innenräumen zu einem starken Anstieg des VOC-Gehalts, den CO2-Sensoren nicht aufzeichnen, sodass sich die Kohlendioxidkonzentration nicht wesentlich ändert. Kohlendioxidsensoren sind auch dann machtlos, wenn Haushaltschemikalien, Reinigungsmittel, Farben und Lacke oder gewöhnliche Parfums im Raum verwendet werden. AMS bietet seine Lösung für das Problem der Messung der VOC-Konzentration - CCS811-Sensoren.
Merkmale der Luftqualitätssensoren CCS811B:

Der Sensor verfügt über einen automatischen Kalibrierungsalgorithmus. Messwerte werden innerhalb weniger Tage automatisch eingestellt. Aus diesem Grund weist der neue Sensor einen gigantischen Anfangsfehler auf und muss mindestens drei bis vier Tage lang funktionieren, bis mehr oder weniger zuverlässige Ergebnisse erzielt werden:

Der Benutzer muss sich auch daran erinnern, dass der CCS811-Sensor jedes Mal nach dem Einschalten „warmlaufen“ muss. Die Zeit eines solchen „Aufwärmens“ beträgt mehr als 30 Minuten, in denen der Fehler unannehmbar groß ist:

Diese Funktion von CCS811 ist äußerst wichtig.
Die Ergebnisse der Sensormessung sind in globalen Variablen angegeben:
uint32_t CCS_CO2;
uint32_t CCS_TVOC;
Anschließen des Sensors an den I2C2-Bus:

Sie können das Programm zum Drucken der Ergebnisse dieses Sensors anhand der obigen Beispiele und der Beschreibung der Arbeit mit der Konsole im ersten Teil selbst schreiben.
Beispiele für andere Sensoren
Bewegungssensor HC-SR501

Einige Sensoren, wie z. B. die Bewegungssensoren HC-SR501, erfordern kein Schreiben zusätzlicher Schnipsel.
Deklarieren Sie für diesen Sensor eine Variable, wählen Sie Type = GPIO_Mode_IN_FLOATING und wählen Sie einen Port aus.
BSP generieren, kompilieren, auf MK hochladen. Als nächstes arbeiten wir mit diesem Sensor genauso wie mit der Taste (um Daten zu empfangen).
HC-SR501 Sensoranschluss:

Temperatur- / Feuchtigkeitssensor DHT22

Temperatur- / Feuchtigkeitssensor
Sensoranschluss:

Die Arbeit mit diesem Sensor dient als Beispiel für ein Benutzer-Snippet (analog zur Arduino-Skizze).
Snippet kann hier genommen werden:
dht22.cLegen Sie es in den Hauptordner
Bearbeiten Sie in dieser Datei die Zeilen:
#define PORT GPIOA #define PIN GPIO_Pin_5
durch tatsächlichen Sensoranschluss
Der Text des Programms für die Arbeit mit diesem Snippet:
#include "mx_init_hw.c" #include "dht_22.c" int main() { int16_t dht_t, dht_h; Init_HW(); dht_init();
Das Ergebnis der Arbeit:

Meistens als alle 4-5 Sekunden ist es nicht sinnvoll, den Sensor abzufragen. Gründe: Die Temperaturberechnung erfolgt innerhalb von 800-900 mS, zweitens: Wenn Sie häufiger interviewen, erwärmt sich der Sensor selbst.
CLI
Die Firmware enthält eine kleine Shell, die mit der Konsole funktioniert. Sie können sehen, welche Befehle in der Hauptdatei / mx_cli.c enthalten sind
Auf Wunsch können Sie jedes Ihrer Teams hinzufügen.
Die CLI beginnt im No Echo-Modus zu arbeiten, dh die von Ihnen eingegebenen Zeichen werden nicht angezeigt. Geben Sie Folgendes ein, um die eingegebenen Zeichen anzuzeigen: echo on.
Der Befehl „sh on“ gibt zweimal pro Sekunde die Werte der im Konfigurator deklarierten Variablen und der den Sensoren zugeordneten Variablen aus. Die Nummer an der ersten Position entspricht der Zeilennummer in der Konfigurationstabelle. Mit diesem Befehl werden Daten an ein mit der Konsole verbundenes System übertragen.
Es gibt keine Flags und Mutexe, die die Geschäftigkeit der Konsole analysieren. Wenn Sie den Operator "Drucken" und "Echo ein" zusammen verwenden, kann es daher zu einer Vermischung der Ausgabeinformationen kommen. Sie sollten nicht beide Methoden gleichzeitig verwenden. Um dieses Problem zu lösen, können Sie zwei Ausgangskanäle verwenden. Die Konsole befindet sich beispielsweise in UART1 und die Ausgabe von Benutzerinformationen in VCP. Oder umgekehrt.
Funktionen verwenden:
send_uart1( char *data, int len ) send_usb( char *data, int len )
Um die Verwendung dieser Funktionen zu erleichtern, können Sie das Makro printf in der Datei gbl.h ändern. Zum Beispiel Folgendes:
#define printf(fmt,argv...){char s[128];sprintf(s,fmt,##argv);send_usb(s,strlen(s));}
Beispielausgabe an die Konsole (Echo ein):

I2Cx-Bus-Scan
Zum Scannen des I2C1- oder I2C2-Busses gibt es eine vorgefertigte "Firmware" * .hex
Scanner I2CxInformationsausgabe an UART1, Geschwindigkeit - 115200.8, N, 1
Drücken Sie nach dem Laden des Scanners die Taste „Zurücksetzen“.
Die Firmware zeigt die Adressen der am Bus gefundenen Geräte an.

Alle drei oben beschriebenen angeschlossenen Sensoren.