Hallo, ich möchte meine griffheizung mit dem nano, einem dallas temp-sensor und einem relais ansteuern. es klappt mit folgendem code einfach nicht. findet jemand den fehler? danke im vorraus. #include <SerialRelay.h> #include <DallasTemperature.h> #include <OneWire.h> #define ONE_WIRE_BUS 2 #define RELAY_HIGH 0 #define RELAY_LOW 1 #define Relais_1 4 int Sensor = 2; OneWire ourWire(ONE_WIRE_BUS); DallasTemperature sensors(&ourWire); void setup() { delay(1000); Serial.begin(9600); Serial.println("Temperatur Messprogramm"); Serial.println("TWTemp 1.0 vom 14.06.2013"); Serial.println("http://www.wenzlaff.de"); delay(1000); pinMode (Relais_1 , OUTPUT); digitalWrite(Relais_1, RELAY_LOW); delay(2000); sensors.begin(); adresseAusgeben(); Serial.print("Starte Temperatur abfragen ..."); } void loop() { Serial.println(); sensors.requestTemperatures(); Serial.print(sensors.getTempCByIndex(0) ); Serial.print(" Grad Celsius"); } void adresseAusgeben(void) { byte i; byte present = 0; byte data[12]; byte addr[8]; Serial.print("Suche 1-Wire-Devices...\n\r"); while (ourWire.search(addr)) { Serial.print("\n\r\n\r1-Wire-Device gefunden mit Adresse:\n\r"); for ( i = 0; i < 8; i++) { Serial.print("0x"); if (addr[i] < 16) { Serial.print('0'); } Serial.print(addr[i], HEX); if (i < 7) { Serial.print(", "); } } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.print("CRC is not valid!\n\r"); return; } } Serial.println(); ourWire.reset_search(); return; if (Sensor <=5) { digitalWrite(Relais_1, HIGH); delay(10000); digitalWrite(Relais_1, LOW); delay(1000); } if (Sensor >5) { digitalWrite(Relais_1, HIGH); delay(8000); digitalWrite(Relais_1, LOW); delay(2000); } if (Sensor <=15) { digitalWrite(Relais_1, HIGH); delay(6000); digitalWrite(Relais_1, LOW); delay(4000); } if (Sensor > 15) { digitalWrite(Relais_1, HIGH ); delay(1000); digitalWrite(Relais_1, LOW); delay(10000); } }
Es klappt einfach nicht? Geht das präziser? Klappt die serielle Verbindung? Wird der Temperatursensor gefunden? Gibt der eine Temperatur an? Schaltet das Relais? Generell überlege mal was deine if-Schleifen machen, wenn ein Argument zutrifft und es abgefrühstückt ist und das nächste zutrifft. Es heizt mehrmals. Ist das so gewollt? Generell solltest du dich auf ein Zweipunktregler beschränken oder PID. (Mal angenommen die Homepage gehört dir dann solltest du ja von Softwaretechnik und Debugging doch etwas kenne haben. Ab und zu verstehe ich echt nicht wo alle studiert haben)
:
Bearbeitet durch User
Außerdem sollte eine Methode mit dem Namen "adresseAusgeben" auch nur ebendieses machen, und nicht plötzlich auch noch eine Temperaturregelung beinhalten. Das macht das lesen und verstehen des Programmablaufs deutlich einfacher.
>> if-Schleifen > Was ist das??? Das kommt, wenn man geschleifte Klammern verwendet. :-)
Dein Programm ist "etwas" unstrukturiert und durcheinander, allerdings kenne ich mich mit den Arduinos nicht so aus. Was mir aufgefallen ist: Der Teil in "adresseAusgeben", der die Heizleistung einstellt (wenn auch falsch), wird niemals aufgerufen - vorher steht die Anweisung "return" für eine Rückkehr (zu "setup"). Als Hauptschleife soll vermutlich "loop" laufen - dort wird aber gar keine Regelung durchgeführt. Damit kann keine Heizung aktiv werden... Ahoi, Martin
DocMartin schrieb: > allerdings kenne ich mich mit den Arduinos nicht so aus DocMartin schrieb: > Als Hauptschleife soll vermutlich "loop" laufen Ja, das ist bei den Arduinos so. setup() wird einmalig beim start aufgerufen, danach dann loop(), und das ist im Prinzip eine while(1){} Schleife... das return; in adresseAusgeben() ist das Problem. Und dann sollte es im Folgenden wohl eher } else if (Sensor ...) { heissen...
Der Nano ist ja recht klein und würde vielleicht direkt in den Griff passen. Wenn Du ihn mit 8-10V statt 5V betreibst, wird er schön warm und Du brauchst keine Software mehr schreiben... Sorry, aber es ist der 1. April...
Stefan U. schrieb: > Das kommt, wenn man geschleifte Klammern verwendet. :-) Jawoll! - Wieder was über C gelernt... Dein Humor gefällt mir... ...
Ja die Temperatur wird angezeigt. Aber das Relais Schaltet nicht bei den verschiedenen Temperaturen. Habe es jetzt so mal versucht.Aber auch das geht nicht. Habe Montag prüfung, da muss das laufen. #include <SerialRelay.h> #include <DallasTemperature.h> #include <OneWire.h> #define ONE_WIRE_BUS 2 #define RELAY_1 4 int Temperatur1[5] = {11, 12, 13, 14, 15}; int Temperatur2[5] = {6, 7, 8, 9, 10}; int Temperatur3[5] = {1, 2, 3, 4, 5}; OneWire ourWire(ONE_WIRE_BUS); DallasTemperature sensors(&ourWire); void setup() { pinMode(RELAY_1, OUTPUT); pinMode(ONE_WIRE_BUS, OUTPUT); delay(1000); Serial.begin(9600); Serial.println("Temperatur Messprogramm"); Serial.println("TWTemp 1.0 vom 14.06.2013"); Serial.println("http://www.wenzlaff.de"); delay(1000); delay(2000); sensors.begin(); adresseAusgeben(); Serial.print("Starte Temperatur abfragen ..."); } void loop() { Serial.println(); sensors.requestTemperatures(); Serial.print(sensors.getTempCByIndex(0) ); Serial.print(" Grad Celsius"); } void adresseAusgeben(void) { byte i; byte present = 0; byte data[12]; byte addr[8]; Serial.print("Suche 1-Wire-Devices...\n\r"); while (ourWire.search(addr)) { Serial.print("\n\r\n\r1-Wire-Device gefunden mit Adresse:\n\r"); for ( i = 0; i < 8; i++) { Serial.print("0x"); if (addr[i] < 16) { Serial.print('0'); } Serial.print(addr[i], HEX); if (i < 7) { Serial.print(", "); } } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.print("CRC is not valid!\n\r"); return; } } Serial.println(); ourWire.reset_search(); return; if (ONE_WIRE_BUS == Temperatur1) { digitalWrite(RELAY_1, HIGH); delay(1000); digitalWrite(RELAY_1, LOW); delay(10000); } if (ONE_WIRE_BUS == Temperatur2) { digitalWrite(RELAY_1, HIGH); delay(6000); digitalWrite(RELAY_1, LOW); delay(3000); } if (ONE_WIRE_BUS == Temperatur3) { digitalWrite(RELAY_1, HIGH); delay(1000); digitalWrite(RELAY_1, LOW); delay(10000); } else(LOW); }
Liest du auch, was man dir hier schreibt? void loop() wird als Endlosschleife ausgeführt. In dieser Endlosschleife fragst du die Temperatur ab, und gibst sie aus. Wo sollte hier das Relais geschaltet werden? Der einzige Code, der dies tut, ist in adresseAusgeben(), und diese Funktion wird nur einmalig aus setup() heraus aufgerufen. Allerdings ist hier immer noch das "return;" mitten in der Funktion. D.h. die Ausführung der Zeilen nach "return;" passiert nie. Auch nicht einmalig.
:
Bearbeitet durch User
Canada Parro schrieb: > Habe Montag prüfung, da muss das laufen. Na, dann schau dir mal dringend C-Grundlagen an. Nur mit kopieren und irgendetwas "reinklatschen" wird das vermutlich nicht funktionieren. Du solltest schon wissen, was Du da programmierst.
Die ganze Regelung würde ich eh nochmal überdenken. Eigentlich reicht es, die Heizug einzuschalten, wenn die Temperatur unter dem Soll liegt, und wieder auszuschalten, wenn sie ein paar Grad über Soll ist. Bonbon gelutscht. Oder befindet sich der Sensor nicht im Griff?
:
Bearbeitet durch User
Joe F. schrieb: > Liest du auch, was man dir hier schreibt? Ja lese ich. Aber ich verstehe kein Wort. Bin blutiger Anfänger. Dieter F. schrieb: > Na, dann schau dir mal dringend C-Grundlagen an. Hab ich auch gemacht und versucht umzusetzen. Joe F. schrieb: > Oder befindet sich der Sensor nicht im Griff? Nein, der Sensor misst die Außentemperatur und soll die Griffheizung steuern. Je nachdem wie kalt es ist, soll das Relais unterschiedlich lang öffnen.
Canada Parro schrieb: > Hab ich auch gemacht und versucht umzusetzen. Du hast dich zu wenig damit beschäftigt. z.B. die Zeile if (ONE_WIRE_BUS == Temperatur1) ist absoluter Quatsch. Was ist denn "ONE_WIRE_BUS"? 2, denn: #define ONE_WIRE_BUS 2 Dann vergleichst du diese 2 mit einem Pointer, denn Temperatur1 hast du definiert: int Temperatur1[5] = {11, 12, 13, 14, 15}; "Temperatur1" ist dann die Adresse des ersten Array-Elements im Speicher. Du vergleichst also eine Speicheradresse mit der Zahl 2. Was für eine Prüfung ist denn das am Montag? Programmieren?
:
Bearbeitet durch User
Joe F. schrieb: > Was für eine Prüfung ist denn das am Montag? > Programmieren? Das ist eigentlich vollkommen egal. Mit dem, was er hier gezeigt hat, gibt es nur eine sinnvolle Option fuer alle Beteiligten: Durchfallen lassen. wendelsberg
wendelsberg schrieb: > Das ist eigentlich vollkommen egal. Nein, ist es nicht. Wenn TO z.B. Produktdesigner ist, und er möchte seinen Prototypen vorführen, dann muss er von Pointern keine Ahnung haben. Wenn er aber gut programmieren können soll, dann schließe ich mich dir an.
Joe F. schrieb: > Wenn TO z.B. Produktdesigner ist, und er möchte seinen Prototypen > vorführen, dann muss er von Pointern keine Ahnung haben. Wenn er ein Hilfsmittel (einen Arduino) einsetzen will um sein Ziel zu erreichen muss er entweder das Hilfsmittel ausreichend beherrschen oder fertig zukaufen. Wir reden nicht von Pointern ... sondern von Arrays, Variablen und Vergleichen -> C-Grundlagen. Hier wurde nur irgend etwas zusammenkopiert - in der Hoffnung es funktioniert oder es findet sich ein motivierter Helfer, der es passend macht. Kannst ja gerne helfen ... Wobei das "Konzept", die Heizung ausschließlich von der Umgebungstemperatur abhängig zu machen, eine "heiße Geschichte" ist :-). Das Produkt möchte ich nicht "in die Hände" bekommen ....
Ok, kurzer Hintergrund: Ich mache meine Prüfung zum Motorradmechaniker-Meister. Als Vorgabe war halt eine Griffheizung mit Arduino temperaturabhängig zu steuern. Das hat auch geklappt mit einem analogen Sensor. Der ist leider kaputt und nun habe ich einen digitalen. Und damit klappt es nun nicht mehr. Die blöden Sprüche hier kann man sich sparen. Ich suche wirklich einen netten Helfer. Habe mich gegenüber meinem Dozenten schon genug aufgeregt weil ich hier nicht zum Thema IT weitergebildet werde. Und ob der Prüfungsausschuss das selber einmal getestet hat. Als Kundenauftrag würde ich sowas nie annehmen da es sowas wirklich schon zu kaufen gibt. @ Joe F.: Was muss ich denn als Bezugspunkt nehmen um das Relais zu schalten? if (??? == Temperatur1)
Canada Parro schrieb: > Die blöden Sprüche hier kann man sich sparen. Das ist leider im Forum hier so, hat aber auch viele Fragende, welche zu faul sind selbst was zu machen... Ich glaubs dir mal, das müsste in etwa so funktionieren, nicht getestet, dafür kommentiert ;-)
1 | // Auf welche Temperatur aufgeheizt werden soll
|
2 | float sollTemperatur = 30; |
3 | |
4 | void loop() { |
5 | // Temperatur vom Sensor anfragen
|
6 | sensors.requestTemperatures(); |
7 | |
8 | // Temperature vom Ersten sensor lesen, und speichern in "temperatur"
|
9 | float temperatur = sensors.getTempCByIndex(0); |
10 | |
11 | |
12 | // Ausgeben auf der Seriellen Schnittstelle, Siehst du in der Arduino IDE
|
13 | // im "Seriellen Monitor"
|
14 | Serial.print("Temperatur ist "); |
15 | Serial.println(temperatur); |
16 | |
17 | // Wenn die Temperatur kleiner ist als die Solltemperatur...
|
18 | if (temperatur < sollTemperatur) { |
19 | // ... Heinzung einschalten
|
20 | digitalWrite(Relais_1, HIGH); |
21 | Serial.println("Heizung ein"); |
22 | |
23 | // Wenn die Temperatur 2°C wärmer ist als die Solltemperatur...
|
24 | } else if (temperatur > sollTemperatur + 2) { |
25 | // ... ausschahlten
|
26 | digitalWrite(Relais_1, LOW); |
27 | Serial.println("Heizung aus"); |
28 | }
|
29 | |
30 | // Nur alle 2 Sekunden messen und Debug Ausgabe machen...
|
31 | delay(2000); |
32 | }
|
Wenn du direkt bei der Solltemperatur ein / ausschaltest, könntest du genau auf dem Kipppunkt landen, und das Relais würde die ganze Zeit Ein-/ ausschalten, daher habe ich mal gesagt 2°C mehr heizen... mfg Andreas
Canada Parro schrieb: > Die blöden Sprüche hier kann man sich sparen. Falls Du damit mich meinst - nö, und mit dem analogen Sensor am Arduino hat das mit einem derartigen Programm sicher nicht funktioniert. Würdest Du einen Backofen (ausschließlich) nach der Außentemperatur steuern?
Andreas B. schrieb: > // Wenn die Temperatur kleiner ist als die Solltemperatur... > if (temperatur < sollTemperatur) { Scharf - soll da die ganze Welt beheizt werden? Der Sensor misst die AUSSENTEMPERATUR ... :-) Das gibt echt heiße Hände -> Ghost Rider würde sich freuen ...
Canada Parro schrieb: > Was muss ich denn als Bezugspunkt nehmen um das Relais zu schalten? > if (??? == Temperatur1) Als erstes musst du mal dafür sorgen, dass die ausgelesene Temperatur überhaupt in irgendeiner Variable landet, damit du die Temperatur nicht nur auf dem Display siehst. Als nächstes schickst du diese Temperatur dann sowohl ans Display, als auch an eine Funktion, die dir die Relais schaltet. Da es mühsamer ist, jede einzelne Zeile zu erklären, als das Programm zu fixen, habe ich dir das mal im Anhang gemacht. Bitte versuche das Programm vollständig zu verstehen, wenn Fragen da sind, bitte stellen. Es nützt dir fürs Leben wenig, dich mit Copy&Paste durchzuschlagen. Der Code geht davon aus, dass du immer einen 10 Sekunden Heizzyklus haben willst, und dabei unterhalb von 6°C mit 90%, bis 11°C mit 50%, bis 15°C mit 10% und ab 15°C gar nicht mehr heizen willst. Diese Parameter kannst du nach Belieben in "switchRelais()" anpassen. Nachtrag: in loop() fehlt noch die Deklaration
1 | float temperature; |
:
Bearbeitet durch User
Nach dem du mit
1 | sensors.requestTemperatures(); |
die aktuelle Temperatur der Sensoren eingelesen hast kannst du den Wert über
1 | if((sensors.getTempCByIndex(0) <= xyz) && (sensors.getTempCByIndex(0) >= zyx)) |
Wobei xyz dein oberer Grenzwert und zyx der untere ist bei dem der Teil der If-Abfrage Abgearbeitet werden soll. z.B. zwischen 10 und 5 °C. Tu dir selber einen Gefallen und google die Befehle damit du verstehst was du da schreibst. Gruß JackFrost Andreas B. schrieb: > Wenn du direkt bei der Solltemperatur ein / ausschaltest, könntest du > genau auf dem Kipppunkt landen, und das Relais würde die ganze Zeit > Ein-/ ausschalten, daher habe ich mal gesagt 2°C mehr heizen... Er misst nicht die Temperatur der Griffe sondern der Umgebung will damit dann einen konstannten Stellgrad ausgeben. Gruß JackFrost
Joe F. schrieb: > damit du die Temperatur nicht > nur auf dem Display siehst. Er hat kein Display - nur eine serielle Verbindung. Auch hier werden die Hände ordentlich heiß :-)
Bastian W. schrieb: > Er misst nicht die Temperatur der Griffe sondern der Umgebung will damit > dann einen konstannten Stellgrad ausgeben. Siehe "Backofen" ...
Andreas B. schrieb: > Das ist leider im Forum hier so, hat aber auch viele Fragende, welche zu > faul sind selbst was zu machen... Ja das kann ich mir wirklich vorstellen. Aber da zähle ich mich nicht zu. bin echt seid ner Woche teilweise bis spät in der Nach dabei das zu schalten. Ok, ich versuche es mal. Vielen lieben Dank erstmal.
Dieter F. schrieb: > Falls Du damit mich meinst - nö, und mit dem analogen Sensor am Arduino > hat das mit einem derartigen Programm sicher nicht funktioniert. > > Würdest Du einen Backofen (ausschließlich) nach der Außentemperatur > steuern? Ja auch dich. Und doch, hat es. Und das bekam ich sogar alleine hin.
Dieter F. schrieb: > Andreas B. schrieb: >> // Wenn die Temperatur kleiner ist als die Solltemperatur... >> if (temperatur < sollTemperatur) { > > Scharf - soll da die ganze Welt beheizt werden? Der Sensor misst die > AUSSENTEMPERATUR ... :-) > > Das gibt echt heiße Hände -> Ghost Rider würde sich freuen ... Ach, bei genügend Heizleistung funktioniert das trotzdem :-P Naja, das habe ich überlesen, aus diesem Grund sollten die Frage schon im ersten Post vollständig sein... Naja 2. Anlauf...
1 | // Wie viele Temperaturwerte erfasst sind
|
2 | #define ANZAHL_WERTE 4
|
3 | |
4 | // (Progmem etc. lasse ich mal weg)
|
5 | // Deine Temperaturen, wenn kleiner als... dann
|
6 | float temperaturen[ANZAHL_WERTE] = {1, 7, 10, 15}; |
7 | |
8 | // Heizleistung, 0 .... 100 z.B.
|
9 | uint8_t heizung[ANZAHL_WERTE] = {60, 40, 20, 10}; |
10 | |
11 | |
12 | void loop() { |
13 | // Temperatur vom Sensor anfragen
|
14 | sensors.requestTemperatures(); |
15 | |
16 | // Temperature vom Ersten sensor lesen, und speichern in "temperatur"
|
17 | float temperatur = sensors.getTempCByIndex(0); |
18 | |
19 | |
20 | // Ausgeben auf der Seriellen Schnittstelle, Siehst du in der Arduino IDE
|
21 | // im "Seriellen Monitor"
|
22 | Serial.print("Temperatur ist "); |
23 | Serial.println(temperatur); |
24 | |
25 | // Welche Temperatur trifft zu? Kälteste als erstes prüfen
|
26 | for (uint8_t i = 0; i < ANZAHL_WERTE; i++) { |
27 | if (temperatur <= temperaturen[i]) { |
28 | // Treffer!
|
29 | |
30 | if (heizung[i] == 0) { |
31 | // Heizung ist aus, also Relais ausschalten...
|
32 | // Wenn noch nicht aus...
|
33 | digitalWrite(Relais_1, LOW); |
34 | Serial.println("Heizung aus"); |
35 | |
36 | // loop() verlassen
|
37 | return; |
38 | }
|
39 | |
40 | // Hier angekommen wissen wir, es muss geheizt werden...
|
41 | |
42 | // ... Heizung einschalten
|
43 | digitalWrite(Relais_1, HIGH); |
44 | Serial.println("Heizung ein"); |
45 | |
46 | // heizung[i] Sekunden heizen
|
47 | for (uint8_t j = 0; j < heizung[i]; j++) { |
48 | Serial.print("Heizung ein seit "); |
49 | Serial.print(j); |
50 | Serial.println(" Sekunden"); |
51 | delay(1000); |
52 | }
|
53 | |
54 | // Heizung ausschalten
|
55 | digitalWrite(Relais_1, LOW); |
56 | Serial.println("Heizung aus"); |
57 | |
58 | // 100 - heizung[i] Sekunden warten
|
59 | for (uint8_t j = 0; j < (100 - heizung[i]); j++) { |
60 | Serial.print("Heizung aus seit "); |
61 | Serial.print(j); |
62 | Serial.println(" Sekunden"); |
63 | delay(1000); |
64 | }
|
65 | |
66 | // loop() verlassen, nächsten Durchlauf starten...
|
67 | return; |
68 | }
|
69 | }
|
70 | |
71 | // Heizung ausschalten, Temperaturbereich nicht definiert
|
72 | digitalWrite(Relais_1, LOW); |
73 | Serial.println("Heizung aus, zu warm!"); |
74 | }
|
Ich hoffe das hilft dir mal weiter... Ich habe versucht, den Ablauf so einfach wie möglich zu halten, da kann man noch viel verbessern, aber dann wird es für deinen Fall unnötig kompliziert... mfg Andreas
Andreas B. schrieb: > Ach, bei genügend Heizleistung funktioniert das trotzdem :-P Ja - man darf dann halt nicht die Hände an die Griffe legen :-) Aber die müssen dann schon echt ordentlich heizen - fragt sich nur, womit man dann lenkt?
Canada Parro schrieb: > Ja auch dich. > Und doch, hat es. Und das bekam ich sogar alleine hin. Das ehrt mich - kannst Du bitte meine Frage nach dem Backofen noch beantworten?
> bin echt seid ner Woche teilweise bis spät in der Nach > dabei das zu schalten. Das merkt man, du wirkst total ausgebrannt. Reagierst kaum noch auf gute Hinweise und wiederholst die selben Fehler. Ich wünschte, ich könnte Dir da raus helfen.
Püh, es gibt Probleme, die kann man nur mit 3 * 14 + 2 * 16 TTL-Pins + diversem an Hühnerfutter lösen, - oder mit einem 8-Pin_µC. Und es gibt Probleme, die scheinen selbst mit einem Arduino + Sensor + Aktuator + etlichem Hühnerfutter (ESD- und ...-Schutz) schwierig, wo man es auch mit etwas Bimetall ohne allem Schnickschnack platz- und stromsparender hinbekommen könnte... Da sind Threads über 64-Bit FPUs (gähn) aus Röhren, oder Relais (selbsgewickelt!) interessanter! Schnarch!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.