Mit dem RPi möchte ich per GPIO jedes Blinken einer LED meines Stromzählers in eine MySQL Datenbank schreiben.
Dank eines Code-Schnipsels von dreamshader per PN wurde ich schon mal auf den richtigen Pfad geschickt mein Ansinnen umzusetzen. Durchaus schweißtreibend, da Linux, C und vor allem gcc für mich neu sind. Bin eher bei php, Javascript und ein bisschen AppleScript zu Hause.
Aber im Prinzip klappt schon mal folgendes:
//gcc -I/usr/include/mysql -L/usr/lib/mysql -L/usr/local/lib -o gpio_isr gpio_isr.c -lmysqlclient -lwiringPi
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <mysql.h>
MYSQL *mysql;
static volatile int globalCounter = 0 ;
void check_error()
{
if (mysql_errno(mysql) != 0)
{
fprintf(stderr, "Fehler: %s\n", mysql_error(mysql));
exit(1);
}
}
/*
* Interrupts:
*********************************************************************************
*/
void interrupt_0 (void)
{
++globalCounter ;
mysql_query(mysql, "INSERT INTO events (gpio_id) VALUES (0)");
}
/*
*********************************************************************************
* main
*********************************************************************************
*/
int main (void)
{
int myCounter = 0 ;
mysql=mysql_init(mysql);
check_error();
mysql_real_connect(
mysql, /* Zeiger auf MYSQL-Handler*/
"localhost", /* Host-Name*/
"root", /* User-Name*/
"girr88?least", /* Passwort für user_name */
"smartmeter", /* Name der Datenbank*/
0, /* Port (default=0) */
NULL, /* Socket (default=NULL)*/
0 /* keine Flags */ );
check_error();
if (wiringPiSetup () < 0)
{
fprintf (stderr, "Unable to setup wiringPi: %s\n", strerror (errno)) ;
return 1 ;
}
pinMode(0, INPUT);
pullUpDnControl(0, PUD_UP);
if (wiringPiISR (0, INT_EDGE_FALLING, &interrupt_0) < 0)
{
fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno)) ;
return 1 ;
}
for ( ; ; )
{
printf ("Waiting ... ") ; fflush (stdout) ;
while (myCounter == globalCounter)
delay (100) ;
printf (" Done. counter: %5d\n", globalCounter) ;
myCounter = globalCounter ;
}
mysql_close (mysql);
return 0 ;
}
Alles anzeigen
Mit einer kleinen LED-Testschaltung die einen Fototransistor beleuchtet, der an gpio 0 (WiringPi Nomenklatur) angeschlossen ist, werden problemlos 40 Impulse pro Sekunde in die Datenbank geschrieben. Bei 1000 Impulsen pro kWh würde das einer Momentanleistung von 144 kW entsprechen. Sollte also reichen.
Nun, damit das Ganze dann produktiv wird, sollte das Programm ja dauerhaft laufen. (Und bei Neustart des RPi auch automatisch starten.) Das Programm mit der Endlosschleife am Leben zu erhalten, erscheint mir etwas "unelegant", und dient ja auch nur zu "unproduktiven" Testzwecken. (Bei AppleScript gibt so eine Möglichkeit "nicht automatisch beenden", um auf bestimmte Events zu reagieren.)
Eine Möglichkeit scheint mir daemon. Aber wohl auch nicht so einfach umzusetzen.
Vielleicht kann mir hier jemand den Weg in die richtige (unkomplizierte) Richtung weisen.
Und die C-Profis dürfen gerne Kritik an meinem Code üben. Ich möchte mich gerne an die üblichen Konventionen halten.