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???
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.
#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.
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
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.
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.
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.