IF && doet niet wat ik wil

Arduino specifieke Software
Berichten: 3
Geregistreerd: 16 Dec 2019, 19:31

IF && doet niet wat ik wil

Berichtdoor veenph » 13 Nov 2020, 22:39

Ik heb met een ESP8266 + ESP-01S relais een AAN / UIT schakelaar gemaakt, die zowel door het prog (half uur voor zon onder) als door Blynk (V0) geschakeld kan worden. Nu probeer ik met if's en && de diverse mogelijke situaties uit elkaar te houden, maar het prog doet niet wat ik verwacht. Waarschijnlijk maak ik steeds dezelfde denkfout. Graag een reactie. De sketch en de output op de monitor doe ik er bij. Het gaat om de void CheckLamp

DDDDDD
Lampen zijn nu UIT
Het is nu: 21:22
Totaal minuten: 1282
Zon onder: 16:46
Minuten sunset - 30 :976
Licht uit om: 1380
DDDDDD
Lampen zijn nu UIT
Het is nu: 21:23
Totaal minuten: 1283
Zon onder: 16:46
Minuten sunset - 30 :976
Licht uit om: 1380

#define BLYNK_PRINT Serial
#include <SimpleTimer.h>
#include <BlynkSimpleEsp8266.h>
#include <ArduinoJson.h>
#include <ESP8266HTTPClient.h>
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char *ssid = "XXXXX";
const char *password = "XXXXXXXX";

const long utcOffsetInSeconds = 3600;
// char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(49) + 680;
DynamicJsonDocument doc(capacity);

// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);

// You should get Auth Token in the Blynk App.
char auth[] = "dfUy_saT98b2-FCk4ycUiYXXXXXX";
SimpleTimer timer;

int lichtUit = 23 * 60; // 23:00 uur licht UIT
int uurSunder = 0;
int minSunder = 0;
int totminSunder = 0;
int totMinuten;
int aanUit = 0;
// ================================================================

BLYNK_WRITE(V0)
{
aanUit = param.asInt(); // Get value as integer
Serial.println(aanUit);
CheckLamp();
}

void haalZononder() {
//Check WiFi connection status
while (WiFi.status() != WL_CONNECTED) {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}

HTTPClient http; //Declare an object of class HTTPClient
http.begin("http://weerlive.nl/api/json-data-10min.php?key=3820136e92&locatie=Steenwijk"); //Specify request destination
int httpCode = http.GET(); //Send the request
if (httpCode > 0) { //Check the returning code
String payload = http.getString(); //Get the request response payload
http.end(); //Close connection

String json = payload;
deserializeJson(doc, json);
JsonObject liveweer_0 = doc["liveweer"][0];
const char* liveweer_0_sunder = liveweer_0["sunder"];
//convert to integer, skip first character
uurSunder = atoi(&liveweer_0_sunder[0]);
minSunder = atoi(&liveweer_0_sunder[3]);
totminSunder = ((uurSunder * 60) + minSunder - 30); // 30 min voor sunset licht AAN
}
}

void haalTijd() {
//Check WiFi connection status
while (WiFi.status() != WL_CONNECTED) {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}

timeClient.update();
int uur = timeClient.getHours();
int minuut = timeClient.getMinutes();
int totMinuten = (uur * 60) + minuut;
CheckLamp();

Serial.print("Het is nu: ");
Serial.print(uur);
Serial.print(":");
Serial.println(minuut);
Serial.print("Totaal minuten: ");
Serial.println(totMinuten);
Serial.print("Zon onder: ");
Serial.print(uurSunder);
Serial.print(":");
Serial.println(minSunder);
Serial.print("Minuten sunset - 30: ");
Serial.println(totminSunder); // half uur voor sunset
Serial.print("Licht uit om: ");
Serial.println(lichtUit);
}

void CheckLamp() {
if (aanUit == 1)
{
digitalWrite(0, LOW); // lampen AAN
Serial.println("Lampen zijn nu AAN");
}
if ((totMinuten >= totminSunder) && (totMinuten < lichtUit))
{
Serial.println("AAAAAAA");
digitalWrite(0, LOW); // lampen AAN
Serial.println("Lampen zijn nu AAN");
}
if ((aanUit == 0) && (totMinuten >= lichtUit))
{
Serial.println("CCCCCC");
digitalWrite(0, HIGH); // lampen UIT
Serial.println("Lampen zijn nu UIT");
}
if ((aanUit == 0) && (totMinuten < totminSunder))
{
Serial.println("DDDDDD");
digitalWrite(0, HIGH); // lampen UIT
Serial.println("Lampen zijn nu UIT");
aanUit = 0;
}
}

