Anfänger: Problem mit Unterprogramm

Hallo, ich bin absoluter Neuling und habe mich wahrscheinlich an ein Projekt gewagt, was für mich doch noch zu schwer ist. Daher Frage ich, wer mir helfen kann, mein Problem zu lösen.
Ich möcht in einem Raum den Luftdruck messen. Wenn ich ein Absauggebläse einschalte soll eine Led mir die Luftdruckdiffernez (fallender Luftdruck) anzeigen.

Mein Code

include "Seeed_BME280.h"
include <Wire.h>

BME280 bme280;
const int LED1=7;
const int LED2=5;
int value;

void setup()
{
  Serial.begin(9600);
  if(!bme280.init()){
    Serial.println("Device error!");
    
    
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
  }




void loop()
{
  float pressure;

  
 
  
  //get and print temperatures
  Serial.print("Temp: ");
  Serial.print(bme280.getTemperature());
  Serial.println("C");//The unit for  Celsius because original arduino don't support special symbols
  
  //get and print atmospheric pressure data
  Serial.print("Pressure: ");
  Serial.print(pressure = bme280.getPressure() / 100.0F + 22);

  Serial.println(" hPa");
  
  //get and print atmospheric pressure data
  Serial.print("Pressure: ");
  Serial.print(pressure = bme280.getPressure() / 100 + 22);
  Serial.println(" mBar");

 

if (bme280.getPressure() <= 980){
  digitalWrite(5, HIGH);
}
else bme280.getPressure() >= 1005) {
  digitalWrite(7, HIGH);
 {
}    

  
}
  
  //get and print altitude data
  Serial.print("Altitude: ");
  Serial.print(bme280.calcAltitude(pressure) / 100.0F);
  Serial.println(" m");

  //get and print humidity data
  Serial.print("Humidity: ");
  Serial.print(bme280.getHumidity());
  Serial.println(" %");

  delay(1000);

 
  

}

Mein Programm funktioniert, aber die Led glimmt nur. Wahrscheinlich weil sie durch die LOOP immer wieder erneut angesteuert wird (Impulse) und nicht wie ich es eigentlich wollte, nämlich gesetzt oder nicht. Also es muß ein Unterprogramm her, aber wie???

Gruß Michael

Du brauchst nicht zwingend ein Unterprogramm, das hier allerdings Funktion heißt, auch wenn es übersichtlicher wird.

Das kannst du auch in der Loop abhandeln.
Nur du musst die Led auch wieder ausschalten, wenn der Wert unterschritten wird.

Wie hast du die Led angeschlossen ?
Ist ein Vorwiderstand dran ?

Hallo Michael,
Du schreibst von einer Led.

Kannst Du mal erklären, was Du mit diesem Codesegment bezweckst?

if (bme280.getPressure() <= 980){
  digitalWrite(5, HIGH);
}
else bme280.getPressure() >= 1005) {
  digitalWrite(7, HIGH);
 {
}   

 
}

So macht das sicher nicht, was Du willst ( und dürfte noch nichtmal kompilieren). Und da werden auch 2 verschiedene Pins angesprochen. Ist das Absicht?

trinity4711:
Mein Programm funktioniert …

Dann ist das nicht der Code, den Du gepostet hast.

@trinity4711

In der Tat hat der Sketch sehr viele Fehler.
Der kann so nicht funktionieren und auch nicht kompilieren.

Den solltest du erst mal reparieren.

Danke erstmal. Kann natürlixh sein, das ich den falschen Code gepostet habe. Sorry
Werde alles noch einmal checken !!!

trinity4711:
Danke erstmal. Kann natürlixh sein, das ich den falschen Code gepostet habe. Sorry
Werde alles noch einmal checken !!!

Na dann wäre es doch an der Zeit und hilfreich den richtigen Sketch zu posten.

Hallo,

hier ist mein richtiger Code:

#include "Seeed_BME280.h"
#include <Wire.h>

BME280 bme280;



void setup()
{
Serial.begin(9600);
if(!bme280.init()){
 Serial.println("Device error!");
 

 pinMode(7, OUTPUT);
 pinMode(5, OUTPUT);
}
}

