Forum: Mikrocontroller und Digitale Elektronik Arduino Programmierung


von Hambach (Gast)


Angehängte Dateien:

Lesenswert?

Habe ein Sketch zusammen gestellt, da möchte gerne 7 Temperaturen für 7 
Heizungskreise mit   DS18B20,  Digitale Temperaturfühler, auf ein 
Display anzeigen lassen, da diese nicht alle gleichzeitig angezeigt 
werden können (dieser läuft auch). Jetzt möchte ich  diese gerne mit 
einem Taster oder Schalter an irgend einer Stelle stoppen, danach wieder 
an dieser Stelle weiter laufen lassen. Zum Beispiel, es wird die 3 
Temperatur anzeigt, diese möchte ich mir länger anzeigen lassen, dafür 
den wollte ich den Taster oder  Schalter am Pin 11 anschließen und 
betätigen, danach  sollten die Temperaturen weiter angezeigt werden. 
Eine LED als Meldung hatte ich mir dazu auch gedacht. Leider bin ich 
Anfänger,hab mir aber dieses schon als Ziel gesetzt, komm aber zw. 
Taster bzw. Schalter nicht weiter, weiß nicht wie dies dort einbinden 
kann. Vielleicht kann mir da jemand helfen wäre euch dafür dankbar.
Habe auch dort eine Durchflussmesser für das Heizungswasser schon mit 
drin.
Ich hoffe das man die X.ino Datei von Arduino sehen kann.

Mein jetzige Sketch sieht so aus:
1
 
2
#include <Wire.h>                     // Wire Bibliothek hochladen
3
#include <DHT.h>                      // Library für DHT Sensor (Durchfluss Sensor)aufrufen
4
#include <OneWire.h>
5
#include <DallasTemperature.h>        // Bibliothek für DS18B20
6
#include <LiquidCrystal_I2C.h>        // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek hochladen
7
int tasterPin = 11;
8
int ledPin = 9;
9
10
DeviceAddress DS18B20_Adressen;
11
OneWire oneWire(ONE_WIRE_BUS);
12
DallasTemperature myDS18B20(&oneWire);
13
DallasTemperature sensors(&oneWire);  // Übergeben Sie die oneWire-Referenz an die DallasTemperature-Bibliothek
14
15
LiquidCrystal_I2C lcd1(0x27, 16, 2);  // Hier wird das erste Display benannt (Adresse/Zeichen pro Zeile/Anzahl Zeilen). 
16
                                      // In unserem Fall „lcd1“. Die Adresse des I²C Displays kann je nach Modul 
17
                                      // variieren.
