- Mitglied seit
- 4 Dez 2010
- Beiträge
- 1,995
- Punkte für Reaktionen
- 8
- Punkte
- 38
In diesem Thread nun einige Scripts bzw. C++Source-Codes als kleine Helferlein für Sensorenabfragen etc.:
DS18B20 (USB)
Temperatursensor DS18B20 an Interface AT90USB162
Mit diesem Programm wird der Temperatursensor gelesen. Je nach Parameter wird der Wert in 1/10 Grad (245 = 24,5°C) oder optisch aufbereitet mit weiteren Informationen zu Sensor und Interface angezeigt. Hilfe mit Option -h oder --help.
Aktualisiert: Nun für mehrere angeschlossene DS18B20 an AT90USB162 geeignet.
Bibliotheken / Pakete:
apt-get install libusb-1.0-0 libusb-1.0-0-dev xserver-xorg-dev
tempusb.cpp
-DS18B20 (GPIO)
Temperatursensor DS18B20 direkt an GPIO
Mit diesem Programm wird der Temperatursensor gelesen. Je nach Parameter wird der Wert in 1/10 Grad (245 = 24,5°C) oder optisch aufbereitet mit weiteren Informationen zu Sensor und Interface angezeigt. Hilfe mit Option -h oder --help.
Bibliotheken / Pakete:
apt-get install wiringPi bc
tempgpio (bash)
-DHT11, DHT22 und AM2302 (GPIO wiringPi)
Temperatur-/Luftfeuchtigkeitssensor Lesemodul für Sensor DHT11, DHT22 und AM2302 an GPIO wiringPi
Mit diesem Programm wird Temperatur und Luftfeuchtigkeit gelesen. Je nach Parameter wird der Wert für Temperatur, Luftfeuchtigkeit oder optisch aufbereitet mit weiteren Informationen zum Sensor angezeigt. Hilfe mit Option -h oder --help.
Bibliotheken / Pakete:
apt-get install wiringPi
tempfeuchtwpi.cpp
-BH1750FVI (GPIO I2C)
Lichtsensor Lesemodul für Sensor BH1750 an GPIO I2C
Mit diesem Programm wird die Helligkeit in Lux gelesen. Je nach Parameter wird der Wert ggf. optisch aufbereitet mit weiteren Informationen zum Sensor angezeigt. Hilfe mit Option -h oder --help.
Bibliotheken / Pakete:
apt-get install i2c-tools wiringPi
lichti2c.cpp
DS18B20 (USB)
Temperatursensor DS18B20 an Interface AT90USB162
Mit diesem Programm wird der Temperatursensor gelesen. Je nach Parameter wird der Wert in 1/10 Grad (245 = 24,5°C) oder optisch aufbereitet mit weiteren Informationen zu Sensor und Interface angezeigt. Hilfe mit Option -h oder --help.
Aktualisiert: Nun für mehrere angeschlossene DS18B20 an AT90USB162 geeignet.
Bibliotheken / Pakete:
apt-get install libusb-1.0-0 libusb-1.0-0-dev xserver-xorg-dev
tempusb.cpp
Code:
/*
╔═══╗ ╔═══╗ ╔═══╗ ┌───────────────────────────────────────────────────┐
║ ║ ║ ║ │ SensorAndSwitch (C)2014-16 Bluedragon │
╚═══╗ ╠═══╣ ╚═══╗ ├──────────────────┬────────────────────────────────┤
║ ║ ║ ║ │ C++ │ tempusb.cpp │
╚═══╝ ╝ ╚ ╚═══╝ ├──────────────────┴────────────────────────────────┤
┌─────────────────┤ Temperatur USB │
│ Info: ╘═══════════════════════════════════════════════════╡
├─────────────────────────────────────────────────────────────────────┤
│ USB-Temperatursensor Lesemodul für Temperatursensor DS18B20 an │
│ Interface AT90USB162 │
│ │
│ ┌───────────────┐ │
├─┤ Compilierung: ├───────────────────────────────────────────────────┤
│ ╘═══════════════╛ │
│ g++ tempusb.cpp -otempusb -lusb-1.0 │
│ ./tempusb │
╘═════════════════════════════════════════════════════════════════════╛
*/
#include <cstdlib>
#include <cstdio>
#include <locale>
#include <iostream>
#include <libusb-1.0/libusb.h>
using namespace std;
int main(int argc, char *argv[]) {
/******************************/
char ver[] = "1.00.0312";
char cpr[] = "(C)2016 BlueDragon";
libusb_device_handle* handle;
libusb_device* dev;
struct libusb_device_descriptor desc;
struct libusb_config_descriptor *config;
int vid = 0x16c0;
int pid = 0x0480;
int interface = 0;
int in = 0x81;
int leng = 64;
unsigned int timeout = 5000;
int res;
int kernelDriverDetached;
int numBytes;
int bus;
int devadr;
unsigned char buffer[leng];
char temp[10];
char* p;
int snr;
int itemp;
float ftemp;
bool fehler = false;
int i = 0;
string help1 = "-h";
string help2 = "--help";
string info1 = "info";
string info2 = "-i";
string info3 = "--info";
string info4 = "-info";
string info5 = "i";
setlocale(LC_ALL, "de_DE");
if (argc > 1 && ( argv[1] == help1 || argv[1] == help2)) {
fprintf(stdout, "┌──────────────────────────────────────────────┐\n");
fprintf(stdout, "│\e[45m\e[1m tempusb Version %s %s \e[0m│\n",
ver,
cpr);
fprintf(stdout, "├──────────────────────────────────────────────┤\n");
fprintf(stdout, "│ \e[1m\e[44mSyntax:\e[0m │\n");
fprintf(stdout, "│ tempusb [SENSOR#] │\n");
fprintf(stdout, "│ - liefert den Wert des USB-Temperatur-│\n");
fprintf(stdout, "│ sensors als 1/10 Grad Celsius │\n");
fprintf(stdout, "│ (z. B. 245 = 24,5°C) │\n");
fprintf(stdout, "│ wird keine Sensornummer angegeben, │\n");
fprintf(stdout, "│ wird die erste eingelesene ausge- │\n");
fprintf(stdout, "│ geben │\n");
fprintf(stdout, "│ tempusb -i|i|--info|-info|info [SENSOR#] │\n");
fprintf(stdout, "│ - zeigt den Wert aufbereitet als Grad │\n");
fprintf(stdout, "│ Celsius mit einer Kommastelle und │\n");
fprintf(stdout, "│ Informationen zum USB-Temperatur- │\n");
fprintf(stdout, "│ sensor an │\n");
fprintf(stdout, "│ wird keine Sensornummer angegeben, │\n");
fprintf(stdout, "│ wird die erste eingelesene ausge- │\n");
fprintf(stdout, "│ geben │\n");
fprintf(stdout, "│ tempusb -h|--help │\n");
fprintf(stdout, "│ - diese Hilfe │\n");
fprintf(stdout, "└──────────────────────────────────────────────┘\n");
return 1;
}
res = libusb_init(0);
if (res != 0) {
fehler = true;
fprintf(stderr, "Fehler: Initialisierung libusb. (ggf. apt-get install libusb-1.0-0 libusb-1.0-0-dev)\n");
return 1;
}
handle = libusb_open_device_with_vid_pid(NULL, vid, pid);
if (!handle) {
fehler = true;
fprintf(stderr, "Fehler: Gerätezugriff; Gerät %04X:%04X Interface AT90USB162 mit USB-Temperatursensor DS18B20 nicht gefunden.\n",
vid,
pid);
return 1;
}
dev = libusb_get_device(handle);
if (argc > 2) {
snr = (int)*argv[argc - 1] - 48;
}
else {
snr = 1;
}
do {
res = libusb_get_device_descriptor(dev, &desc);
if (res != 0) {
fehler = true;
fprintf(stderr, "Fehler: Lesen der Geräte-Beschreibung fehlgeschlagen.\n");
return 1;
}
res = libusb_get_config_descriptor(dev, 0, &config);
if (res != 0) {
fehler = true;
fprintf(stderr, "Fehler: Lesen der Konfigurations-Beschreibung fehlgeschlagen.\n");
return 1;
}
if (libusb_kernel_driver_active(handle, interface)) {
res = libusb_detach_kernel_driver(handle, interface);
if (res == 0) {
kernelDriverDetached=1;
}
else {
fehler = true;
fprintf(stderr, "Fehler: Kerneltreibertrennung.\n");
return 1;
}
}
res = libusb_claim_interface(handle, interface);
if (res != 0) {
fehler = true;
fprintf(stderr, "Fehler: Interfacebelegung für Zugriff.\n");
return 1;
}
res = libusb_interrupt_transfer(handle, in, buffer, leng, &numBytes, timeout);
if (snr > (int)buffer[0] || snr < 1) {
snr = 1;
}
} while ( fehler == false && (int)buffer[1] != snr);
if (res == 0) {
if (numBytes == leng) {
itemp = buffer[4] + buffer[5] * 256;
if (itemp > 32768) {
itemp -= 65536;
}
sprintf(temp, "%d",
itemp);
}
else {
fehler = true;
fprintf(stderr, "Warnung: Empfangen %d Byte(s), anstelle von %d Bytes.\n",
numBytes,
leng);
if (numBytes >= 6) {
itemp = buffer[4] + buffer[5] * 256;
if (itemp > 32768) {
itemp -= 65536;
}
sprintf(temp, "%d",
itemp);
}
}
}
else
{
fehler = true;
fprintf(stderr, "Fehler: Datenübertragung.\n");
}
res = libusb_release_interface(handle, interface);
if (res != 0) {
fehler = true;
fprintf(stderr, "Fehler: Interfacefreigabe.\n");
}
bus = libusb_get_bus_number(dev);
devadr = libusb_get_device_address(dev);
if (kernelDriverDetached) {
libusb_attach_kernel_driver(handle, interface);
}
libusb_exit(0);
ftemp = itemp;
ftemp = ftemp /10;
if (argc > 1 && (argv[1] == info1 || argv[1] == info2 || argv[1] == info3 || argv[1] == info4 || argv[1] == info5)) {
fprintf(stdout, "┌──────────────────────────────────────────────┐\n");
fprintf(stdout, "│\e[45m\e[1m tempusb Version %s %s \e[0m│\n",
ver,
cpr);
fprintf(stdout, "├─────────────────────────────────────┬────────┤\n");
fprintf(stdout, "│ USB-Temperatursensor DS18B20 │\e[36m\e[1m%5.1f°C\e[0m │\n",
ftemp);
fprintf(stdout, "│ an Interface AT90USB162 │ │\n");
fprintf(stdout, "├─────────────────────────────────────┼────────┤\n");
fprintf(stdout, "│ Gerät \e[33m%04X:%04X\e[0m Bus:\e[33m%3u\e[0m Dev:\e[33m%3u\e[0m │ │\n",
desc.idVendor,
desc.idProduct,
bus,devadr);
fprintf(stdout, "│ MaxPower:\e[33m%4umA\e[0m Interfaces:\e[33m%3u\e[0m │ │\n",
config->MaxPower * 2,
config->bNumInterfaces);
fprintf(stdout, "├─────────────────────────────────────┼────────┤\n");
fprintf(stdout, "│ \e[33m0x%02X\e[0m(IN):\e[33m%3u\e[0m Byte(s) von\e[33m%3u\e[0m Byte(s) │ ",
in,
numBytes,
leng);
if (fehler) {
fprintf(stdout, "\e[31m\e[1mFehler\e[0m │\n");
}
else {
fprintf(stdout, "\e[32m\e[1mOk \e[0m │\n");
}
fprintf(stdout, "├─────────────────────────────────────┼────────┤\n");
for (i = 0; i < numBytes; i = i + 8) {
fprintf(stdout, "│ Daten (%02d): \e[33m%02X %02X %02X %02X %02X %02X %02X %02X\e[0m │ │\n",
i,
buffer[0 + i],
buffer[1 + i],
buffer[2 + i],
buffer[3 + i],
buffer[4 + i],
buffer[5 + i],
buffer[6 + i],
buffer[7 + i]);
}
fprintf(stdout, "├─────────────────────────────────────┼────────┤\n");
fprintf(stdout, "│ Anzahl Sensoren: \e[33m% 3d\e[0m Sensor #: \e[33m% 3d\e[0m │ │\n",
buffer[0],
buffer[1]);
fprintf(stdout, "│ Sensor-ID: \e[33m%02X %02X %02X %02X %02X %02X %02X %02X\e[0m │ │\n",
buffer[8],
buffer[9],
buffer[10],
buffer[11],
buffer[12],
buffer[13],
buffer[14],
buffer[15]);
fprintf(stdout, "└─────────────────────────────────────┴────────┘\n");
}
else {
fprintf(stdout, "%s\n",
temp);
}
return 0;
}
-DS18B20 (GPIO)
Temperatursensor DS18B20 direkt an GPIO
Mit diesem Programm wird der Temperatursensor gelesen. Je nach Parameter wird der Wert in 1/10 Grad (245 = 24,5°C) oder optisch aufbereitet mit weiteren Informationen zu Sensor und Interface angezeigt. Hilfe mit Option -h oder --help.
Bibliotheken / Pakete:
apt-get install wiringPi bc
tempgpio (bash)
Code:
#!/bin/bash
#
# ╔═══╗ ╔═══╗ ╔═══╗ ┌───────────────────────────────────────────────────┐
# ║ ║ ║ ║ │ SensorAndSwitch (C)2014-16 Bluedragon │
# ╚═══╗ ╠═══╣ ╚═══╗ ├──────────────────┬────────────────────────────────┤
# ║ ║ ║ ║ │ SAS-Core-Sys │ tempgpio │
# ╚═══╝ ╝ ╚ ╚═══╝ ├──────────────────┴────────────────────────────────┤
# ┌─────────────────┤ Temperatur DS18B20 GPIO │
# │ Info: ╘═══════════════════════════════════════════════════╡
# ├─────────────────────────────────────────────────────────────────────┤
# │ Temperatursensor DS18B20 GPIO Wert-Ausgabe │
# ╘═════════════════════════════════════════════════════════════════════╛
#
VER=6.00.0018
#
SASSYS=/usr/local/bin/sas
#
XSPC=" "
XDEVICE=$1$XSPC
XDEVICE=${XDEVICE:0:15}
#
if [ "$1" == "--help" ] || [ "$1" == "-h" ]; then
echo -e "┌───────────────────────────────────┐"
echo -e "│\e[45m\e[1m SensorAndSwitch Version $VER \e[0m│"
echo -e "├───────────────────────────────────┤"
echo -e "│ \e[1m\e[44mSyntax:\e[0m │"
echo -e "│ tempgpio DEVICE │"
echo -e "│ - liefert den Wert des │"
echo -e "│ CPU-Temperatursensors │"
echo -e "│ als 1/10 Grad Celsius │"
echo -e "│ (Z. B. 489 = 48,9°C) │"
echo -e "│ DEVICE ist z.B. │"
echo -e "│ 28-000002af52ca │"
echo -e "│ tempgpio DEVICE info|i │"
echo -e "│ - zeigt den Wert aufbe- │"
echo -e "│ reitet als Grad Celsius │"
echo -e "│ mit einer Kommastelle an │"
echo -e "│ tempgpio -h|--help │"
echo -e "│ - diese Hilfe │"
echo -e "└───────────────────────────────────┘"
else
if [ -e /sys/bus/w1/devices/$1/w1_slave ]; then
TEMPGPIO=$(echo "scale=0;$(cat /sys/bus/w1/devices/$1/w1_slave | grep -E -o ".{0,0}t=.{0,5}" | cut -c 3-)/100" | bc)
if [ "$2" == "info" ] || [ "$2" == "i" ]; then
XTEMPGPIO=$(echo "scale=1;$TEMPGPIO / 10" | bc)
XTEMPGPIO=$(echo $XTEMPGPIO | sed 's/\./,/g')
XTEMPGPIO=$(printf "%2.1f" $XTEMPGPIO)
echo -e "┌───────────────────────────────────┐"
echo -e "│\e[45m\e[1m SensorAndSwitch Version $VER \e[0m│"
echo -e "├──────────────────────────┬────────┤"
echo -e "│ Temperatursensor DS18B20 │ \e[36m\e[1m$XTEMPGPIO°C\e[0m │"
echo -e "│ $XDEVICE │ │"
echo -e "└──────────────────────────┴────────┘"
else
echo $TEMPGPIO
fi
else
if [ "$2" == "info" ] || [ "$2" == "i" ]; then
echo -e "┌───────────────────────────────────┐"
echo -e "│\e[45m\e[1m SensorAndSwitch Version $VER \e[0m│"
echo -e "├──────────────────────────┬────────┤"
echo -e "│ Temperatursensor DS18B20 │ \e[31m\e[1m -,-°C\e[0m │"
echo -e "│ $XDEVICE │ │"
echo -e "└──────────────────────────┴────────┘"
else
echo ""
fi
fi
fi
#EOF
-DHT11, DHT22 und AM2302 (GPIO wiringPi)
Temperatur-/Luftfeuchtigkeitssensor Lesemodul für Sensor DHT11, DHT22 und AM2302 an GPIO wiringPi
Mit diesem Programm wird Temperatur und Luftfeuchtigkeit gelesen. Je nach Parameter wird der Wert für Temperatur, Luftfeuchtigkeit oder optisch aufbereitet mit weiteren Informationen zum Sensor angezeigt. Hilfe mit Option -h oder --help.
Bibliotheken / Pakete:
apt-get install wiringPi
tempfeuchtwpi.cpp
Code:
/*
╔═══╗ ╔═══╗ ╔═══╗ ┌───────────────────────────────────────────────────┐
║ ║ ║ ║ │ SensorAndSwitch (C)2014-16 Bluedragon │
╚═══╗ ╠═══╣ ╚═══╗ ├──────────────────┬────────────────────────────────┤
║ ║ ║ ║ │ C++ │ tempfeuchtwpi.cpp │
╚═══╝ ╝ ╚ ╚═══╝ ├──────────────────┴────────────────────────────────┤
┌─────────────────┤ Temperatur/Luftfreuchtigkeit GPIO wiringPi │
│ Info: ╘═══════════════════════════════════════════════════╡
├─────────────────────────────────────────────────────────────────────┤
│ Temperatur-/Luftfeuchtigkeitssensor Lesemodul für Sensor DHT11, │
│ DHT22 und AM2302 an GPIO wiringPi │
│ │
│ ┌───────────────┐ │
├─┤ Compilierung: ├───────────────────────────────────────────────────┤
│ ╘═══════════════╛ │
│ g++ tempfeuchtwpi.cpp -otempfeuchtwpi -lwiringPi │
│ ./tempfeuchtwpi │
╘═════════════════════════════════════════════════════════════════════╛
*/
#define MAXTIMINGS 85
#include <cstdio>
#include <iostream>
#include <wiringPi.h>
#include <unistd.h>
#include <algorithm>
#include <cstring>
using namespace std;
int main(int argc, char *argv[]) {
/******************************/
char ver[] = "1.00.0187";
char cpr[] = "(C)2016 BlueDragon";
string help1 = "-h";
string help2 = "--help";
string info1 = "i";
string info2 = "info";
string DHT11 = "dht11";
string DHT22 = "dht22";
string AM2302 = "am2302";
string modust = "t";
string modusf = "f";
string modush = "h";
string modustf = "tf";
string modusth = "th";
char device[6];
bool fehler = false;
float temp = 0;
float hum = 0;
int itemp = 0;
int ihum = 0;
int data[5] = { 0, 0, 0, 0, 0 };
int counter = 0;
int laststate = HIGH;
int j = 0;
int i = 0;
unsigned int l = 0;
if (getuid() != 0) {
fprintf(stderr, "Fehler: Nur als root starten!\n");
return -1;
}
if (wiringPiSetup() == -1) {
fprintf(stderr, "Fehler: Initialisierung schlug fehl!\n");
return 1;
}
if (argc > 1 && ( argv[1] == help1 || argv[1] == help2)) {
fprintf(stdout, "┌────────────────────────────────────────────────────┐\n");
fprintf(stdout, "│\e[45m\e[1m tempfeuchtwpi Version %s %s \e[0m│\n",
ver,
cpr);
fprintf(stdout, "├────────────────────────────────────────────────────┤\n");
fprintf(stdout, "│ \e[1m\e[44mSyntax:\e[0m │\n");
fprintf(stdout, "│ tempfeuchtwpi dht11|dht22|am2302 t|f|h|tf|th PIN# │\n");
fprintf(stdout, "│ - liefert den entsprechenden Wert des │\n");
fprintf(stdout, "│ Sensors als Zahl in 1/10 Grad Celsius bzw.│\n");
fprintf(stdout, "│ Luftfeuchtigkeitswert (z. B. 248 bzw. 560 │\n");
fprintf(stdout, "│ entspräche 24,8°C bzw. 56%%) │\n");
fprintf(stdout, "│ tempfeuchtwpi dht11|dht22|am2302 i|info PIN# │\n");
fprintf(stdout, "│ - zeigt die Werte aufbereitet mit weiteren │\n");
fprintf(stdout, "│ Informationen zum Sensor an │\n");
fprintf(stdout, "│ tempfeuchtwpi -h|--help │\n");
fprintf(stdout, "│ - diese Hilfe │\n");
fprintf(stdout, "└────────────────────────────────────────────────────┘\n");
return 1;
}
if (argc <= 3) {
fprintf(stderr, "Fehler: Bitte gültigen Gerätetyp, Ausgabemodus und gültige Pin-Nummer angeben.\n");
return -1;
}
int pin = atoi(argv[3]);
if (pin < 0) {
fprintf(stderr, "Fehler: Bitte gültigen Gerätetyp, Ausgabemodus und gültige Pin-Nummer angeben.\n");
return -1;
}
data[0] = data[1] = data[2] = data[3] = data[4] = 0;
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delay(18);
digitalWrite(pin, HIGH);
delayMicroseconds(40);
pinMode(pin, INPUT);
for (i = 0; i < MAXTIMINGS; i++) {
counter = 0;
while (digitalRead(pin) == laststate) {
counter++;
delayMicroseconds(1);
if (counter == 255) {
break;
}
}
laststate = digitalRead(pin);
if (counter == 255) {
break;
}
if ((i >= 4) && (i % 2 == 0)) {
data[j / 8] <<= 1;
if (counter > 16) {
data[j / 8] |= 1;
}
j++;
}
}
strcpy(device,argv[1]);
for (l = 0; l < 6; l++) {
device[l] = toupper(device[l]);
}
if (argv[1] == DHT11) {
hum = data[0] * 1;
temp = data[2] * 1;
}
else {
hum = data[0] * 256 + data[1];
hum /= 10.0;
temp = (data[2] & 0x7F)* 256 + data[3];
temp /= 10.0;
if (data[2] & 0x80) {
temp *= -1;
}
}
if ((j >= 40) && (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF))) {
fehler = false;
}
else {
fprintf(stderr, "Fehler: Daten Lesefehler!\n");
fehler = true;
}
if (!fehler && (argv[2] == modust)) {
itemp = (int)temp * 10 + 0.5;
fprintf(stdout, "%d\n", itemp);
return 0;
}
if (!fehler && (argv[2] == modusf || argv[2] == modush)) {
ihum = (int)hum * 10 + 0.5;
fprintf(stdout, "%d\n", ihum);
return 0;
}
if (!fehler && (argv[2] == modustf || argv[2] == modusth)) {
itemp = (int)temp * 10 + 0.5;
ihum = (int)hum * 10 + 0.5;
fprintf(stdout, "%d %d\n", itemp, ihum);
return 0;
}
if (argv[2] == info1 || argv[2] == info2) {
setlocale(LC_ALL, "de_DE");
fprintf(stdout, "┌────────────────────────────────────────────────────┐\n");
fprintf(stdout, "│\e[45m\e[1m tempfeuchtwpi Version %s %s \e[0m│\n",
ver,
cpr);
fprintf(stdout, "├───────────────────────────────────────────┬────────┤\n");
if (!fehler) {
fprintf(stdout, "│ Temperatur │\e[36m\e[1m%5.1f°C\e[0m │\n",
temp);
fprintf(stdout, "│ Luftfeuchtigkeit │\e[36m\e[1m%5.1f%% \e[0m │\n",
hum);
}
else {
fprintf(stdout, "│ Temperatur │\e[36m\e[1m -,-°C\e[0m │\n",
temp);
fprintf(stdout, "│ Luftfeuchtigkeit │\e[36m\e[1m -,-%% \e[0m │\n",
hum);
}
fprintf(stdout, "├───────────────────────────────────────────┼────────┤\n");
fprintf(stdout, "│ Sensor: \e[33m%6s\e[0m GPIO: wiringPi-Pin#: \e[33m%02d\e[0m │ │\n",
device,
pin);
fprintf(stdout, "├───────────────────────────────────────────┼────────┤\n");
fprintf(stdout, "│ Daten: (\e[33m%05d\e[0m):\e[33m0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\e[0m │ ",
j,
data[0],
data[1],
data[2],
data[3],
data[4]);
if (fehler) {
fprintf(stdout, "\e[31m\e[1mFehler\e[0m │\n");
}
else {
fprintf(stdout, "\e[32m\e[1mOk \e[0m │\n");
}
fprintf(stdout, "└───────────────────────────────────────────┴────────┘\n");
}
if (fehler == true) {
return -1;
}
return 0;
}
-BH1750FVI (GPIO I2C)
Lichtsensor Lesemodul für Sensor BH1750 an GPIO I2C
Mit diesem Programm wird die Helligkeit in Lux gelesen. Je nach Parameter wird der Wert ggf. optisch aufbereitet mit weiteren Informationen zum Sensor angezeigt. Hilfe mit Option -h oder --help.
Bibliotheken / Pakete:
apt-get install i2c-tools wiringPi
lichti2c.cpp
Code:
/*
╔═══╗ ╔═══╗ ╔═══╗ ┌───────────────────────────────────────────────────┐
║ ║ ║ ║ │ SensorAndSwitch (C)2014-16 Bluedragon │
╚═══╗ ╠═══╣ ╚═══╗ ├──────────────────┬────────────────────────────────┤
║ ║ ║ ║ │ C++ │ lichti2c.cpp │
╚═══╝ ╝ ╚ ╚═══╝ ├──────────────────┴────────────────────────────────┤
┌─────────────────┤ Lichtstärke in Lux GPIO I2C │
│ Info: ╘═══════════════════════════════════════════════════╡
├─────────────────────────────────────────────────────────────────────┤
│ Lichsensor Lesemodul für Sensor BH1750FVI an GPIO I2C │
│ │
│ ┌───────────────┐ │
├─┤ Compilierung: ├───────────────────────────────────────────────────┤
│ ╘═══════════════╛ │
│ g++ lichti2c.cpp -olichti2c -lwiringPi │
│ ./lichti2c │
╘═════════════════════════════════════════════════════════════════════╛
*/
#include <cstdio>
#include <iostream>
#include <wiringPiI2C.h>
#include <unistd.h>
#include <algorithm>
#include <cstring>
using namespace std;
int main(int argc, char *argv[]) {
/******************************/
char ver[] = "1.00.0017";
char cpr[] = "(C)2016 BlueDragon";
string help1 = "-h";
string help2 = "--help";
string info1 = "i";
string info2 = "info";
int adresse = 0x23;
int handle;
int word;
int lux;
if (argc > 1 && ( argv[1] == help1 || argv[1] == help2)) {
fprintf(stdout, "┌────────────────────────────────────────────────────┐\n");
fprintf(stdout, "│\e[45m\e[1m lichti2c Version %s %s \e[0m│\n",
ver,
cpr);
fprintf(stdout, "├────────────────────────────────────────────────────┤\n");
fprintf(stdout, "│ \e[1m\e[44mSyntax:\e[0m │\n");
fprintf(stdout, "│ lichti2c I2CDEV# │\n");
fprintf(stdout, "│ - liefert den entsprechenden Wert des │\n");
fprintf(stdout, "│ Sensors als Zahl in Lux │\n");
fprintf(stdout, "│ lichti2c I2CDEV# i|info │\n");
fprintf(stdout, "│ - zeigt die Werte aufbereitet mit weiteren │\n");
fprintf(stdout, "│ Informationen zum Sensor an │\n");
fprintf(stdout, "│ lichti2c -h|--help │\n");
fprintf(stdout, "│ - diese Hilfe │\n");
fprintf(stdout, "└────────────────────────────────────────────────────┘\n");
return 1;
}
if (argc > 1 && argv[1] != info1 && argv[1] != info2) {
adresse = atoi(argv[1]);
}
handle = wiringPiI2CSetup(adresse);
if (handle == -1) {
fprintf(stderr, "Fehler: Initialisierung schlug fehl!\n");
return 1;
}
wiringPiI2CWrite(handle,0x10);
sleep(1);
word = wiringPiI2CReadReg16(handle,0x00);
lux = ((word & 0xff00)>>8) | ((word & 0x00ff)<<8);
if ((argc == 2 && (argv[1] == info1 || argv[1] == info2)) || (argc > 2 && (argv[2] == info1 || argv[2] == info2))) {
fprintf(stdout, "┌────────────────────────────────────────────────────────┐\n");
fprintf(stdout, "│\e[45m\e[1m lichti2c Version %s %s \e[0m│\n",
ver,
cpr);
fprintf(stdout, "├─────────────────────────────────────────────┬──────────┤\n");
fprintf(stdout, "│ Lichtstärke │\e[36m\e[1m%5.0d Lux\e[0m │\n",
lux);
fprintf(stdout, "├─────────────────────────────────────────────┼──────────┤\n");
fprintf(stdout, "│ Sensor: BH1750 GPIO I2C-DevAddr: \e[33m%3d (0x%02X)\e[0m │ │\n",
adresse,
adresse);
fprintf(stdout, "└─────────────────────────────────────────────┴──────────┘\n");
}
else {
fprintf(stdout, "%d\n", lux);
}
return 0 ;
}
Zuletzt bearbeitet: