Probleme mit Temp. Abfrage und anschließendem Befehl.

Hallo zusammen,

ich bin seit ein Paar Tagen auch im Arduino Fieber. Habe mir direkt ein Projekt überlegt in dem ich leider schnell an meine Grenzen komme. Ich möchte ein LED Blitzlicht (ACL) bauen, welches in Intervallen blinkt. Es kann über einen Button in ein anderes Intervall gewechselt werden (Test). Außerdem gibt es eine Kontroll LED, welche nach jedem Zyklus reagiert.

Jetzt zum Problem:
Zusätzlich soll die Temperatur abgefragt werden um die LEDs bei Überhitzung abzuschalten. Im weiteren Zug ist noch eine NMEA RS232 Abfrage und eine Lufdruck Abfrage geplant...
Ich habe mit hilfe des Leuchtturm Codes das perfekt Tool für die LED Intervalle gefunden und konnte es gut umschreiben. Danach habe ich einen Testbutton eingeführt der das Intervall wechselt. Anschließend wurde eine Zyklus Kontroll LED implementiert. Soweit so gut.
Jetzt bin ich an dem Punkt wo ich die Temperatur überwachen möchte. Hierzu habe ich einen guten Code gefunden. Leider bekomme ich dann in der if und else Abfrage Probleme. Der vorherige Code mit Intervall etz. funktioniert an dieser Stelle nicht mehr.

Könnt Ihr mir vielleicht ein Paar anstöße geben. Sry ich bin kein Programierer. Bastel nur unglaublich gerne :wink:

//ACL Steuerung inkl. Temperatur, Test LED und Test Button 


//Einbinden der Temperatur Steuerung
//Bibliotheken
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 3  //Sensor DS18B20 am digitalen Pin 3

OneWire oneWire(ONE_WIRE_BUS); //

//Übergabe der OnewWire Referenz zum kommunizieren mit dem Sensor.
DallasTemperature sensors(&oneWire);


const float MIN_TEMP = 28; //Temperaturschwellwert zum schalten des Relais


//Einbinden der LED Steuerung
// LED: Pin-Nummer der zu schaltenden LED
// gesamt= Gesamtlänge einer Blitzfolge (Timing) für einen Zyklus des ACL
// n= Anzahl der nachfolgenden ein/aus Timings
//                    LED    gesamt    n     ein   aus   ein   aus   ein   aus   ein   aus
int ACL1_timing[]    ={13,     4550,   8,     50,   50,   50,   50,   50,  300, 1000, 3000}; //ACL1=Normalflug Blinksequenz
int ACL2_timing[]    ={13,      100,   2,     50,   50};                                     //ACL2=Testsequenz
int LEDG1_timing[]   ={12,     4550,   1,    100, 4450};                                     //LEDG1(Grün)=aufblinken nach einer ACL1 Sequenz
int LEDG2_timing[]   ={12,      100,   1,     50,   50};                                     //LEDG2(Grün)=Testsequenz

//Einbinden der Button Steuerung
int buttonTestZustand; //variable für Testbutton
int buttonTest = 4;    //Testbutton Pinnummer




void setup() {

 Serial.begin(9600); //Starten der seriellen Kommunikation mit 9600 baud
 Serial.println("Temperatursensor - DS18B20"); 
 sensors.begin(); //Starten der Kommunikation mit dem Sensor
  
  // definition der OUTPUT pins
  pinMode(ACL1_timing[0], OUTPUT);
  pinMode(ACL2_timing[0], OUTPUT);
  pinMode(LEDG1_timing[0], OUTPUT);
  pinMode(LEDG2_timing[0], OUTPUT);

  // definition der INPUT pins
  pinMode(buttonTest,INPUT);

}

void ACLStatus(int* ACLdata)
{
  // Anfangs von eingeschaltetem Blinkstatus ausgehen
  boolean blinkStatusOn=true;
  // Zeit im Blinkzyklus per Modulo-Arithmetik
  // aus millis() und der Gesamt-Zykluszeit des Turms errechnen
  long inCycleTime=millis() % ACLdata[1];
  int onoffCount=ACLdata[2]; // Anzahl der ein/aus Schaltungen
  while (onoffCount>0 && inCycleTime-ACLdata[3+ACLdata[2]-onoffCount]>0)
  {
    // bereits abgelaufene Blinkzeit abziehen
    inCycleTime-=ACLdata[3+ACLdata[2]-onoffCount];
    onoffCount--; // Anzahl der ein/aus Schaltungen vermindert
    blinkStatusOn=!blinkStatusOn; // Blinkstatus wechselt
  }
  // wenn alles durch, dann den errechneten Blinkstatus setzen
  digitalWrite(ACLdata[0], blinkStatusOn);
}

void loop() {
 sensors.requestTemperatures(); 

 //Ausgabe aller Werte der angeschlossenen Temperatursensoren.

 //auslesen der Temperatur
 float tempC = sensors.getTempCByIndex(0);
 //ausgeben der Temperatur auf dem seriellen Monitor
 printValue(tempC, "°C");
 //wenn die aktuelle Temperatur größer als die gespeicherte dann soll das Relais gestoppt werden
 if(MIN_TEMP > tempC){
    
  //Aufrufen der Testbutton Variable
  buttonTestZustand = digitalRead(buttonTest);
  Serial.println(buttonTestZustand,DEC);

  //Wenn Taster nicht gedrückt ACL1 Sequenz + LEDG aufblinken nach einer ACL1 Sequenz
  if (buttonTestZustand == 0){
  ACLStatus(ACL1_timing);
  ACLStatus(LEDG1_timing);
  }
  //Wenn Taster gedrückt ACL2 und LEDG2 Testsequenz
  if (buttonTestZustand == 1){
  ACLStatus(ACL2_timing);
  ACLStatus(LEDG2_timing);
  }

    
 } else {  //hier folgt ein neues Intervall ohne aufleuchten... 
 }
}


//ausgeben eines Textes auf den seriellen Monitor der Arduino IDE
void printValue(float value, String text){
  Serial.print(value);
  Serial.println(text);

ACL_blink_timing_testbutton_ledg_temp.ino (3.66 KB)

Hallo,
dein Sketch ruft nach der Verwendung der ARRAY-, STRUCT- und ENUM-Anweisung.

Könnt Ihr mir vielleicht ein Paar anstöße geben. Sry ich bin kein Programierer. Bastel nur unglaublich gerne

ich würde da erst mal die Abläufe zusammenräumen. Dazu bräuchte es aber eine Beschreibung was das Ding genau macht. Im einfachsten Fall eine umfassende (vermutlich lange) Liste kurzer Sätze was da abläuft. Unterstützend eine Grafik aus der man die LED's und Zeiten ablesen kann.

Dann kann man daraus eine nette "Finite State Machine" machen. Wenn das While mal weg ist und das ganze blockadefrei läuft, kann man dann auch andere Aufgaben quasi parallel durchführen.

Hallo
ich mir deinen Sketch angeschaut. Die verbauten WHILE-Anweisungen blockieren den Sketch, sodass während dieser Zeit die Eingaben von Temperatur und Luftdruck usw. nicht ausgewertet werden können. Hier muss der Sketch so umgebaut werden das alle Ein- und/oder Ausgaben quasi parallel vom Arduino abgearbeitet werden können.
Hierbei hilft das EVA-Prinzip beim Zerlegen der Aufgabenstellung in Funktionen, die einzeln getestet werden und danach über die Kontrollstrukturen zur Gesamtfunktion zusammengefügt werden.
Und nun habe ich eine Frage:
In WELCHER Maschine wird dieser Sketch für WAS eingesetzt?
Ich bin über die Abkürzung ACL gestolpert und konnte diese mit der vorgebenen Zugriffssteuerungsliste irgendwie im Zusammenhang mit einer Leuchtturmlichtsteuerung nicht zuordnen. CONFUSED

Hey zusammen,
Schonmal vielen Dank für die Antworten. Ich werde dann mal anfangen mich weiter zu belesen und das ganze in einzelne Funktionen zu packen. Sobald ich etwas schlauer bin, halte ich euch natürlich auf dem laufenden.
Das ganze wird ein Anit Collision Light für ein Sportflugzeug. LED boxen sollen später an verschiedenen Stellen montiert werden können. Dann in gewünschten Intervallen Blitzen (z.B. Alle 10s (30ms30ms30ms30ms30s1000ms). Das ganze wird an ein anderes System gekoppelt und merkt wenn ein anderes Flugzeug auf z.B. Kolisionskurs fliegt und erhöt die Frequenz automatisch. Außerdem soll es am Boden abschalten. Eine Test Funktion und Manuelle Auskösung wird über den Button erzeugt. Damit Ich dann nicht abfackel falls die LEDs zu heiß werden gibt es die Temperaturregelung.

Mein Tipp zu deinem nicht mehr lesbaren Sketch :
Stelle den Ursprungszustand des funktionierenden Sketch wieder her.
Baue deinen "Termometer-Sketch" separat auf, bis dieser fehlerfrei funktioniert.

Dann baust du beide zusammen, indem du den Termometer-Sketch in eine Funktion einsetzt und nur die Definitionen an den passenden Platz setzt. Auch die "Setup-Einstellungen" bringst du in das Setup.
Achte darauf, dass du keine doppelten Bezeichnungen für Variablen usw. verwendest.
Die Funktion mit dem "Term.-Sketch" rufst du aus der loop auf.
So kannst du alles einzeln und später gesamt testen.

Hallo
und ne schnelle Frage:
Modellflugzeug ?

Ne Segelflugzeug. Deswegen auch nicht zu viel Kapazität vorhanden...

und was sagt das LBA dazu ?

Wenn das Teil zuverlässig funktioniert, habe ich Zugang zu Prüf und Entwicklungs-organisationen. Hier handelt es sich erstmal nur um einen Prototypen. Zulassung ist dann ein anderes Thema. Ist aber vieles einfacher geworden im EASA Land... Damit kenne ich mich aus. Mit Funktionen leider nicht ;D

Also ich habe jetzt ein funktionierendes Temperatur Sketch. Dann habe ich probiert das BlinkIntervall Sketch erst einmal vereinfacht in eine Funktion zu packen und im Temp Loop aufzurufen. Das Intervall wird aber nicht ausgeführt. Was mache ich falsch? Soll Ich mal die einzelnen sketches posten.

//Temperatur
//Einbinden der Bibliotheken
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 3  //Sensor DS18B20 am digitalen Pin 5

OneWire oneWire(ONE_WIRE_BUS); //

//Übergabe der OnewWire Referenz zum kommunizieren mit dem Sensor.
DallasTemperature sensors(&oneWire);

#define relaisModul 13 //1-Kanal Relaismodul am digitalen Pin 2

const float MIN_TEMP = 28; //Temperaturschwellwert zum schalten des Relais

//BlinkIntervall
// LED: Pin-Nummer der zu schaltenden LED
// gesamt= Gesamtlänge aller Timings zusammen für einen Zyklus des ACL
// n= Anzahl der nachfolgenden ein/aus Timings
//                   LED    gesamt    n     ein   aus   ein   aus   ein   aus   ein   aus
int ACL1_timing1[]   ={13,     4550,   8,     50,   50,   50,   50,   50,  300, 1000, 3000};


void setup(void) { 
 Serial.begin(9600); //Starten der seriellen Kommunikation mit 9600 baud
 pinMode(relaisModul, OUTPUT); //Pin des Relaismoduls als Ausgang definieren
 sensors.begin(); //Starten der Kommunikation mit dem Sensor
 pinMode(ACL1_timing1[0], OUTPUT); //Pin des Relaismoduls als Ausgang definieren
} 



void loop(void){
//Temperatur
sensors.requestTemperatures(); 

 //Ausgabe aller Werte der angeschlossenen Temperatursensoren.

 //auslesen der Temperatur
 float tempC = sensors.getTempCByIndex(0);
 //ausgeben der Temperatur auf dem seriellen Monitor
 printValue(tempC, "°C");
 //wenn die aktuelle Temperatur größer als die gespeicherte dann soll das Relais abgeschaltet werden
 if(MIN_TEMP > tempC){
    ACLStatus(ACL1_timing1);
 } else {
    //Folgt dann wenn if funktioniert
 }

 //eine Pause von 1 sek.
 delay(1000);
}

//BlinkIntervall
void ACLStatus(int* ACLdata)
{
  // Anfangs von eingeschaltetem Blinkstatus ausgehen
  boolean blinkStatusOn=true;
  // Zeit im Blinkzyklus per Modulo-Arithmetik
  // aus millis() und der Gesamt-Zykluszeit des Turms errechnen
  long inCycleTime=millis() % ACLdata[1];
  int onoffCount=ACLdata[2]; // Anzahl der ein/aus Schaltungen
  while (onoffCount>0 && inCycleTime-ACLdata[3+ACLdata[2]-onoffCount]>0)
  {
    // bereits abgelaufene Blinkzeit abziehen
    inCycleTime-=ACLdata[3+ACLdata[2]-onoffCount];
    onoffCount--; // Anzahl der ein/aus Schaltungen vermindert
    blinkStatusOn=!blinkStatusOn; // Blinkstatus wechselt
  }
  // wenn alles durch, dann den errechneten Blinkstatus setzen
  digitalWrite(ACLdata[0], blinkStatusOn);
}


//ausgeben eines Textes auf den seriellen Monitor der Arduino IDE
void printValue(float value, String text){
  Serial.print(value);
  Serial.println(text);
}

[EDIT] QUOTE Tags durch CODE Tags ersetzt. Uwe [/EDIT]

burners86:
Was mache ich falsch?

Du verwechselst quote (=zitat) mit code bei den Tags.

Gruß Tommy

Und wie füge ich den Code dann richtig ein?

Hallo
da ist ganz einfach.
Im IDE unter dem Tab Bearbeiten: Für Forum Kopieren anklicken und hier einfügen.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.