void loop()
{
float pressure;




//get and print temperatures
Serial.print("Temp: ");
Serial.print(bme280.getTemperature());
Serial.println("C");//The unit for  Celsius because original arduino don't support special symbols

//get and print atmospheric pressure data
Serial.print("Pressure: ");
Serial.print(pressure = bme280.getPressure() / 100.0F + 22);
Serial.println(" hPa");

//get and print atmospheric pressure data
Serial.print("Pressure: ");
Serial.print(pressure = bme280.getPressure() / 100 + 22);
Serial.println(" mBar");



//get and print altitude data
Serial.print("Altitude: ");
Serial.print(bme280.calcAltitude(pressure) / 100.0F);
Serial.println(" m");

//get and print humidity data
Serial.print("Humidity: ");
Serial.print(bme280.getHumidity());
Serial.println(" %");

delay(1000);

if(bme280.getPressure()/ 100.0F + 22 <= 990){
digitalWrite(5, HIGH);
}
else { // wenn nicht, dann tue folgendes
//if (bme280.getPressure() / 100.0F + 22 >= 991) {
digitalWrite(7, HIGH);
}


}

Ich habe den Hauptteil des Sketch übernommen. Den Rest habe ich angepasst. Mein Problem ist das die Led als Statusanzeige (jeweils nur eine) irgendwie gedimmt sind. Meine Vermutung ist, das sie immer in der Schleife neu gesetzt werden und dadurch eine Art PWM-Steuerung erhalten.

deshalb kam mir der Gedanke ein Unterprogramm zu schreiben, der diesen Schaltzustand verbessert.
Nur leider weis ich nicht wie ich anfangen soll.

Gruß Michael

Dein Sketch ist fast nicht zu lesen. In einem Mobilgerät überhaupt nicht.
Setze den bitte in Code-Tags, so wie du es im Eingangspost auch schon gemacht hast.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

Und wie auch schon geschrieben, gibt es in C++ keine Unterprogramme, das sind hier Funktionen.
Wenn du eine Funktion einfügen möchtest, dann kannst du es wie im folgenden Beispiel machen:

void loop()
 {
   //hier passiert etwas
   Funktion_1();   //Funktionsaufruf in der loop
   //hier passiert etwas
   Funktion_2();   //Funktionsaufruf in der loop
   //hier passiert etwas
 }

 // Deine Funktionen müssen immer außerhalb der Loop stehen
 void Funktion_1()
 {
   //hier passiert etwas
 }

 void Funktion_2()
 {
   //hier passiert etwas
 }

Warum die Leds nur dunkel leuchten, hat bei deinem Sketch nicht mit PWM zu tun, sondern vermutlich durch einen falschen Vorwiderstand.

Hallo Michael,
setze deine Sketch bitte in Code-Tags ( hast Du im 1. Post doch auch schon gemacht ).
Ok, Dieter war schneller :wink:

Zeig mal, wie Du die Led angeschlossen hast. Im Sketch schaltest Du die 2 Ausgänge ( Pin7, Pin5 ) zwar ein, aber nie wieder aus. Wie soll das funktionieren? Eine Funktion wird da nichts helfen.

@ all
ich habe meinen Code geändert.

#include "Seeed_BME280.h"
#include <Wire.h>

BME280 bme280;



void setup()
{
  Serial.begin(9600);
  if(!bme280.init()){
    Serial.println("Device error!");
    
   
    pinMode(7, OUTPUT);
    pinMode(5, OUTPUT);
  }
}

 void Funktion_1()
 {
    if(bme280.getPressure()/ 100.0F + 22 <= 990){
  digitalWrite(5, HIGH);
}
  else { // wenn nicht, dann tue folgendes
  digitalWrite(5, LOW);
    
 }
 }
 void Funktion_2()
 {
     if(bme280.getPressure() / 100.0F + 22 >= 991) {
  digitalWrite(7, HIGH);
}
  else {
  digitalWrite (7, LOW);
 }
 }
void loop()
{
  float pressure;

  
 
  
  //get and print temperatures
  Serial.print("Temp: ");
  Serial.print(bme280.getTemperature());
  Serial.println("C");//The unit for  Celsius because original arduino don't support special symbols
  
  //get and print atmospheric pressure data
  Serial.print("Pressure: ");
  Serial.print(pressure = bme280.getPressure() / 100.0F + 22);
  Serial.println(" hPa");
  
  //get and print atmospheric pressure data
  Serial.print("Pressure: ");
  Serial.print(pressure = bme280.getPressure() / 100 + 22);
  Serial.println(" mBar");


  
  //get and print altitude data
  Serial.print("Altitude: ");
  Serial.print(bme280.calcAltitude(pressure) / 100.0F);
  Serial.println(" m");

  //get and print humidity data
  Serial.print("Humidity: ");
  Serial.print(bme280.getHumidity());
  Serial.println(" %");

  delay(1000);
  
 

 

      
 

}

aber nichts hat sich geändert
Michael

trinity4711:
@ all
ich habe meinen Code geändert.

aber nichts hat sich geändert
Michael

Die Vermutung war ein Fehler in der Beschaltung der LED und nicht ein Fehler im Sketch. Darum kann ein geänderter Sketch das Problem nicht ändern.

