Wie das funktioniert steht im Link Deines ersten Beitrags -> http://bradsrpi.blogspot.de/2013/12/c-prog…ure-from-1.html <- ... schon wieder vergessen?
cu,
-ds-
Anfänger 1-wire DS1820
-
martin66119 -
26. Mai 2015 um 23:15 -
Erledigt
-
-
Anfänger 1-wire DS1820? Schau mal ob du hier fündig wirst!
-
Oh, Da steht was drin. Muss ich am Wochenende mal schauen was da steht und wie das geht.
Vielen Dank für die Hilfe
Martin -
So ich war im Urlaub und bin jetzt erst wieder dazu gekommen. Ich muß zugeben das ich null Ahnung von c bzw c++ habe. Nur ein wenig php selbst beigebracht. Ich hab den Link mal betrachtet. Das sah vielversprechend aus und ich hab mir das mal umgeschieben. Momenten funktioniert das auch. Fehlt noch das schreiben in eine mysql-Datenbank.
C
Alles anzeigen#include <stdio.h> #include <dirent.h> #include <string.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> int main (void) { DIR *dir; struct dirent *dirent; char dev[16]; // Dev ID char devPath[128]; // Path to device char buf[256]; // Data from device char tmpData[6]; // Temp C * 1000 reported by device char path[] = "/sys/bus/w1/devices"; ssize_t numRead; dir = opendir (path); if (dir != NULL) { while ((dirent = readdir (dir))) // 1-wire devices are links beginning with 28- if (dirent->d_type == DT_LNK && strstr(dirent->d_name, "28-") != NULL) { strcpy(dev, dirent->d_name); sprintf(devPath, "%s/%s/w1_slave", path, dev); int fd = open(devPath, O_RDONLY); if((numRead = read(fd, buf, 256)) > 0) { strncpy(tmpData, strstr(buf, "t=") + 2, 5); float tempC = strtof(tmpData, NULL); printf("Device: %s - ", dev); printf("Temp: %.3f C ", tempC / 1000); printf("%.3f F\n\n", (tempC / 1000) * 9 / 5 + 32); } close(fd); } (void) closedir (dir); } else { perror ("Couldn't open the w1 devices directory"); return 1; } }
Ich will mal gucken das ich das umschreibe und integriere:Code
Alles anzeigen#include <mysql/mysql.h> #define DATABASE_NAME "aquarium" #define DATABASE_USERNAME "root" #define DATABASE_PASSWORD "xxxxxxx" MYSQL *mysql1; void mysql_connect (void) { //initialize MYSQL object for connections mysql1 = mysql_init(NULL); if(mysql1 == NULL) { fprintf(stderr, "%s\n", mysql_error(mysql1)); return; } //Connect to the database if(mysql_real_connect(mysql1, "localhost", DATABASE_USERNAME, DATABASE_PASSWORD, DATABASE_NAME, 0, NULL, 0) == NULL) { fprintf(stderr, "%s\n", mysql_error(mysql1)); } else { //printf("Database connection successful.\n"); } } void mysql_disconnect (void) { mysql_close(mysql1); //printf( "Disconnected from database.\n"); } void mysql_write (int Kanalnummer, int Istwert) { //vector times; //a vector of alarm times string SQL = ""; string sKanalnummer = to_string(Kanalnummer); string sIstwert = to_string(Istwert); SQL = "Update Istwertelicht SET Istwert = "; SQL = SQL + sIstwert; SQL = SQL + " where Kanalnummer = "; SQL = SQL + sKanalnummer; const char * cSQL = SQL.c_str(); cout << SQL << endl; if(mysql1 != NULL) { if (mysql_query(mysql1, cSQL)) { fprintf(stderr, "%s\n", mysql_error(mysql1)); return; } } }
Was muß ich unbedingt dabei beachten? Tips werden gerne angenommen. -
ist da jemand schon weiter gekommen?
-
Hallo und guten abend,
bin mal wieder zurück.
Folgenden Code habe ich hier und sonstwo im Netz gefunden. Wenn ich zwei 1wire angesteckt habe wird die ID beider ausgegeben aber leider nur 1 Temperatur. Was ist denn falsch.
Kann mir jemand helfen.
#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
#include <cstdio>
#include <dirent.h>using namespace std;
/* Entry Point */
int main (int argc, char **argv)
{
ifstream datei;
int temperatur;
int gefunden;
float variable1;
string teilstring;
string text;int abort = 0;
while ((abort != 1))
{
datei.open("/sys/bus/w1/devices/28-000003aa64a7/w1_slave", ios::in);
if ((datei.fail()))
{
cout << "Konnte datei nicht öffnen!";/* Man könnte hier auch break nehmen um die schleife abzubrechen. */
/* break; */
return 0;
}/* Zeiger Position immer auf 0, wir haben nur eine Zeile zum lesen ... */
datei.seekg (0, datei.beg);
while(!datei.eof())
{
getline(datei, text);
gefunden = text.find("YES",0);
if (gefunden >0)
{
getline(datei,text);
gefunden = text.find("t=",0);
teilstring = text.substr(gefunden+2);
temperatur = atoi(teilstring.c_str());
variable1 = ((float)temperatur) / 1000.0f;
cout << variable1 << "\n";
}
}
datei.close();
sleep(1);
char pfad[] = "/sys/bus/w1/devices/";
DIR *verzeichnis;
struct dirent *dateien;
verzeichnis = opendir(pfad);
while(dateien = readdir(verzeichnis))
{
cout << dateien->d_name << endl;
}}
//::getchar();return 0;
}Grüße und bereits Danke
Martin -
Guten Abend,
nun habe ich es, ich glaube.
#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
#include <cstdio>
#include <dirent.h>using namespace std;
int main (int argc, char **argv)
{
ifstream datei;
int temperatur;
int gefunden;
int abort = 0;
int counter = 0;
float variable1;string teilstring;
string text;
string TempAusgabe;
string sensor = "/sys/bus/w1/devices/";
char pfad[] = "/sys/bus/w1/devices/";DIR *verzeichnis;
struct dirent *dateien;
string pathArray[10];
verzeichnis = opendir(pfad);while(dateien = readdir(verzeichnis))
{
pathArray[counter] = sensor + dateien->d_name + "/w1_slave";
counter++;
}
counter--;while ((abort != 1))
{
for (int i = 3; i <= counter; i++)
{
datei.open(const_cast<char*> (pathArray[i].c_str()), ios::in);
if ((datei.fail()))
{
cout << "Konnte datei nicht öffnen!";
break;
return 0;
}/* Zeiger Position immer auf 0, wir haben nur eine Zeile zum lesen ... */
datei.seekg (0, datei.beg);
while(!datei.eof())
{
getline(datei, text);
gefunden = text.find("YES",0);
if (gefunden >0)
{
getline(datei,text);
gefunden = text.find("t=",0);
teilstring = text.substr(gefunden+2);
temperatur = atoi(teilstring.c_str());
variable1 = ((float)temperatur) / 1000.0f;
cout << "Temp_";
cout << i-2;
cout << " = ";
cout << variable1 << "\n";
}
}
datei.close();
}
sleep(1);
}
//getchar();
return 0;
} -
Hi Leute. Das Thema ist noch das selbe. Im moment bin ich soweit das die ersten Sensoren in die Datenbank geschrieben werden. Aber nach dem zweiten sensor hab ich einen Speicherehler.
C
Alles anzeigen#include <stdio.h> #include <dirent.h> #include <string.h> #include <string> #include <fcntl.h> #include <stdlib.h> #include <cstdlib> #include <unistd.h> #include <mysql/mysql.h> #include <iostream> #include <sstream> #define DATABASE_NAME "max" #define DATABASE_USERNAME "musterman" #define DATABASE_PASSWORD "1234" #define DATABASE_ADRESSE "extern" using namespace std; MYSQL *mysql1; void mysql_connect (void) { //initialize MYSQL object for connections mysql1 = mysql_init(NULL); if(mysql1 == NULL) { fprintf(stderr, "%s\n", mysql_error(mysql1)); return; } else { //Connect to the database if(mysql_real_connect(mysql1, DATABASE_ADRESSE, DATABASE_USERNAME, DATABASE_PASSWORD, DATABASE_NAME, 3306, NULL, 0) == NULL) { fprintf(stderr, "%s\n", mysql_error(mysql1)); } else { printf("Verbindung hergestellt /n/n"); } } } void mysql_disconnect (void) { mysql_close(mysql1); } void mysql_write (const char *Dev,char *Temp) { string SQL ; SQL = "INSERT INTO `"; SQL = SQL + Dev; SQL = SQL + "` ( `timestamp` , `temp` )"; // SQL = SQL + "\' "; SQL = SQL + " VALUES ( CURRENT_TIMESTAMP(), '"; // SQL = SQL + " VALUES ('"; SQL = SQL + Temp; SQL = SQL + "')"; const char* cSQL = SQL.c_str(); cout << SQL << endl; if(mysql1 != NULL) { if (mysql_query(mysql1, cSQL)) { fprintf(stderr, "%s\n", mysql_error(mysql1)); return; } } } int main (void) { DIR *dir; struct dirent *dirent; char dev[16]; // Dev ID char devPath[128]; // Path to device char buf[256]; // Data from device char tmpData[5]; // Temp C * 1000 reported by device char path[] = "/sys/bus/w1/devices"; char dev1[16]; float tmpData1; char tmpData2[6]; char strBuffer[256]; ssize_t numRead; mysql_connect () ; dir = opendir (path); if (dir != NULL) { while ((dirent = readdir (dir))) // 1-wire devices are links beginning with 28- if (dirent->d_type == DT_LNK && strstr(dirent->d_name, "28-") != NULL) { strcpy(dev, dirent->d_name); sprintf(devPath, "%s/%s/w1_slave", path, dev); int fd = open(devPath, O_RDONLY); if((numRead = read(fd, buf, 256)) > 0) { strncpy(tmpData, strstr(buf, "t=") + 2, 5); float tempC = strtof(tmpData, NULL); printf("Device: %s - ", dev); printf("Temp: %.2f C ", tempC / 1000); printf("%.3f F\n\n", (tempC / 1000) * 9 / 5 + 32); } tmpData1 = strtof(tmpData, NULL) / 1000; sprintf (tmpData2, "%.2f", tmpData1); mysql_write (dev,tmpData2); mysql_disconnect () ; close(fd); } (void) closedir (dir); } else { perror ("Couldn't open the w1 devices directory"); return 1; } }
Kompilieren ohne ProblemeCodeg++ -std=c++0x auslesen2.cpp -o auslesen -lwiringPi `mysql_config --cflags` `mysql_config --libs` -L/usr/lib/mysql -lmysqlclient
nach ausführen kommt folgene Fehler
CodeVerbindung hergestellt /n/nDevice: 28-0314656157ff - Temp: 85.00 C 185.000 F INSERT INTO `28-0314656157ff` ( `timestamp` , `temp` ) VALUES ( CURRENT_TIMESTAMP(), '85.00') Device: 28-031465856aff - Temp: 15.94 C 60.687 F INSERT INTO `28-031465856aff` ( `timestamp` , `temp` ) VALUES ( CURRENT_TIMESTAMP(), '15.94') [1] 12892 segmentation fault (core dumped) ./auslesen
weis da einer Rat. Wie gesagt. Ich Fange bei null an und hab nur ein wenig PHP und Linux Erfahrung ( auch selbst beigebracht)
-
Hallo mr-brain,
die 85 °C bringt der Sensor, wenn ihm irgendwas nicht passt. Meistens missfällt ihm die Spannungsversorgung, der Widerstand zwischen VCC und DQ oder ...
Hier hilft es nur, mit dem Widerstand zu experimentieren (ich nutze dazu einen Poti), die Leitungen zu prüfen (saubere Kontakte) oder die Kabel durch welche mit größerem Querschnitt zu ersetzen.
Beste Grüße
Andreas
-
-
Hallo. Ich wolte mich zurückmelden. Ich hab selber den Fehler gefunden. Die sql verbindung hatte ich an der falschen Stelle geschlossen. Jetzt brauch ich nur noch die tabellen wenn noch nicht erstelt, neu erstellen lassen. Sowie eine tabelle um den sensoren Räume und solltemperaturen zuweisen zu können.
-
Hallo,
im letzen Jahr hatte ich mit mit dem Code den ich im Netz gefunden hatte, einen DS1820 ausgelesen. Nun versuchs iczh mit dem selbigen Code wirde. Geht nicht. Als Port verwende ich GPIO4 zum einlesen des DS18B20.
Was habe ich geändert:
Damit ich über Python Werte des AD Wandlers MCP3008 habe ich die hierfür erforderlichen module geladen und den Rasppery so konfguriert, dass ich mit der import spidev die Werte einlesen kann.
In der Raspi-config habe unter Advance Options noch SPI enabled.Kommt sich die spidev und der GPIO4 in die Quere.
Grüße
Martin
Automatisch zusammengefügt:
Den GPIO7 verwende ich
Automatisch zusammengefügt:
Habe nun GPIO05 genommen und es klappt wieder. -
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!