Anfänger: Temperatursensoren auswerten

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
the3of5
Beiträge: 4
Registriert: Di Jul 08, 2014 7:37 pm

Anfänger: Temperatursensoren auswerten

Beitrag von the3of5 » Di Jul 08, 2014 10:15 pm

Hallo zusammen!

Ich bin leider in Programmierung noch blutiger Laie. :roll:
Dummerweise habe ich mir selbst nun eine anspruchsvolle Aufgabe gestellt:

Bis zu 8 Temperatursensoren auslesen und bei überschreiten einer vorgegebenen Temperatur einen Kommandozeilenbefehl absetzen.

Hintergründe:
Die Sensoren sind DS18B20 die über einen AT90USB162-Microchip per USB ausgelesen werden. Mit dem Kommandozeilenbefehl sollen dann an Gembird EG-PMS2 USB-Steckdosenleisten Geräte ausgeschaltet werden.
Das ganze soll eine Terrarien-Überwachung für 8 Terrarien werden, die Wärme-Beleuchtung (BrightSun-Lampen) eines Terrariums soll abgeschaltet werden, wenn eine gewisse Temperatur überschritten wird. Parallel hätte ich die Temperatur gerne auf einem PC-Bildschirm angezeigt. Ich habe kein Zeitlimit für dieses Projekt gesetzt, würde aber gerne im kommenden Frühjahr "fertig" werden können. :ugeek:

Das Programm soll letztlich wie folgt aussehen:
Auf einer GUI soll die Temperatur je Sensor angezeigt werden, als Zuordnung gerne mit Textfeldern davor. (z.B. "Terrarium 1: 25,6°C" )
Die Zieltemperatur für insgesamt 8 Sensoren soll separat eingestellt werden, je Sensor sollen 1-2 Steckdosen abgeschaltet werden, sobald diese Temperatur überschritten wird.
Dazu soll z.B. minütlich die Temperatur abgefragt werden und bei überschreiten des Zielwertes ein Kommandozeilen-Befehl abgesetzt werden.


Beruflich habe ich zwar mit der "Programmierung" von PC-Kassensystemen zu tun, deren "Programmiersprache" ist allerdings sehr einfach, da es nur um Position, Form, Farbe und Funktion von Schaltflächen geht. Ich hoffe aber, das kann mir das Erlernen einer richtigen Programmiersprache etwas erleichtern.

Vorerst möchte ich nur dieses Projekt schreiben, deshalb wünsche ich mir eher einen Quereinstieg, bei dem man mir erklärt, wie mein Programm etwa auszusehen hat und nach was für Programmcode ich suchen muss um oben genannte Wünsche zu erfüllen.
Ich bin der Typ "Learning by doing", Anfängerbücher oder Grundtutorials schaue ich mir zwar gerne an, sie bringen mich aber selten weiter....


Ohje, viel Text... :o
Ich hoffe, mir kann man mit ein paar Tipps helfen. Sollte mein Thread unpassend sein, bitte melden.
Vielen Dank schonmal! the3of5 :mrgreen:


Zum Schluss die vorhandene Technik:
Eine Steckdose der Steckdosenleisten kann ich in einer Batch-Datei z.B. mit diesem Befehl ausschalten:

Code: Alles auswählen

start "" "C:\Program Files\Power Manager\pm.exe" -off -Device1 -Socket1
Für die Sensoren habe ich unter anderem Sorcecode wie diesen bekommen, welcher lt. Hersteller mit GCC-Compiler unter Windows erstellt wurde:
Bisher kann ich damit noch nichts anfangen, ich habe vor, mit CodeBlocks zu arbeiten...

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

#if defined(OS_LINUX) || defined(OS_MACOSX)
  #include <sys/ioctl.h>
  #include <termios.h>
#elif defined(OS_WINDOWS)
  #include <conio.h>
#endif

