Forum: Mikrocontroller und Digitale Elektronik Fotowiderstand-Modul funktioniert nur in bestimmten Programmen


von Ahmad A. (hmd96)


Lesenswert?

Hallo,

ich hatte bereits einen Beitrag zu diesem Projekt geschrieben, momentan 
stehe ich aber vor einem neuen Problem.
Kurze Info zum Projekt:
Ich mache eine Lichtschranke, die aus zwei Teilen besteht. Einem Laser 
und einem Fotowiderstand-Modul 
(https://www.amazon.de/gp/product/B07DP1YM5X/ref=ppx_yo_dt_b_asin_title_o05_s02?ie=UTF8&psc=1).
Dafür nutze ich ein NanoESP von Conrad, dass aus einem Arduino Nano und 
einem ESP8266 fürs WLAN besteht.
Das ganze funktioniert so, dass mit digitalRead() das Modul ausgelesen 
wird und wenn der Lichtstrahl unterbrochen wird bzw. das Modul nicht 
genug Licht bekommt, wird ein Alarm ausgelöst.
Zusätzlich nutze ich eine App mit dem Namen Blynk, sodass sich alles 
übers Handy steuern lässt.

Nun habe ich ein sehr merkwürdiges Problem, dass ich bis vor Kurzem noch 
nicht hatte und ich weiß nicht, wie es dazu kam, da ich nichts geändert 
habe.
Das Modul mit dem Fotowiderstand hat eine eingebaute LED die leuchtet, 
wenn Licht drauffällt, es also auf LOW ist und aus ist, wenn es auf HIGH 
ist. Diese Funktion hat nichts mit dem Sketch zu tun und es reicht 
schon, wenn das Modul nur angeschlossen ist und mit Strom versorgt wird.
Das funktioniert mit fast allen Sketches die ich über die Arduino IDE 
laufen lasse. ALs Beispiel folgender Code:
1
void loop() {
2
  // read the value of the potentiometer:
3
 
4
  int digitalvalue = digitalRead(8);
5
    if (digitalvalue == HIGH) {
6
      Serial.println ("Alarm");
7
    } else {
8
      Serial.println ("Ok");
9
    }    
10
}

Mit diesem Code funktioniert es also einwandfrei. Nutze ich aber meinen 
eigentlichen Code, funktioniert es aber nicht mehr. Das Modul hört mit 
dem Sketch einfach auf zu funktionieren, als ob es nicht mehr mit der 
Schaltung verbunden ist. Auch bei nutzen des analogen Pins gibt dieser 
einen Wert von 1023 aus, also den maximalen Widerstand egal wie stark 
ich draufleuchte.
Wie gesagt, beim letzten Mal hat alles einwandfrei funktioniert und da 
das Modul mit dem anderen Sketch funtioniert, kann es auch nicht defekt 
sein, denke ich. Wenn ich diesen Code verwende bleibt das Modul entweder 
dauerhaft auf LOW als würde dauerhaft Licht draufstrahlen oder manchmal 
auch dauerhaft auf HIGH als würde kein Licht mehr draufstrahlen.
1
#define BLYNK_PRINT Serial
2
#define ESP8266_BAUD 19200
3
4
#include <ESP8266_Lib.h>
5
#include <BlynkSimpleShieldEsp8266.h>
6
#include <TimeLib.h>
7
#include <WidgetRTC.h>
8
#include <SoftwareSerial.h>
9
10
char auth[] = "";
11
char ssid[] = ""; 
12
char pass[] = "";
13
14
SoftwareSerial EspSerial(11, 12); // RX, TX
15
ESP8266 wifi(&EspSerial);
16
WidgetTerminal terminal(V2);
17
BlynkTimer timer;
18
WidgetRTC rtc;
19
20
//Konstanten
21
const int greenled = 3;           //Pin für rote LED
22
const int redled = 4;         //Pin für grüne LED
23
const int gelbled = 5;          //Pin für gelbe LED
24
const int ldrdigital = 8;   //Alternativ das Modul digital auslesen
25
const int speaker = 7;          //Pin für akkustischen Alarm
26
//const int btnPin = 6;        //Pin für An- und Ausschalten des Systems 
27
28
29
30
//Variablen
31
boolean aktiv = true;       // Variable für Aktivierung
32
boolean alarm = false;      // Variable für Alarm
33
int buttonVal = 0;           // Variable um Buttonzustand festzustellen
34
int prev_buttonVal = 0;      // Variable um Buttonzustand zu vergleichen
35
36
// Konstanten für Sirene
37
const int lowrange = 2000;   // niedrigste Frequenz
38
const int highrange = 4000;  // höchste 
39
40
//Flags                 //Vermeiden von loop für Benachrichtigungen und Terminal
41
int flagAlarm = 0;        
42
int flagAktiv = 0;
43
int flagtime = 0;
44
45
//Strings
46
String password = "tesla";
47
48
void setup()
49
50
{
51
  //Bestimmen der Output und Input Pins
52
  pinMode(redled,OUTPUT);
53
  pinMode(greenled,OUTPUT);
54
  pinMode(gelbled, OUTPUT);
55
  pinMode(speaker,OUTPUT);
56
57
  pinMode(ldrdigital, INPUT);
58
  //pinMode(btnPin, INPUT);
59
  
60
  timer.setInterval(100L, data); //timer will run every sec 
61
  Serial.begin(19200);
62
  EspSerial.begin(ESP8266_BAUD);
63
  Blynk.begin(auth, wifi, ssid, pass);
64
  rtc.begin();
65
  setSyncInterval(10 * 60);
66
  
67
  Aktivieren ();
68
  delay(10);
69
70
}
71
72
void loop()
73
{
74
75
  Blynk.run();
76
  timer.run();
77
}
78
79
void data()
80
{
81
  
82
  String currentTime = String(hour()) + ":" + minute() + ":" + second();
83
  String currentDate = String(day()) + "." + month() + "." + year();
84
85
  if (flagtime == 0) { 
86
    delay(500);
87
    terminal.print (currentTime); 
88
    terminal.print (F("  -  "));
89
    terminal.println (currentDate);
90
    terminal.println (F("--------------------------------"));
91
    terminal.flush();
92
    flagtime = 1;
93
  }
94
  
95
  
96
  int digitalValue = digitalRead(ldrdigital);                   //liest den Wert des LDR Moduls aus
97
  Serial.println (digitalValue);
98
  if ((aktiv) && (digitalValue == HIGH)){                   //vergleicht ausgelesenen Wert mit Grenzwert
99
    alarm = true;
100
  }
101
  
102
  if (alarm){
103
    if (flagAlarm == 0){
104
       Blynk.notify("Der Alarm wurde ausgelöst!");
105
       terminal.print(F("Der Alarm wurde um "));
106
       terminal.print (currentTime);
107
       terminal.println (F(" ausgelöst."));
108
       terminal.println(F("Geben Sie Ihr Passwort ein, um den Alarm auszuschalten!"));
109
       terminal.flush();
110
       flagAlarm = 1;  
111
    }
112
    // Sirene
113
    // steigender Ton
114
    for (int i = lowrange; i <= highrange; i++)
115
    {
116
      tone (speaker, i, 250);
117
    }
118
    // sinkender Ton
119
    for (int i = highrange; i >= lowrange; i--)
120
    {
121
      tone (speaker, i, 250);
122
    }
123
124
    // optischer Alarm bzw. blinken
125
    digitalWrite(gelbled, HIGH);
126
    digitalWrite(redled, HIGH);
127
    digitalWrite(greenled, HIGH);
128
    delay(10);
129
    digitalWrite(greenled, LOW);
130
    digitalWrite(gelbled, LOW);
131
    digitalWrite(redled, LOW);
132
  }
133
134
    delay(20);
135
}
136
137
// Funktion aktiviert das System
138
void Aktivieren(){
139
  if (aktiv){
140
    digitalWrite(greenled, LOW);
141
    digitalWrite(redled, HIGH);
142
    alarm = false;
143
    aktiv = false;
144
  } else {
145
    digitalWrite(greenled, HIGH);
146
    digitalWrite(redled, LOW);
147
    tone(speaker, 220, 125);
148
    delay(200);
149
    tone(speaker, 196, 250);
150
    aktiv = true;
151
  } 
152
}
153
154
//Verbindung mit Blynk 
155
BLYNK_CONNECTED() {
156
  Blynk.syncAll();
157
  terminal.clear();
158
  terminal.println(F("Blynk v" BLYNK_VERSION ": Sie sind jetzt online."));
159
  terminal.flush();
160
}   
161
162
163
//Passwortschutz Terminal Blynk
164
BLYNK_WRITE(V2)
165
{
166
167
  if (alarm) {
168
     if (String (password) == param.asStr()){
169
         //deactivate alarm
170
          aktiv = false;
171
          alarm = false;
172
          flagAlarm = 0; 
173
          flagAktiv = 0;
174
          digitalWrite(greenled, LOW);
175
          digitalWrite(redled, HIGH);
176
          tone(speaker, 150, 200);
177
          delay(200);
178
          tone(speaker, 220, 125);
179
          terminal.println(F("Korrekt! Alarm deaktiviert."));
180
          terminal.flush();
181
        }
182
    else {
183
      terminal.println(F("Falsches Passwort!"));
184
      terminal.flush();
185
    }
186
  }
187
}
188
189
BLYNK_WRITE(V10) {
190
  int buttonVal = param.asInt();                     //liest Button aus und vergleicht
191
  if ((buttonVal == 1) && (prev_buttonVal == 0)){
192
    Aktivieren();                                             //Wenn Bedingung erfüllt wird das System ativiert
193
    if (flagAktiv == 0){
194
       terminal.println(F("Sie haben das System aktiviert!"));
195
       terminal.flush();
196
       flagAktiv = 1;  
197
    }
198
    delay(50);
199
  }
200
}

Es würde mich freuen, wenn sich jemand die Mühe macht sich das 
anzuschauen und mir zu helfen.

: Bearbeitet durch User
von Hoss (Gast)


Lesenswert?

Mach Du Dir bitte doch die Mühe und zerlege den Code in Teilprogramme.
Nutze dazu bequem die Kommentarmöglichkeiten.

Dann findest Du den Fehler ohne Hilfe, lernst dabei und freust Dich beim 
Erfolg.

von Hoss (Gast)


Lesenswert?

Und den Code im Beispiel finde ich nich „1:1“ im Programm.

von Wolfgang (Gast)


Lesenswert?

Ahmad A. schrieb:
> pinMode(ldrdigital, INPUT);

Mit welcher Betriebsspannung laufen deine LDR-Module und mit welcher 
deine µCs.
Der LM393 auf dem LDR-Modul hat einen OC-Ausgang. Damit ein µC damit 
etwas anfangen kann, wird ein Pull-Up Widerstand benötigt. Auf dem Board 
sehe ich keinen und den am µC-Pin aktivierst du in deiner Software auch 
nicht. Wie sieht deine Schaltung aus?

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


Lesenswert?

Wolfgang schrieb:
> Wie sieht deine Schaltung aus?
Und welche Spannungen misst du im "Normalfall" und im Fehlerfall an den 
beteiligten Pins?

von Hoss (Gast)


Lesenswert?

Er sagt doch mit dem Code funktioniert es einwandfrei.
Dann muss man keine weiteren Fragen zur Hardware aufrufen.

von Hoss (Gast)


Lesenswert?

Wolfgang schrieb:
> Ahmad A. schrieb:
>>Auf dem Board
> sehe ich keinen und den am µC-Pin aktivierst du in deiner Software auch
> nicht. Wie sieht deine Schaltung aus?

Na dann trink nen Kaffee und schau nochmal nach, ist noch etwas früh..??

von Michael B. (laberkopp)


Lesenswert?

Ahmad A. schrieb:
> Es würde mich freuen, wenn sich jemand die Mühe macht sich das
> anzuschauen

Krass, programmiert man heute so ?

Was soll BLYNK_WRITE(V2) und BLYNK_WRITE(V10) denn werden ?

Ahmad A. schrieb:
> Auch bei nutzen des analogen Pins gibt dieser einen Wert von 1023 aus,
> also den maximalen Widerstand egal wie stark ich draufleuchte.

Klingt, als ob der Pin vom Programm durch irgendeine Funktion auf 
Ausgang geschaltet wird und auf HIGH steht.

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.