Start Stop Funktion für das Programm

Hallo zusammen :raised_hand_with_fingers_splayed:
Ich möchte mit dem Arduino Uno und Thermoelementen Typ K Temperaturmessungen durchführen und auf einem 16x2 LCD-Bildschirm ausgeben.

Die Temperaturen kann ich mir schon bereits anzeigen lassen.
Bei bestimmten Temperaturbereichen kann ich auch LEDs ein/ausschalten.

Ich möchte nun mit einem Taster (oder auch zwei) das Programm Starten und auch wieder Stoppen können. Hat jemand eine Idee wie ich dies realisieren kann?

Reicht es, die Ausgaben auf dem Bildschirm ein/aus zu schalten?

Sonst brauchst Du ein Programm, das immer die Taster abfragt, und das dann den Rest ausführt oder auch nicht.

Ich würde gerne das gesamte Programm Ein/Ausschalten.

Dann zeig doch mal, wie den Sketch jetzt aussieht.
Poste den bitte in Code-Tags.

@HotSystems Wie poste ich den in Code-Tags ? (bin neu hier...)

In der IDE rechte Maustaste auf den Sketch und für Forum kopieren klicken.
Danach hier einfügen.

@HotSystems werde ich gleich mal machen. (ca. 16.20Uhr)
Hab gerade noch keinen Zugriff aufs Programm...

Netzschalter?

@combie Ne so nicht :smiley:

Aber nur so bekommt man das gesamte Arduino Programm aus.

Ansonsten scheinst du das Wort "Programm" und/oder "gesamt", mit einer für mich, neuen Bedeutung versehen zu haben....

Was ist für dich ein "Programm"?
Was bedeutet für dich "gesamt"?

Das ist eine falsche Denkweise. Du hast hier keinen Computer wo man Programme started und beendet. Das Programm läuft immer. Es macht nur entweder etwas oder nichts

#include <max6675.h>                // Initialisierung der MAX6675 Bibliothek
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>      // Initialisierung der LiquidCrystal I²C Bibliothek

LiquidCrystal_I2C lcd(0x27,16,2);   // set the LCD address to 0x27 for a 16 chars and 2 line display

int LEDred1_PIN = 13;                
int LEDgruen1_PIN = 12;              
int LEDred2_PIN = 9;                 
int LEDgruen2_PIN = 2;               

// Pinbelegung der Thermoelemente
int thermoDO = 4;   //orange
int thermoCLK = 6;  //grün
int thermoCS1 = 5;  //gelb
int thermoCS2 = 10; //gelb

MAX6675 thermocouple1(thermoCLK, thermoCS1, thermoDO);
MAX6675 thermocouple2(thermoCLK, thermoCS2, thermoDO);

void setup()
{
  Serial.begin(9600);              
  pinMode(LEDred1_PIN, OUTPUT);    
  pinMode(LEDgruen1_PIN, OUTPUT);  
  pinMode(LEDred2_PIN, OUTPUT);    
  pinMode(LEDgruen2_PIN, OUTPUT);  
  lcd.init();                      
  lcd.backlight();
  
  //delay(500);                    
}


void loop()
{
    //Bildschirmausgabe Thermoelement1
    lcd.setCursor(0, 0);                      
    lcd.print("Temp1 =");                     
    lcd.setCursor(8, 0);                      
    lcd.print(thermocouple1.readCelsius());   
    lcd.setCursor(13, 0);                     
    lcd.print((char)223);                     
    lcd.setCursor(14, 0);                     
    lcd.print("C");                           


    //Bildschirmausgabe Thermoelement2
    lcd.setCursor(0, 1);                      
    lcd.print("Temp2 =");                     
    lcd.setCursor(8, 1);                     
    lcd.print(thermocouple2.readCelsius());   
    lcd.setCursor(13, 1);                  
    lcd.print((char)223);                  
    lcd.setCursor(14, 1);                    
    lcd.print("C");                       

if((thermocouple1.readCelsius() >= 30.00) & (thermocouple1.readCelsius()<= 38)) //Wenn die Temperatur zwischen 30°C und 38 °C liegt, schalte Pin 12 (grün), sonst Pin 13 (rot)
{
  digitalWrite(12, HIGH);   
  digitalWrite(13, LOW);    
}
else
{
  digitalWrite(12, LOW);    
  digitalWrite(13, HIGH);   
}

if((thermocouple2.readCelsius() >= 28.00) & (thermocouple2.readCelsius()<= 35)) //Wenn die Temperatur zwischen 28°C und 35 °C liegt, schalte Pin 9 (grün), sonst Pin 2 (rot)
{
  digitalWrite(9, HIGH);   
  digitalWrite(2, LOW);    
}
else
{
  digitalWrite(9, LOW);     
  digitalWrite(2, HIGH);    
}

 // Ausgabe auf dem Seriellen Monitor
   Serial.print("C1 = "); 
   Serial.println(thermocouple1.readCelsius());
   
   //Serial.print("C2 = "); 
   Serial.println(thermocouple2.readCelsius());
 
   delay(500);              
}