18
LiquidCrystal_I2C lcd2(0x26, 16, 2);  // Hier wird das zweite LCD benannt, hier "lcd2".
19
20
const float No_Val = 999.99;
21
float Temperatur[Anzahl_Sensoren_DS18B20];
22
23
long Imp;
24
long starttime;
25
26
void setup(void) 
27
{
28
  pinMode(tasterPin,INPUT);
29
  pinMode(ledPin, OUTPUT);
30
  
31
  lcd1.init();          //Im Setup wird das LCD1 gestartet - Durchfluß
32
  lcd1.backlight();     //Hintergrundbeleuchtung von LCD1 einschalten (0 schaltet die Beleuchtung aus).
33
  lcd2.init();          //Im Setup wird das LCD2 gestartet - Temperaturen
34
  lcd2.backlight();     //Hintergrundbeleuchtung von LCD2 einschalten (0 schaltet die Beleuchtung aus).
35
  sensors.begin();      //Starten Sie die Bibliothek
36
37
  discoverOneWireDevices();
38
  
39
  if ((Anzahl_Sensoren_DS18B20 > 0)) {
40
    myDS18B20.begin();
41
    
42
    for (byte i = 0 ; i < myDS18B20.getDeviceCount(); i++) {
43
      if (myDS18B20.getAddress(DS18B20_Adressen, i)) {
44
        myDS18B20.setResolution(DS18B20_Adressen ); } } }
45
}
46
47
void loop(void) {
48
  
49
  digitalWrite(ledPin, HIGH);
50
  delay(200);
51
  digitalWrite(ledPin, LOW);
52
  delay(200);
53
 if (digitalRead(tasterPin)==HIGH){
54
}
55
if (digitalRead(tasterPin)==HIGH){
56
  digitalWrite(ledPin, HIGH);
57
}
58
if (digitalRead(tasterPin)==HIGH){
59
  digitalWrite(ledPin, HIGH);
60
} else {
61
  digitalWrite(ledPin, LOW);
62
}
63
64
  Imp = 0;
65
  starttime = micros();  
66
  do { if (pulseIn(12, HIGH) >  0 ) Imp++; }
67
  while( micros() < (starttime + 1e6));
68
  lcd1.setCursor(0, 0);
69
  lcd1.print("flow = ");
70
  lcd1.print(Imp); 
71
  lcd1.print(" Imp/s      ");
72
  lcd1.setCursor(0, 1);
73
float z = Imp;
74
  z = 24*z/100;
75
  if (z < 1)                                  // ist z kleiner als 1, dann nächste Zeile
76
  { lcd1.print(z,2); }                        //das Ergebnis für l/min mit 2 Kommastellen
77
  if (z >= 1 && z<=2) 
78
  { lcd1.print(z,1); }
79
  if (z > 2)                                  // ist z größer als 2, dann nächste Zeile
80
  { lcd1.print("-> Q > Q(max)       "); }     //über dem Meßbereich
81
  lcd1.print(" l/min         ");
82
  
83
  
84
  
85
  
86
  if ((Anzahl_Sensoren_DS18B20 > 0)) {
87
    myDS18B20.requestTemperatures();
88
    delay(250);                                             //250msec Warten
89
    for (byte i = 0 ; i < Anzahl_Sensoren_DS18B20; i++) {
90
      if (i < myDS18B20.getDeviceCount()) {
91
92
        
93
        Temperatur[i] = myDS18B20.getTempCByIndex(i);
94
        if (Temperatur[i] == DEVICE_DISCONNECTED_C) {
95
          Temperatur[i] = No_Val;
96
        
97
        }
98
        else {
99
          
100
101
sensors.requestTemperatures();              // Senden Sie den Befehl für alle Geräte am Bus, um eine Temperaturumrechnung durchzuführen
102
float tempC = myDS18B20.getTempCByIndex(i); // Abrufen der Temperatur in Grad Celsius für den Geräteindex
103
lcd2.setCursor(0,0);                        // Drucken Sie die Temperatur auf dem LCD; 
104
lcd2.print("Kueche:");
105
lcd2.setCursor(0,1);
106
lcd2.print(tempC);
107
lcd2.write(0);                              // Drucken Sie das benutzerdefinierte Zeichen
108
lcd2.print("C");
109
110
delay(1000); // 1 Sec. Warten
111
        }
112
      }
113
    }
114
  }
115
  
116
}
117
118
void discoverOneWireDevices(void) {
119
  byte i;
120
  byte addr[8];
121
  while (oneWire.search(addr)) {
122
       for ( i = 0; i < 8; i++) {
123
            if (addr[i] < 16) {
124
            }
125
            if (i < 7) {
126
           }
127
    }
128
    if ( OneWire::crc8( addr, 7) != addr[7]) {
129
          return;
130
    }
131
  }
132
  
133
  oneWire.reset_search();
134
  return;
135
}

: Bearbeitet durch Moderator
von Andreas S. (Gast)


Lesenswert?

Wende Dich direkt an das Arduino Forum-das ist in gewissen Grenzen
Anfängerkompatibel und hat eher eine Symphatie für den Arduino.
Allerdings musst Du Dich dazu anmelden:
https://forum.arduino.cc/c/international/deutsch/47

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Hambach schrieb:
> Mein jetzige Sketch sieht so aus
Bitte die paar Zeilen über der Texteingabebox lesen und danach handeln 
und einfach die "ino" Datei anhängen, statt seitenlangen Code in den 
Text reinzukopieren.

: Bearbeitet durch Moderator
von PittyJ (Gast)


Lesenswert?

Vielleicht sollte man doch erst die Grundlagen der Programmierung 
lernen.
Programmieren ist mehr als Copy&Paste.

Es gibt immer noch Einsteigerbücher über C/C++, die man durcharbeiten 
kann. Das erfordert allerdings etwas Aufwand.

von noiasca (Gast)


Lesenswert?

Hambach schrieb:
> komm aber zw.
> Taster bzw. Schalter nicht weiter, weiß nicht wie dies dort einbinden
> kann.

in der IDE gibt es das Beispiel
  Digital / StateChangeDetection
das zeigt dir wie du einen Taster auslesen kannst.

Weiter empfehle ich dir das Beispiel
"BlinkWithoutDelay"
durchzugehen damit du keine delays mehr benötigst.

Grundsätzlich wirst du dir einen Ablauf überlegen müssen, in welchen 
Phasen soll was auf welchem LCD dargestellt werden. Hier hilft dann 
vermutlich eine Finite State Machine etwas Ordnung in das Programm zu 
bringen.

Und offenbar hast am Pin12 auch noch was hängen dass du messen willst 
(und Anzeigen?). Darüber könntest auch noch was schreiben, denn das 
wirst vermutlich auch umbauen müssen.

von Falk B. (falk)


Lesenswert?

Lothar M. schrieb:
> Bitte die paar Zeilen über der Texteingabebox lesen und danach handeln
> und einfach die "ino" Datei anhängen, statt seitenlangen Code in den
> Text reinzukopieren.

Hat er ja gemacht, doppelt hält besser ;-)

von Falk B. (falk)


Lesenswert?

Hambach schrieb:
> Ich hoffe das man die X.ino Datei von Arduino sehen kann.

Kann man. Aber die Formatierung deines Quelltextes ist sehr schlecht, 
vor allem die Einrückung. Da sieht keiner durch!

Strukturierte Programmierung auf Mikrocontrollern

Dein Problem ist ein Standardproblem und wird demzufolge mit einer 
Standardlösung einfach und gut gelöst. Siehe Multitasking und 
Entprellung.

von Germanium (Gast)


Lesenswert?

Erst lernen schreiben Text verstehen können.
Sonst nix proggen wärden können.

von Peter D. (peda)


Lesenswert?