Dies wurde Dir schon 2 mal aufgezeigt:

HotSystems:
Wie hast du die Led angeschlossen ?
Ist ein Vorwiderstand dran ?

HotSystems:
Warum die Leds nur dunkel leuchten, hat bei deinem Sketch nicht mit PWM zu tun, sondern vermutlich durch einen falschen Vorwiderstand.

Grüße Uwe

Und warum beantwortest du nicht unsere Fragen ?

Neben den Themen die Uwe und andere gefragt oder bemängelt haben, nutzen dir die Funktionen Funktion_1() und Funktion_2() so gar nichts, du musst die auch noch im loop() aufrufen.

Funktion_1();
Funktion_2();

Wo du die aufrufst, musst du entscheiden, oder schauen wo es am besten passt.

wapjoe:
Neben den Themen die Uwe und andere gefragt oder bemängelt haben, nutzen dir die Funktionen Funktion_1() und Funktion_2() so gar nichts, du musst die auch noch im loop() aufrufen.

Funktion_1();

Funktion_2();



Wo du die aufrufst, musst du entscheiden, oder schauen wo es am besten passt.

Stimmt genau…wer lesen kann ist klar im Vorteil. :wink:

@ All

so schnell bin ich nicht. Werde die Schaltung noch hochladen.

Ich muß doch die function im loop aufrufen !

Reicht wenn ich Funktion() eingebe?

Gruß

trinity4711:
@ All

so schnell bin ich nicht. Werde die Schaltung noch hochladen.

Ich muß doch die function im loop aufrufen !

Reicht wenn ich Funktion() eingebe?

Gruß

Dann solltest du keinen fehlerhaften Sketch hochladen.

Und der Aufruf muss den Namen der Funktion haben.
Ich hatte dir doch ein Beispiel gepostet. Nicht gelesen ?

trinity4711:
@ All

so schnell bin ich nicht. Werde die Schaltung noch hochladen.

Ich muß doch die function im loop aufrufen !

Reicht wenn ich Funktion() eingebe?

Gruß

Wozu serviert man dir eigentlich Beispiele und gut gemeinte Ratschläge, wenn du diese doch nicht liest/beachtest?

trinity4711:
Reicht wenn ich Funktion() eingebe?

Du solltest Dir gleich von Anfang an angewöhnen, den Funktionen (und Variablen) sprechende Namen zu geben, aus denen ersichtlich ist, was sie machen (sollen). Funktion_1 und Funktion_2 sind keine sinnvollen Bezeichnungen.

Gruß Tommy

@ wapjoe,

habe deine Beiträge schon gelesen und auch umgesetzt

#include "Seeed_BME280.h"
#include <Wire.h>

BME280 bme280;



void setup()
{
  Serial.begin(9600);
  if(!bme280.init()){
    Serial.println("Device error!");
    
   
    pinMode(7, OUTPUT);
    pinMode(5, OUTPUT);
  }
}


 void LED_1()
 {
    if(bme280.getPressure()/ 100.0F + 22 <= 990){
  digitalWrite(5, HIGH);
}
  else { 
  digitalWrite(5, LOW);
    
 }
 }


 void LED_2()
 {
     if(bme280.getPressure() / 100.0F + 22 >= 991) {
  digitalWrite(7, HIGH);
}
  else {
  digitalWrite (7, LOW);
 }
 }

 void loop()
{
  float pressure;
 
  
 
 LED_1();
 LED_2();
  
  //get and print temperatures
  Serial.print("Temp: ");
  Serial.print(bme280.getTemperature());
  Serial.println("C");//The unit for  Celsius because original arduino don't support special symbols
  
  //get and print atmospheric pressure data
  Serial.print("Pressure: ");
  Serial.print(pressure = bme280.getPressure() / 100.0F + 22);
  Serial.println(" hPa");
  
  //get and print atmospheric pressure data
  Serial.print("Pressure: ");
  Serial.print(pressure = bme280.getPressure() / 100 + 22);
  Serial.println(" mBar");

  
  
  //get and print altitude data
  Serial.print("Altitude: ");
  Serial.print(bme280.calcAltitude(pressure) / 100.0F);
  Serial.println(" m");

  //get and print humidity data
  Serial.print("Humidity: ");
  Serial.print(bme280.getHumidity());
  Serial.println(" %");

  delay(1000);

es gibt aber keine Änderung

trinity4711:
@ wapjoe,

habe deine Beiträge schon gelesen und auch umgesetzt

es gibt aber keine Änderung

Meine Anmerkung war auch eher nebensächlich, die Frage(n) nach der Schaltung und dem Vorwiderstand ist wesentlich relevanter...