Du meinst sicher &&, oder?

PS:
Für diese Temperaturbereiche sind Thermoelemente eigentlich nicht vorgesehen/ideal.

Ist momentan nur zum Testen aufm Schreibtisch...

Ich verstehe noch nicht, was genau angehalten/beendet werden soll.

Was stört an dem Stromversorgung trennen und wieder herstellen, wie von combie vorgeschlagen?

Wenn du nur bestimmte Teile des Codes über Taster steuern willst, lagere diesen Teil in eine Funktion aus, und führe diese nur aus, nach dem wie du die/den Taster abgefragt hast.

Sagen wir ich will den Code aus dem Loop per Taste ein bzw. aus schalten, kann ich dann den Code in eine andere Funktion auslagern und somit im Loop dann neu abfragen? Verstehst du was ich meine ? :smiley: :see_no_evil:

Ja das geht.

  • Eine Variable, die den Zustand speichert, ob das Programm "laufen" soll oder nicht.
  • Den Code, der ausgeführt werden soll, in eine extra Funktion
  • Die Funktion im Loop über eine If-Abfrage ausführen

Hier mal ein einfaches Beispiel mit deinem Sketch und einem Schalter/Kippschalter.


#include <max6675.h>                // Initialisierung der MAX6675 Bibliothek
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>      // Initialisierung der LiquidCrystal I²C Bibliothek

LiquidCrystal_I2C lcd(0x27,16,2);   // set the LCD address to 0x27 for a 16 chars and 2 line display

int LEDred1_PIN = 13;                
int LEDgruen1_PIN = 12;              
int LEDred2_PIN = 9;                 
int LEDgruen2_PIN = 2;               

byte pushButton = 3;

// Pinbelegung der Thermoelemente
int thermoDO = 4;   //orange
int thermoCLK = 6;  //grün
int thermoCS1 = 5;  //gelb
int thermoCS2 = 10; //gelb

MAX6675 thermocouple1(thermoCLK, thermoCS1, thermoDO);
MAX6675 thermocouple2(thermoCLK, thermoCS2, thermoDO);


void setup() {
  Serial.begin(9600);              
  pinMode(LEDred1_PIN, OUTPUT);    
  pinMode(LEDgruen1_PIN, OUTPUT);  
  pinMode(LEDred2_PIN, OUTPUT);    
  pinMode(LEDgruen2_PIN, OUTPUT);  
  lcd.init();                      
  lcd.backlight();

  pinMode(pushButton, INPUT_PULLUP);
}

void loop()
{
  int buttonState = digitalRead(pushButton);          // Schalter gegen GND schalten schalten ein

  if (!buttonState)
  {
    meinSketch();
  }
}

void meinSketch()
{
  //Bildschirmausgabe Thermoelement1
  lcd.setCursor(0, 0);
  lcd.print("Temp1 =");
  lcd.setCursor(8, 0);
  lcd.print(thermocouple1.readCelsius());
  lcd.setCursor(13, 0);
  lcd.print((char)223);
  lcd.setCursor(14, 0);
  lcd.print("C");


  //Bildschirmausgabe Thermoelement2
  lcd.setCursor(0, 1);
  lcd.print("Temp2 =");
  lcd.setCursor(8, 1);
  lcd.print(thermocouple2.readCelsius());
  lcd.setCursor(13, 1);
  lcd.print((char)223);
  lcd.setCursor(14, 1);
  lcd.print("C");

  if ((thermocouple1.readCelsius() >= 30.00) & (thermocouple1.readCelsius() <= 38)) //Wenn die Temperatur zwischen 30°C und 38 °C liegt, schalte Pin 12 (grün), sonst Pin 13 (rot)
  {
    digitalWrite(12, HIGH);
    digitalWrite(13, LOW);
  }
  else
  {
    digitalWrite(12, LOW);
    digitalWrite(13, HIGH);
  }

  if ((thermocouple2.readCelsius() >= 28.00) & (thermocouple2.readCelsius() <= 35)) //Wenn die Temperatur zwischen 28°C und 35 °C liegt, schalte Pin 9 (grün), sonst Pin 2 (rot)
  {
    digitalWrite(9, HIGH);
    digitalWrite(2, LOW);
  }
  else
  {
    digitalWrite(9, LOW);
    digitalWrite(2, HIGH);
  }

  // Ausgabe auf dem Seriellen Monitor
  Serial.print("C1 = ");
  Serial.println(thermocouple1.readCelsius());

  //Serial.print("C2 = ");
  Serial.println(thermocouple2.readCelsius());

  delay(500);
}

Hab es mal ausprobiert, wenn man den Taster gedrückt hält läuft der Sketch. Wenn ich den Taster allerdings loslasse bleiben die LEDs an...

Ich hatte ja auch geschrieben, es ist (ein einfacher Sketch) für einen Schalter.

Und wenn die Leds aus müssen, musst du die in der if-Abfrage ausschalten.