#include "hid.h"
//*----------------------------------------------------------------------------
static char getkey(void);
//*----------------------------------------------------------------------------
int main()
{
	int i, r, num, temp;
	char c, buf[64], *pwr;

	r = rawhid_open(1, 0x16C0, 0x0480, 0xFFAB, 0x0200);
	if (r <= 0) {
		fprintf(stdout, "No Temp-Sensor found\n");
		return -1;
	}
	fprintf(stdout, "Found Temp-Sensor\n");

	while (1) {
		//....................................
		// check if any Raw HID packet has arrived
		//....................................
		num = rawhid_recv(0, buf, 64, 220);
		if (num < 0) {
			fprintf(stdout, "\nError Reading\n");
			rawhid_close(0);
			return 0;
		}
		
		if (num == 64) {
		  temp = *(short *)&buf[4];
		  if(buf[2]) { pwr = "Extern"; }
		        else { pwr = "Parasite"; }
		  fprintf(stdout, "Sensor #%d of %d: %+.1f\xF8""C Power: %-10s ID: ", 
		          buf[1], buf[0], temp / 10.0, pwr);
		  
			for (i = 0x08; i < 0x10; i++) {
				fprintf(stdout, "%02X ", (unsigned char)buf[i]);
			}
			fprintf(stdout, "\n");
		}
		//....................................
		// check if any input on stdin
		//....................................
		c = getkey();
		if(c == 0x1B) { return 0; }   // ESC
		if(c >= 32) {
			fprintf(stdout, "\ngot key '%c', sending...\n", c);
			buf[0] = c;
			for (i=1; i<64; i++) {
				buf[i] = 0;
			}
			rawhid_send(0, buf, 64, 100);
		}
	}
}
//*----------------------------------------------------------------------------
#if defined(OS_LINUX) || defined(OS_MACOSX)
// Linux (POSIX) implementation of _kbhit().
// Morgan McGuire, morgan@cs.brown.edu
static int _kbhit() {
	static const int STDIN = 0;
	static int initialized = 0;
	int bytesWaiting;

	if (!initialized) {
		// Use termios to turn off line buffering
		struct termios term;
		tcgetattr(STDIN, &term);
		term.c_lflag &= ~ICANON;
		tcsetattr(STDIN, TCSANOW, &term);
		setbuf(stdin, NULL);
		initialized = 1;
	}
	ioctl(STDIN, FIONREAD, &bytesWaiting);
	return bytesWaiting;
}
static char _getch(void) {
	char c;
	if (fread(&c, 1, 1, stdin) < 1) return 0;
	return c;
}
#endif
//*----------------------------------------------------------------------------
static char getkey(void)
{
	if (_kbhit()) {
		char c = _getch();
		if (c != 0) return c;
	}
	return 0;
}
//*----------------------------------------------------------------------------

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Anfänger: Temperatursensoren auswerten

Beitrag von cloidnerux » Di Jul 08, 2014 11:31 pm

Hallo zusammen!
Hi und Willkommen im Forum :D
Bis zu 8 Temperatursensoren auslesen und bei überschreiten einer vorgegebenen Temperatur einen Kommandozeilenbefehl absetzen.
Und ich denke sofort an arduino
Die Sensoren sind DS18B20 die über einen AT90USB162-Microchip per USB ausgelesen werden.
Warum der AT90USB162? Hast du da irgendein EVAL-Board oder so?
Ich würde ja generell einen Arduino empfehlen. So ein Nano bekommt man bei Ebay für 6$ aus China(mit Versand), es gibt fertigen Code für den DS18B20(hab ich schon benutzt), du hast einen COM-Port am Computer den man "einfach" auslesen und auswerten kann und es gibt zu allem einen Haufen Informationen.
Vorerst möchte ich nur dieses Projekt schreiben, deshalb wünsche ich mir eher einen Quereinstieg, bei dem man mir erklärt, wie mein Programm etwa auszusehen hat und nach was für Programmcode ich suchen muss um oben genannte Wünsche zu erfüllen.
Ich bin der Typ "Learning by doing", Anfängerbücher oder Grundtutorials schaue ich mir zwar gerne an, sie bringen mich aber selten weiter....
Kauf dir einen Arduino, vlt sogar so ein Starter Kit: Amazon Link zu einem starter Kit.
Damit kannst du dann ein wenig herum probieren.
Als nächstes versuchst du dann in einem Kommandozeilenprogramm über die serielle Schnittstelle mit dem Arduino zu verbinden. Dann kannst du dich etwas mit GUI versuchen.
Am Ende setzt du alles zusammen und hast dann fast was du willst.