Hambach schrieb:
> if (digitalRead(tasterPin)==HIGH){

Ne, das ist ne völlige Sackgasse.
Fürs Tasten einlesen gibt es den Debounce Befehl.
Ein leistungsfähiges Debounce macht man mit dem Timerinterrupt.

von MaWin (Gast)


Lesenswert?

Hambach schrieb:
> Vielleicht kann mir da jemand helfen

Bau keine so langen delays in deine loop ein.

Die loop soll den Taster einlesen und ein zeitliches Gerüst bilden, aber 
nicht so langsam laufen wie die Anzeige wechselt.
1
bool tastalt,tastneu,anzeigestop;
2
int zeit,i;
3
setup()
4
{
5
  pinMode(tasterPin,INPUT);
6
  tastalt=digitalRead(tasterPin);
7
  anzeigestop=false;
8
  pinMode(ledPin, OUTPUT);
9
  digitalWrite(ledPin,LOW);
10
  zeit=0;
11
  i=0;
12
}
13
loop()
14
{
15
  tastneu=digitalTead(tasterPin);
16
  if(tastneu==HIGH&&tastalt==LOW) // Taster gerade runtergedrückt
17
  {
18
    anzeigestop=!anzeigestop;
19
    digitalWrite(ledPin, anzeigestop);
20
  }
21
  if(zeit>100) // 1 Sekunde verstrichen
22
  {
23
    if(!anzeigestop) 
24
    {
25
      // nächsten Wert messen und anzeigen also
26
      // myDS18B20.getTempCByIndex(i)
27
      // lcd2.print(tempC)
28
      i=(i+1)%Anzahl_Sensoren_DS18B20;
29
    }
30
    zeit=0;
31
  }
32
  tastalt=tastneu;
33
  delay(10);
34
  zeit+=1; // man kann auch millis() nutzen
35
}
So ganz verstanden hab ich nicht, wann deine LED leuchten soll. Während 
der Taster runtergedrückt ist oder während Anzeigestop. Ich hab 
letzteres implementiert.

Wichtig also: kein delay(200) oder delay(1000) in deiner loop.

von Florian (Gast)


Lesenswert?

Wie hast du den Taster angeschlossen? Pull-down/up? Sonst mit 
INPUT_PULLUP bei pinmode setzen.

Deine Tastenabfrage kannst Du nach der Ausgabe einer Temperatur (Küche) 
einbauen, dort wo
delay(1000); // 1 Sec. Warten
steht
Allerdings prellen Taster immer, was zu Problemen bei der Erkennung 
führen kann.
https://docs.arduino.cc/built-in-examples/digital/Debounce

Am besten, du gehst einen Schritt zurück und schreibst erst einmal ein 
kleines Programm, das Text ausgibt und auf Tasteneingaben wartet. Ohne 
den ganzen Temperatur-Kram. So zum kennen*lernen*

von Hambach (Gast)


Lesenswert?

Erst mal vielen Dank für Deine schnelle Rückmeldung, hatte nie gedacht 
das man so schnell eine Rückmeldung erhält bzw. Hilfe bekommt. Mache 
dieses zum ersten mal.
Ja die LED sollte an sein solang die Anzeige gestopt ist.
Heißt das, was ich alles mit dem Taster und LED eingetragen habe weg 
lassen soll, und dieses was du schreibet an einer Stelle einbinden soll?

Bin jetzt immer zuhause, da muss man sich mit etwas beschäftigen, aber 
maches fällt einem etwas schwer, und man möchte ja auch gerne zum Ziel 
kommen.

Ohne dem Taster und LED klappt es ja schon, auch wenn es nicht gerade 
Professionell aussieht. Bin halt kein Profi.

von Brain 2.0 (Gast)


Lesenswert?

Hambach schrieb:
> Bin halt kein Profi.

Dennoch kannst du die unnötigen Leerzeilen aus deinem Sketch entfernen 
und den richtig lesbar formatieren. Das Formatieren geht in der Arduino 
IDE sehr einfach mit StRg + T.
Danach ist der sicher besser lesbar.

von MaWin (Gast)


Lesenswert?

Hambach schrieb:
> Heißt das, was ich alles mit dem Taster und LED eingetragen habe weg
> lassen soll, und dieses was du schreibet an einer Stelle einbinden soll?

Das ist die Idee. Sinnvoll kompinieren.

von Hambach (Gast)


Lesenswert?

Habe noch kein Taster bzw LED angeschlossen, weil ich nicht weiß wo ich 
das so richtig im Programm einbinden kann, muss.

von Hambach (Gast)


Lesenswert?

Das ist schon richtig was du sagst, hab es aber jetzt für mich erst mal 
so gemacht, das enprodukt sollte sauber sein. Dazu möchte ich ja auch 
kommen, dann läuft es bestimmt auxch schneller.

von Hambach (Gast)


Lesenswert?

Ok, die Formartierung mit StRg + T versuch ich mal, kannt ich jetzt 
nicht, Danke. Bin mal gespannt wie das dann aussieht.

von Hambach (Gast)


Lesenswert?

Danke Brain, sieht jetzt schon anders aus. Hab auch mal die 
Programmierungen von mir, Taster und LED raus genommen. Muss dannmal 
sehen wo und wie ich das vom MaWin einbauen kann.

von Hambach (Gast)


Lesenswert?

Hallo MaWin, Danke, muss jetzt nuir mal sehen wie und wo ich es 
reinsetzen kann. Mit den ensprechenden PIN´s für Taster und LED.

von Brain 2.0 (Gast)


Lesenswert?

Hambach schrieb:
> Danke Brain, sieht jetzt schon anders aus.

Dann solltest du es hier auch zeigen, damit wir es auch lesen können.

von Hambach (Gast)


Lesenswert?

Meintest du den Sketch nochmal neu hochladen, wie er jetzt aussieht?

von Hambach (Gast)


Angehängte Dateien:

Lesenswert?

Anbei nochmal den Sketch ohne Taster und Led nachdem ich mit StRg+T 
Formartiert habe. Taster wollte ich dann z.B. am Pin D3 und die LED an 
z.B. D4 anschließen. LED sollte bei Stop an sein. Es kann aber auch ein 
Schalter sein, da hätte man ja nur 0 oder 1 Signal ohne Prellung mein 
ich. 0 = Anzeige läuft immer durch und mit 1 bleibt die Anzeig stehen. 
Bei 0 läuft sie dann weiter. Nur dieses weiß ich nicht in den Sketch 
einzubauen. Einen Taster oder Schalter mit einer LED habe ich 
Programmiert, hab ich mit Arduino-Übungen schon gemacht, das hier ist 
aber für mich schon was anderes, weil man in einen anderen Zyklus 
eingreift, und das hab ich in Arduino zum erlernen nicht gefunden, zu 
mindest für mich nicht verständlich.

von Florian (Gast)


Lesenswert?

Ja, ich könnte Dein Problem lösen - aber dann lernst du nichts. Also wie 
gesagt: einfach mal die Basics kennenlernen
https://duckduckgo.com/?t=ffab&q=arduino+taster+led&ia=web

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.