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)
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.
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 ausDocMartin 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...
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.
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?
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?
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
floatsollTemperatur=30;
3
4
voidloop(){
5
// Temperatur vom Sensor anfragen
6
sensors.requestTemperatures();
7
8
// Temperature vom Ersten sensor lesen, und speichern in "temperatur"
9
floattemperatur=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
}elseif(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
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
floattemperaturen[ANZAHL_WERTE]={1,7,10,15};
7
8
// Heizleistung, 0 .... 100 z.B.
9
uint8_theizung[ANZAHL_WERTE]={60,40,20,10};
10
11
12
voidloop(){
13
// Temperatur vom Sensor anfragen
14
sensors.requestTemperatures();
15
16
// Temperature vom Ersten sensor lesen, und speichern in "temperatur"
17
floattemperatur=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_ti=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...
// 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!