Auch wenn du Tutorials nicht magst, lese sie dir durch und mache die Aufgaben am Ende. Es gibt nichts besseres als einfach drauf los zu programmieren!
Redundanz macht wiederholen unnötig.
quod erat expectandum

the3of5
Beiträge: 4
Registriert: Di Jul 08, 2014 7:37 pm

Re: Anfänger: Temperatursensoren auswerten

Beitrag von the3of5 » Mi Jul 09, 2014 8:49 am

Hallo und vielen Dank,

diesen Chip habe ich hier erstanden:
http://www.diamex.de/dxshop/USB-Tempera ... er-DS18B20
Die DS18B20 habe ich bereits.

Ursprünglich dachte ich auch eher an den Arduino, allerdings finde ich es dort klasse, dass ich im Endefekt nur noch das Programm schreiben muss. (Ich habe ja sogar bereits Sourcecode für's auslesen der Sensoren zur Verfügung.)

Das große Problem bei diesem Thema ist tatsächlich "nur" die Software, die meisten Programme sind nur auf das Aufzeichnen der Temperaturwerte ausgelegt. Mehrere Sensoren gleichzeitig auslesen und das ansteuern von mehreren "Relais" hingegen eher selten.
(Ich recherchiere nun schon einige Zeit herum)

Außerdem ist vieles auf Linux ausgelegt, ich hingegen hätte gerne ein Programm für Windows.
(Habe zwar etwas Erfahrung mit Linux, bin aber ein Windows-Fan *duck* )

Ja, ich habe vor, mir eure Tutorials auch anzueignen. (Ganz ohne geht es schließlich nicht :roll: )
Euch bitte ich darum, falls möglich, mir zumindest Tipps zu geben, wie ich meine Wünsche in Programmcode verwandeln kann.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Anfänger: Temperatursensoren auswerten

Beitrag von cloidnerux » Mi Jul 09, 2014 9:21 am

Ursprünglich dachte ich auch eher an den Arduino, allerdings finde ich es dort klasse, dass ich im Endefekt nur noch das Programm schreiben muss.
Wobei es nicht schadet, zu wissen woher die Daten kommen, wie sie übertragen werden und was man damit machen kann.
Das große Problem bei diesem Thema ist tatsächlich "nur" die Software, die meisten Programme sind nur auf das Aufzeichnen der Temperaturwerte ausgelegt. Mehrere Sensoren gleichzeitig auslesen und das ansteuern von mehreren "Relais" hingegen eher selten.
Du wirst in der Regel nie genau das finden, was du suchst, würde ja auch das selber Programmieren sinnlos machen.

Aber dein Problem ist nicht so kompliziert, wie du es dir machst.
Wenden wir das Prinzip "Teile und Herrsche an":
Du hast einen Teil Temperatursensoren auslesen. 8 gleiche Sensoren, das gibt halt 8 werte. Das Auslesen pro Sensor ist aber gleich, das Speichern des Wertes ist gleich, du musst es nur 8 mal machen für jeden Sensor.
Dann hast du eine "Ausgabe", das schalten von Relais. Jedes Relais wird mit der selben Methodik geschaltet.
Fehlt nur noch das dazwischen. Du hast die Bedingung: Wenn Temperatur x größer n, dann Schalte Relais x an, ansonsten aus. Das ist mitunter in 4 Zeilen Code lösbar.
Wende diese Methodik für jeden Sensor an und Prüfe zyklisch ob die Bedingung erfüllt ist.
Das ist dein Programm, aber noch ohne Grafische Oberfläche.
Euch bitte ich darum, falls möglich, mir zumindest Tipps zu geben, wie ich meine Wünsche in Programmcode verwandeln kann.
Mein Tipp: Hör auf zu recherchieren, gehe jetzt sofort zu http://www.proggen.org/doku.php?id=c:software, richte dir deinen Compiler ein und arbeite die ersten Lektionen durch.
Redundanz macht wiederholen unnötig.
quod erat expectandum

the3of5
Beiträge: 4
Registriert: Di Jul 08, 2014 7:37 pm

Re: Anfänger: Temperatursensoren auswerten

Beitrag von the3of5 » Mi Jul 09, 2014 11:49 am

CodeBlocks ist installiert. (Vollinstallation inkl. GCC)
Habe auch vor, in den nächsten Wochen eure Tutorials durchzumachen...

Sagen wir es mal so:
Mir fehlt eben "das dazwischen".
Und genau dafür wären mir Codebeispiele oder eine Seite mit Code-Sammlungen hilfreich.
Schließlich weiß ich noch nicht, wie "If x größer n, dann Schalte Relais X" in C oder C++ "heißt".

Das ich viel ausprobieren muss und ich für mein "Wunschprogramm" sicher noch eine Weile brauche, ist mir schon klar...
Eine GUI ist zunächst "optional", wenn ich die Grundfunktionalität habe, kann ich mich dann mit dem Aufbau einer GUI und der Integration beschäftigen.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Anfänger: Temperatursensoren auswerten

Beitrag von cloidnerux » Mi Jul 09, 2014 12:04 pm

Und genau dafür wären mir Codebeispiele oder eine Seite mit Code-Sammlungen hilfreich.
Schließlich weiß ich noch nicht, wie "If x größer n, dann Schalte Relais X" in C oder C++ "heißt".
Und genau hier stehst du dir selber im weg. Die dritte Lektion nach "Hello World"(dem Einstieg): http://www.proggen.org/doku.php?id=c:tutorial:decisions
Da lernst du das sich so eine Abfrage so realisieren lässt:

Code: Alles auswählen

if(x > n)
{
    SchalteRelais(RELAIS_1, 1);
}
else
{
    SchalteRelais(RELAIS_1, 0);
}
sofern du dir eine Funktion "SchalteRelais" definiert hast, die eine Angabe über die Relais-Nummer(Konstante RELAIS_1) und den Schaltzustand(0 = Aus, 1 = An) entgegen nimmt.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Anfänger: Temperatursensoren auswerten

Beitrag von Bebu » Mi Jul 09, 2014 4:02 pm

Ich habe jetzt nicht alles gelesen, also sorry, wenn ich danebenliege. Aber du könntest dir auch noch das hier ansehen: http://www.tinkerforge.com
Die Preise sind allerdings nicht gerade niedrig.

Gruß Bebu
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

the3of5
Beiträge: 4
Registriert: Di Jul 08, 2014 7:37 pm

Re: Anfänger: Temperatursensoren auswerten

Beitrag von the3of5 » Fr Jul 11, 2014 6:42 pm

hm, diese Lösung ist mir doch etwas zu Teuer...
Bisher bin ich mit knapp 80,- echt gut dabei! (Inkl. einer Steckdosenleiste)

PS: Eine fertige Embedded-Lösung die sowas kann, kostet übrigens über 300,- € und lässt sich nicht am PC steuern...
Bebu hat geschrieben:Ich habe jetzt nicht alles gelesen, also sorry, wenn ich danebenliege. Aber du könntest dir auch noch das hier ansehen: http://www.tinkerforge.com
Die Preise sind allerdings nicht gerade niedrig.

Gruß Bebu

Antworten