void setup()
{
Serial.begin(115200);
delay(500);
pinMode (0, OUTPUT);

// We start by connecting to a WiFi network
Serial.println("");
Serial.print("Connecting to ");
Serial.println(ssid);

WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());

Blynk.config(auth); // in place of Blynk.begin(auth, ssid, pass);
Serial.println("Connected to Blynk server");

timeClient.begin();

timer.setInterval(3600000L, haalZononder); // 1 uur 3600000
timer.setInterval(60000L, haalTijd); // 1 minuut 60000

haalZononder();
haalTijd();
}

void loop() {
Blynk.run();
timer.run();
}

Advertisement

Berichten: 3
Geregistreerd: 16 Dec 2019, 19:31

Re: IF && doet niet wat ik wil

Berichtdoor veenph » 14 Nov 2020, 11:01

Heb zelf de fout gevonden. Had int totMinuten 2x als integer benoemd. Meestal geeft IDE dan wel een foutmelding.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: IF && doet niet wat ik wil

Berichtdoor Koepel » 14 Nov 2020, 12:00

veenph schreef:Had int totMinuten 2x als integer benoemd. Meestal geeft IDE dan wel een foutmelding.

Nou nee, het is namelijk toegestaan.
De ene is een globale variabele en de andere is een lokale variabele. Dat mag.
De compiler neemt de meest lokale variabele.

Dus in de functie "haalTijd()" wordt de lokale variabele gebruikt en in de functie CheckLamp() wordt de globale variabele gebruikt.

Dit is een klein testje dat is toegestaan in 'C'. Dit is dus hoe het niet moet ;)
Code: Alles selecteren
int x = 100;

void setup()
{
  Serial.begin( 9600);
  Serial.println();
  Serial.println( "Start");
 
  Serial.print( "1: x = "); Serial.println( x);

  int x = 123;
  Serial.print( "2: x = "); Serial.println( x);

  x = myFunction( x);
  Serial.print( "3: x = "); Serial.println( x);

  if( x > 0)
  {
    int x = 200;
    Serial.print( "4: x = "); Serial.println( x);

    for( int x = 30; x < 33; x++)
    {
      Serial.print( "5: x = "); Serial.println( x);

      if( x == 30)
      {
        int x = 80;
        Serial.print( "6: x = "); Serial.println( x);
      }
    }
  }

  Serial.println( "Stop");
}

void loop()
{
}

int myFunction( int y)  // wanneer de parameter ook 'x' heet, dan geeft compiler een error.
{
  int x = 50;
  Serial.print( "7: x = "); Serial.println( x);

  return( x + y);
}

Ik kreeg alleen een foutmelding wanneer de parameter van een functie dezelfde naam heeft als een variabele binnen die functie. Daarom heet de parameter 'y'.

Kijk eens naar die for-loop met variabele 'x'. Ik maak 'x' gelijk aan 80, maar dat is een andere lokale variabele. De for-loop wordt gewoon uitgevoerd met x is 30, 31 en 32.

Berichten: 3
Geregistreerd: 16 Dec 2019, 19:31

Re: IF && doet niet wat ik wil

Berichtdoor veenph » 14 Nov 2020, 19:36

Bedankt Koepel, voor je uitleg. Ik kreeg de foutmelding dat totMinuten not declared in this scope. Mijn gedachte was dat als ik hem boven in het prog als integer benoem, dat dit dan voor alle functies geregeld was.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: IF && doet niet wat ik wil

Berichtdoor Koepel » 14 Nov 2020, 21:03

Als je die variabele lokaal declareert in een functie, dan is die variabele niet beschikbaar in een andere functie.
Een globale variabele kun je in elke functie gebruiken.

Als je die ene lokale variabele globaal wilt maken, dan moet je er natuurlijk zelf aan denken om die lokale variabele daar niet meer te declareren, anders heb je twee variabelen met dezelfde naam. De compiler vind dat prima, maar wij niet ;)

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: ekotahoorub en 12 gasten