Hi,
weil ich nun nochmal per Mail angefragt wurde, hier nun mein aktives Beispiel auch für I2C Input und Output-Karten:
ips-pi.c
/*
Dieser Dienst sendet die lokalen Eingänge (GPIOs ..).... an den lokalen IP-Symcon-Dienst
//
// Garage
//
Ver: 2.6
- Übertragung binärer Zustände an IPS, bei deren Änderung
- I2C Unterstützung Inputkarte
- LifeBit
- I2C Unterstützung Outputkarte (Initialisierung auf Null)
- Prozessorlast durch Delay gesenkt
*/
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#include <string.h>
#include <time.h>
#include <stdio.h>
#include <curl/curl.h>
#include <pthread.h>
// Threads: http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel8.shtml
pthread_t t1,t2,t3,t4,t5;
int var_id,j,e,fd1,fd2,fd3;
char* var_val;
int GPIO_PIN[17][3]={{0},{0},{0}}; //GPIO-PINs zweidimensionales Array 0=0-7 1=val_id 2=aktuellerWert 3=alterWert
int dID1 = 0x3d; //Hex-Adresse I2C-Eingabekarte1 ermittelt über "i2cdetect -y 1"
int dID2 = 0x3a; //Hex-Adresse I2C-Eingabekarte2 ermittelt über "i2cdetect -y 1"
int dID3 = 0x27; //Hex-Adresse I2C-Ausgabekarte ermittelt über "i2cdetect -y 1"
int i2c_in_1[8][3]={{0},{0},{0}}; //I2C-Bus zweidimensionales Array für Eingang 0=0-7 1=val_id 2=aktuellerWert 3=alterWert
int i2c_in_2[8][3]={{0},{0},{0}}; //I2C-Bus zweidimensionales Array für Eingang 0=0-7 1=val_id 2=aktuellerWert 3=alterWert
int i2c_out_1[8][3]={{0},{0},{0}}; //I2C-Bus zweidimensionales Array für Eingang 0=0-7 1=val_id 2=aktuellerWert 3=alterWert
//
void curl_senden (int var_id, char* var_val)
{
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_ALL);
/* get a curl handle */
curl = curl_easy_init();
//printf("
var_id= %d var_val= %s
",var_id,var_val);
if(curl) {
const int MAX_BUF =1000;
char* jsonObj = malloc(MAX_BUF);
sprintf(jsonObj,"{\"jsonrpc\": \"2.0\",\"method\":\"SetValue\",\"params\":[%i,%s],\"id\":1}",var_id,var_val);
printf("JSON-String= %s gesandt
",jsonObj);
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Accept: application/json");
headers = curl_slist_append(headers, "Content-Type: application/json");
headers = curl_slist_append(headers, "charsets: utf-8");
curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.4.57:3777/api/"); //hier IP-Adresse-Port
curl_easy_setopt(curl, CURLOPT_USERPWD, "username:password"); //hier username+password
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonObj);
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s
",
curl_easy_strerror(res));
/* always cleanup */
curl_easy_cleanup(curl);
}
curl_global_cleanup();
printf("
");
return;
}
int lifebit (void) //
{
printf("
Lifebit-Thread gestartet
");
int x=1,LifeBit=30123;
for(;;)
{
x=abs(x-1);
if (x==1) var_val="true";
else var_val="false";
curl_senden(LifeBit,var_val);
delay(30000); //alle 10 Sekunden
}
return 0;
printf("GPIO-Ueberwachung-Thread beendet
");
pthread_exit((void *) 0);
}
int gpio_thread (void) //
{
printf("
GPIO-Ueberwachung-Thread gestartet
");
int i;
for(;;)
{
for(i=0;i<=6;i++) //6Output-Ports GPIO 0-7 (7 wäre 1-Wire)
{
GPIO_PIN[i][1]=digitalRead(i); //Liest GPIO-PINs in Array
if (GPIO_PIN[i][2]!=GPIO_PIN[i][1]) {
if (GPIO_PIN[i][1]==1) var_val="true";
else var_val="false";
printf("
GPIO-Pin hat sich geaendert GPIO_%d=%d -> senden
",i,GPIO_PIN[i][2]);
// printf("
WerteGändert: %d %d %d
",GPIO_PIN[i][0],GPIO_PIN[i][1],GPIO_PIN[i][2]);
curl_senden(GPIO_PIN[i][0],var_val);
}
GPIO_PIN[i][2]=GPIO_PIN[i][1];
// printf("
Werte: %d %d %d
",GPIO_PIN[i][0],GPIO_PIN[i][1],GPIO_PIN[i][2]);
}
for(i=11;i<=12;i++) //(MISO(13)) (7.Relais) und (MOSI(12)) (8.Relais)
{
GPIO_PIN[i][1]=digitalRead(i); //Liest GPIO-PINs in Array
if (GPIO_PIN[i][2]!=GPIO_PIN[i][1]) {
if (GPIO_PIN[i][1]==1) var_val="true";
else var_val="false";
printf("
GPIO-Pin hat sich geaendert GPIO_%d=%d -> senden
",i,GPIO_PIN[i][2]);
// printf("
WerteGändert: %d %d %d
",GPIO_PIN[i][0],GPIO_PIN[i][1],GPIO_PIN[i][2]);
curl_senden(GPIO_PIN[i][0],var_val);
delay(20);
}
GPIO_PIN[i][2]=GPIO_PIN[i][1];
// printf("
Werte: %d %d %d
",GPIO_PIN[i][0],GPIO_PIN[i][1],GPIO_PIN[i][2]);
}
delay(100); //zur Stabilität nötig (sonst Aufruf doppelt/dreifach)
}
return 0;
printf("GPIO-Ueberwachung-Thread beendet
");
pthread_exit((void *) 0);
}
void i2c_eingaenge1 (void)
{
printf("I2C-Eingaenge1 Thread gestartet
");
int i;
for (;;) //Endlosschleife
{
//printf("Eingaenge1 ist jetzt wieder wach!%d
",j);
int dezzahl1;
dezzahl1=wiringPiI2CRead (fd1);
//printf("READ: %i
", dezzahl1);
if (dezzahl1>=128) i2c_in_1[7][1]=1; else i2c_in_1[7][1]=0;
if (dezzahl1%128>=64) i2c_in_1[6][1]=1; else i2c_in_1[6][1]=0;
if (dezzahl1%64>=32) i2c_in_1[5][1]=1; else i2c_in_1[5][1]=0;
if (dezzahl1%32>=16) i2c_in_1[4][1]=1; else i2c_in_1[4][1]=0;
if (dezzahl1%16>=8) i2c_in_1[3][1]=1; else i2c_in_1[3][1]=0;
if (dezzahl1%8>=4) i2c_in_1[2][1]=1; else i2c_in_1[2][1]=0;
if (dezzahl1%4>=2) i2c_in_1[1][1]=1; else i2c_in_1[1][1]=0;
if (dezzahl1%2>=1) i2c_in_1[0][1]=1; else i2c_in_1[0][1]=0;
for(i=0;i<=7;i++)
{
if (i2c_in_1[i][2]!=i2c_in_1[i][1]) {
if (i2c_in_1[i][1]==0) var_val="true"; //negative Logik
else var_val="false";
printf("
i2c_in_1-Pin hat sich geaendert i2c_in_1_%d=%d -> senden
",i,i2c_in_1[i][2]);
// printf("
WerteGändert: %d %d %d
",i2c_in_1[i][0],i2c_in_1[i][1],i2c_in_1[i][2]);
curl_senden(i2c_in_1[i][0],var_val);
delay(20);
}
i2c_in_1[i][2]=i2c_in_1[i][1]; //alten Wert setzen
}
//Stabilität Delay
delay(100);
}
printf("I2C-Eingaenge1 Thread beendet
");
pthread_exit((void *) 0);
}
void i2c_eingaenge2 (void)
{
printf("I2C-Eingaenge2 Thread gestartet
");
int i;
for (;;) //Endlosschleife
{
//printf("Eingaenge1 ist jetzt wieder wach!%d
",j);
int dezzahl2;
dezzahl2=wiringPiI2CRead (fd2);
//printf("READ: %i
", dezzahl1);
if (dezzahl2>=128) i2c_in_2[7][1]=1; else i2c_in_2[7][1]=0;
if (dezzahl2%128>=64) i2c_in_2[6][1]=1; else i2c_in_2[6][1]=0;
if (dezzahl2%64>=32) i2c_in_2[5][1]=1; else i2c_in_2[5][1]=0;
if (dezzahl2%32>=16) i2c_in_2[4][1]=1; else i2c_in_2[4][1]=0;
if (dezzahl2%16>=8) i2c_in_2[3][1]=1; else i2c_in_2[3][1]=0;
if (dezzahl2%8>=4) i2c_in_2[2][1]=1; else i2c_in_2[2][1]=0;
if (dezzahl2%4>=2) i2c_in_2[1][1]=1; else i2c_in_2[1][1]=0;
if (dezzahl2%2>=1) i2c_in_2[0][1]=1; else i2c_in_2[0][1]=0;
for(i=0;i<=7;i++)
{
if (i2c_in_2[i][2]!=i2c_in_2[i][1]) {
if (i2c_in_2[i][1]==0) var_val="true"; //negative Logik
else var_val="false";
printf("
i2c_in_1-Pin hat sich geaendert i2c_in_1_%d=%d -> senden
",i,i2c_in_2[i][2]);
// printf("
WerteGändert: %d %d %d
",i2c_in_2[i][0],i2c_in_2[i][1],i2c_in_2[i][2]);
curl_senden(i2c_in_2[i][0],var_val);
delay(20);
}
i2c_in_2[i][2]=i2c_in_2[i][1]; //alten Wert setzen
}
//Stabilität Delay
delay(100); //um Schreiben in Modbus zu ermöglichen
}
printf("I2C-Eingaenge2 Thread beendet
");
pthread_exit((void *) 0);
}
void i2c_ausgaenge1 (void)
{
printf("I2C-Ausgaenge1 Thread gestartet
");
int i;
for (;;) //Endlosschleife
{
//printf("Eingaenge1 ist jetzt wieder wach!%d
",j);
int dezzahl2;
dezzahl2=wiringPiI2CRead (fd3);
//printf("READ: %i
", dezzahl1);
if (dezzahl2>=128) i2c_out_1[7][1]=1; else i2c_out_1[7][1]=0;
if (dezzahl2%128>=64) i2c_out_1[6][1]=1; else i2c_out_1[6][1]=0;
if (dezzahl2%64>=32) i2c_out_1[5][1]=1; else i2c_out_1[5][1]=0;
if (dezzahl2%32>=16) i2c_out_1[4][1]=1; else i2c_out_1[4][1]=0;
if (dezzahl2%16>=8) i2c_out_1[3][1]=1; else i2c_out_1[3][1]=0;
if (dezzahl2%8>=4) i2c_out_1[2][1]=1; else i2c_out_1[2][1]=0;
if (dezzahl2%4>=2) i2c_out_1[1][1]=1; else i2c_out_1[1][1]=0;
if (dezzahl2%2>=1) i2c_out_1[0][1]=1; else i2c_out_1[0][1]=0;
for(i=0;i<=7;i++) //Input 3-7 mit EinzelMeldungen belegt (alle belegt)
{
if (i2c_out_1[i][2]!=i2c_out_1[i][1]) {
if (i2c_out_1[i][1]==0) var_val="true"; //negative Logik
else var_val="false";
printf("
i2c_out_1-Pin hat sich geaendert i2c_out_1%d=%d -> senden
",i,i2c_out_1[i][2]);
// printf("
WerteGändert: %d %d %d
",i2c_out_1[i][0],i2c_out_1[i][1],i2c_out_1[i][2]);
curl_senden(i2c_out_1[i][0],var_val);
delay(20);
}
i2c_out_1[i][2]=i2c_out_1[i][1]; //alten Wert setzen
}
//Stabilität Delay
delay(100); //um Schreiben in Modbus zu ermöglichen
}
printf("I2C-Eingaenge2 Thread beendet
");
pthread_exit((void *) 0);
}
int gpio_init(void)
{
printf ("GPIO Init
") ;
int n;
if (wiringPiSetup () == -1) //Startet Wiring API - wichtig
return 1; //return von wiringPi
//Initialisierung
GPIO_PIN[0][0]=39331; //
GPIO_PIN[1][0]=50705; //
GPIO_PIN[2][0]=37099; //n.B.
GPIO_PIN[3][0]=55615; //n.B.
GPIO_PIN[4][0]=59727; //n.B.
GPIO_PIN[5][0]=36450; //n.B.
GPIO_PIN[6][0]=32653; //
GPIO_PIN[12][0]=26939; //MOSI
GPIO_PIN[13][0]=44638; //MISO
for(n=0;n<=6;n++) pinMode(n, OUTPUT); //PIN7 (entspricht auch GPIO7 ist für 1-Wire genutzt)
pinMode(12,OUTPUT); //entspricht in Konsole "gpio mode 12 out"
pinMode(13,OUTPUT); //entspricht in Konsole "gpio mode 13 out"
//
i2c_in_1[0][0]=26057; //00
i2c_in_1[1][0]=43699;
i2c_in_1[2][0]=48692;
i2c_in_1[3][0]=20600;
i2c_in_1[4][0]=23055;
i2c_in_1[5][0]=53358;
i2c_in_1[6][0]=27936;
i2c_in_1[7][0]=27534; //70
//
i2c_in_2[0][0]=12723; //00
i2c_in_2[1][0]=47937;
i2c_in_2[2][0]=33003;
i2c_in_2[3][0]=13296;
i2c_in_2[4][0]=41542;
i2c_in_2[5][0]=56398;
i2c_in_2[6][0]=42606;
i2c_in_2[7][0]=36428;
//
//
//
if((fd1=wiringPiI2CSetup(dID1))<0){
printf("error opening i2c channel Eingabekarte-1
\r");
}
if((fd2=wiringPiI2CSetup(dID2))<0){
printf("error opening i2c channel Eingabekarte-1
\r");
}
if((fd3=wiringPiI2CSetup(dID3))<0){
printf("error opening i2c channel Ausgabekarte-1
\r");
}
delay(100);
if((e=wiringPiI2CWrite(fd3,0))<0) { //initial auf Null - wichtig
printf("error writing to slave
\r");
} //Ende I2C RELAISKARTE
//
i2c_out_1[0][0]=55868;
i2c_out_1[1][0]=37960;
i2c_out_1[2][0]=15286;
i2c_out_1[3][0]=50020;
i2c_out_1[4][0]=24998;
i2c_out_1[5][0]=47589;
i2c_out_1[6][0]=10178;
i2c_out_1[7][0]=50968;
//
return 1;
}
int main(void)
{
gpio_init();
printf( "Raspi-Symcon-Dienst gestartet ....
");
//
if(pthread_create(&t1, NULL, (void *)&gpio_thread,NULL) != 0)
{
fprintf(stderr, "Fehler bei gpio_thread 1....
");
exit(0);
}
if(pthread_create(&t2, NULL, (void *)&i2c_eingaenge1,NULL) != 0)
{
fprintf(stderr, "Fehler bei Thread 2 I2C-Eingaenge 1.....
");
exit(0);
}
if(pthread_create(&t3, NULL, (void *)&i2c_eingaenge2,NULL) != 0)
{
fprintf(stderr, "Fehler bei Thread 3 I2C-Eingaenge 2.....
");
exit(0);
}
if(pthread_create(&t4, NULL, (void *)&lifebit,NULL) != 0)
{
fprintf(stderr, "Fehler bei Thread 4 LifeBit.....
");
exit(0);
}
if(pthread_create(&t5, NULL, (void *)&i2c_ausgaenge1,NULL) != 0)
{
fprintf(stderr, "Fehler bei Thread 5 I2C-Ausgabekarte 1.....
");
exit(0);
}
for(;;)
{
delay(1500); //ohne delay Prozessorleistung 100%
}
return 0;
}
mehr quick & dirty - funktioniert aber ;-)))))