Zonnetracker vollop benut

Toon hier Uw afgeronde projecten aan anderen.
Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Zonnetracker vollop benut

Berichtdoor nicoverduin » 29 Aug 2019, 20:21

Een flag kan je zien als een boolean
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Advertisement

Gebruikers-avatar
Berichten: 256
Geregistreerd: 05 Apr 2018, 00:44
Woonplaats: ALKMAAR

Re: Zonnetracker vollop benut

Berichtdoor Gompy » 31 Aug 2019, 17:03

Weer dagen aan het proberen, maar die zgn boolean / flag wil me niet lukken.
Het probleem blijft zitten op het moment dat de waarde(n) van een sensor onder de ingestelde waarde komt en direct weer naar boven de ingestelde waarde gaat.

Voorbeeld:
Motor zou naar de nachtstand moeten gaan op het moment dat de waarde bv 150 is.
Zon zakt dus de sensor krijgt minder licht - waarde bv 250 (motor down)
Zon krijgt weer iets meer kracht en de waarde gaat naar 260 (motor up)

Dit herhaalt zich totdat de sensor daadwerkelijk de bv 150 bereikt, maar in de tussen tijd gaan de motor heen en weer tot vervelens toe van de buurvrouw.

Kan iemand me eens duidelijk uitleggen hoe ik zo iets kan aanpakken ?
Dan bedoel ik niet met "je moet een flag gebruiken" of "zie het als een boolean" want daar ben ik nog steeds niet ver(der) mee gekomen.

Mvg, Rob

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Zonnetracker vollop benut

Berichtdoor Gij Kieken » 31 Aug 2019, 18:01

Een hysteresis inbouwen ,voorbeelden daarvan kun je vinden op het net en hier op het forum ook wel.
Op deze manier stel je een kantelpunt in voor inschakelen en een andere waarde om terug uit te schakelen ipv bv 150.

Gebruikers-avatar
Berichten: 256
Geregistreerd: 05 Apr 2018, 00:44
Woonplaats: ALKMAAR

Re: Zonnetracker vollop benut

Berichtdoor Gompy » 31 Aug 2019, 18:11

Gij Kieken schreef:Een hysteresis inbouwen ,voorbeelden daarvan kun je vinden op het net en hier op het forum ook wel.
Op deze manier stel je een kantelpunt in voor inschakelen en een andere waarde om terug uit te schakelen ipv bv 150.


Je bedoelt RTFM ?

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Zonnetracker vollop benut

Berichtdoor Gij Kieken » 31 Aug 2019, 18:30

Neen dit bedoel ik niet ,ben hier even heel druk bezig met huistaken vervullen vandaar....
Maar door toepassen van een hysteresis stel je bv inschakelen op 150 en terug uit als de waarde gezakt is tot bv 130...
vrij in te stellen ,voorbeelden kun je wel vinden of even zelf proberen met een potmeter en een led,wil wel een voorbeeldje geven maar heb nu andere taken...
https://www.hackster.io/pandhoit/arduin ... rol-397dad

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Zonnetracker vollop benut

Berichtdoor Gij Kieken » 31 Aug 2019, 19:41

Hier nog een voorbeeldje met wat uitleg erbij. https://courses.ideate.cmu.edu/99-355/s ... resis.html
Pas het aan naar je behoefte.

Gebruikers-avatar
Berichten: 256
Geregistreerd: 05 Apr 2018, 00:44
Woonplaats: ALKMAAR

Re: Zonnetracker vollop benut

Berichtdoor Gompy » 01 Sep 2019, 13:00

Bedankt, deze link had ik ook al gevonden maar lost het probleem (nog) niet op.
Ik heb het vermoeden dat de plaats van de "night" opdracht in de sketch niet goed is.
Een klein deel heb ik al getackeld, maar het pendelen blijft en dat verwijt ik aan de plaats waar de "night" stand staat.
Persoonlijk denk ik dat de (IF / hysteresis) "night" hiervoor op de verkeerde plaats staat.
Mijn gedachte is dat er eerst naar de staat (te donker of nog licht genoeg) gekeken moet worden en dan pas naar de opdracht.
Nu wordt er eerst naar de opdrachten gekeken en dan pas naar de hysteresis en mijn gevoel zegt dat dat anders om moet (....).
Helaas heb ik (nog) te weinig kennis om daar over te oordelen en blijf daarom in kringetjes draaien (gelijk het zonnepaneel).

Toch een beetje vreemd dat er mensen op dit forum zijn met zoveel kennis dat ze dat niet zien of aan geven.
Nog één keer de volledig sketch voor degene die wel weten waar de oplossing ligt.

cpp code
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

// LiquidCrystal_I2C lcd(0x27,20,4); // LCD BLUE
LiquidCrystal_I2C lcd(0x3F,20,4); // LCD GREEN

// motor azimuth
int in1 = 9; // D9 output to in1 L298N module
int in2 = 10; // D10 output to in2 L298N module
// motor elevation
int in3 = 11; // D11 output to in3 L298N module
int in4 = 12; // D12 output to in4 L298N module

void setup()
{
Serial.begin(9600); // initialize the serial port

lcd.init(); // initialize the lcd
lcd.backlight(); // ON

}

void loop()
{
// LDR LIGHT SENSORS
int tr = analogRead(A0); // LDR top right
int br = analogRead(A1); // LDR bottom right
int tl = analogRead(A2); // LDR top left
int bl = analogRead(A3); // LDR bottom left

// control delay time in milliseconds of LIGHT SENSOR readings - Arduino LED indicate time
// Input A7 0 till 5 Volt
int delaytime = analogRead(A7)*29.326 ; // 30 seconds wait befor next_run
// set range for read time 30 sec display
int next_loop = map(analogRead(A7), 1023, 0, 30, 0);

// set range of tolerance between LIGHT SENSOR readings
// Input A6 0 till 5 Volt
int tolerance = analogRead(A6)/20.48; // difference 50 between sensors

// set average values LDR's
int avt = (tr + tl) / 2; // average value top
int avd = (bl + br) / 2; // average value down
int avl = (tl + bl) / 2; // average value left
int avr = (tr + br) / 2; // average value right
// average difference of top and bottom LIGHT SENSORS
int dv = avt - avd;
// average difference of left and right LIGHT SENSORS
int dh = avl - avr;

//print values to serial monitor for debugging
Serial.println("********************");
Serial.print("Top Left\t");
Serial.print(tl);
Serial.println();
Serial.print("Top Right\t");
Serial.print(tr);
Serial.println();
Serial.print("Bottom Left\t");
Serial.print(bl);
Serial.println();
Serial.print("Bottom Right\t");
Serial.print(br);
Serial.println();
Serial.println();
Serial.print("Delaytime sec\t");
Serial.print(next_loop);
Serial.println();
Serial.println();
Serial.print("Tolerance\t");
Serial.print(tolerance);
Serial.println();
Serial.println();
Serial.print("+UP<>DOWN-\t");
Serial.print(dv);
Serial.println();
Serial.print("AVT - up\t");
Serial.print(avt);
Serial.println();
Serial.print("AVD - down\t");
Serial.print(avd);
Serial.println();
Serial.println();
Serial.print("+WEST<>EAST-\t");
Serial.print(dh);
Serial.println();
Serial.print("AVL - west\t");
Serial.print(avl);
Serial.println();
Serial.print("AVR - east\t");
Serial.print(avr);
Serial.println();
Serial.println();

if (-1*tolerance > dv || dv > tolerance) // check difference in top/bottom LIGHT SENSORS is greater than tolerance
{
// change direction motor with < and >
if (avt < avd) // if average LIGHT SENSOR values on top side are smaller than on bottom side then elevation motor rotates CLOCKWISE
{
// set motor Elevation down
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
Serial.println("ELEVATION MOTOR DOWN");
lcd.setCursor(0,0);
lcd.print("ELEVATION : DOWN "); // print lcd row 1
}
else // if average LIGHT SENSOR values on bottom side are greater than on top side then elevation motor rotates COUNTERCLOCKWISE
{
// set motor Elevation up
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
Serial.println("ELEVATION MOTOR UP");
lcd.setCursor(0,0);
lcd.print("ELEVATION : UP ");// print lcd row 1
}
}
else if (-1*tolerance < dv || dv < tolerance) // if difference is smaller than tolerance, STOP elevation motor
{
// stop Elevation motor
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
Serial.println("ELEVATION MOTOR STOP");
lcd.setCursor(0,0);
lcd.print("ELEVATION : STOP "); // print lcd row 1

// Elevation moves down at night
if ((avt < 700) && (avd < 700)) // sensor value
{
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
Serial.println("ELEVATION MOTOR NIGHT");
lcd.setCursor(0,0);
lcd.print("ELEVATION : NIGHT"); // print lcd row 1
}
}

if (-1*tolerance > dh || dh > tolerance) // check difference in left and right LIGHT SENSORS is within tolerance range
{
// change direction motor with < and >
if (avr < avl) // if average LIGHT SENSOR values on left side are greater than right side, azimuth motor rotates CLOCKWISE
{
// set motor Azimuth west / left
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
Serial.println("AZIMUTH MOTOR WEST");
lcd.setCursor(0,1);
lcd.print("AZIMUTH : WEST "); // print lcd row 2
}
else // if average LIGHT SENSOR values on right side are greater than on left side, azimuth motor rotates COUNTERCLOCKWISE
{
// set motor Azimuth east / right
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
Serial.println("AZIMUTH MOTOR EAST");
lcd.setCursor(0,1);
lcd.print("AZIMUTH : EAST "); // print lcd row 2
}
}
else if (-1*tolerance < dh || dh < tolerance) //if difference is smaller than tolerance, STOP azimuth motor
{
// stop motor Azimuth
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
Serial.println("AZIMUTH MOTOR STOP");
lcd.setCursor(0,1);
lcd.print("AZIMUTH : STOP "); // print lcd row 2
}

// Azimuth moves east at night / right
if ((avr < 700) && (avl < 700)) // sensorvalue
{
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
Serial.println("AZIMUTH MOTOR NIGHT");
lcd.setCursor(0,1);
lcd.print("AZIMUTH : NIGHT"); // print lcd row 2
}

// print lcd delaytime row 3
lcd.setCursor(0,2);
lcd.print("DELAY : ");
char temp[5]; // enough room for 4 numbers
snprintf(temp,6, "%4d", (delaytime/1000)); // %4d = 4 digits, right aligned
lcd.print(temp);
lcd.setCursor(18, 2); // original 18
lcd.print("s"); // time in seconds
{
// print lcd sensitive row 4
lcd.setCursor(0,3);
lcd.print("TOLERANCE : ");
char temp1[5]; // enough room for4 numbers
snprintf(temp1,6, "%5d", tolerance); // %4d = 4 digets, right aligned
lcd.print(temp1);
lcd.setCursor(18, 3);
lcd.print("+-");

delay(delaytime);

}
}

void print2digits(int number)
{
if (number >= 0 && number < 10)
{
Serial.write('0');
}
Serial.print(number);
}

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Zonnetracker vollop benut

Berichtdoor Gij Kieken » 01 Sep 2019, 14:01

Ga het vanavond bekijken,de volgend vraag was graag eerst de volledige meest recente sketch.
Bij deze is dit dus al gebeurd.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Zonnetracker vollop benut

Berichtdoor shooter » 01 Sep 2019, 14:41

heb al een stukje gedaan, maar moet even weg
cpp code
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// LiquidCrystal_I2C lcd(0x27,20,4); // LCD BLUE weghalen als het niet nodig is
LiquidCrystal_I2C lcd(0x3F, 20, 4); // LCD GREEN

// motor azimuth
int PinMotorLinks = 9; // D9 output to in1 L298N module even gesteld dat dit links is verander dan overal in1 naar PinMotorLinks
int PinMotorRechts = 10; // D10 output to in2 L298N module // en de andere natuurlijk ook dus PinMotorRechts
// motor elevation
int PinMotorOmhoog = 11; // D11 output to in3 L298N module PinMotorOmhoog
int PinMotorOmlaag = 12; // D12 output to in4 L298N module PinMotorOmlaag
int PinSensorTopRechts = A0;
int PinSensorOnderRechts = A1;
int PinSensorTopLinks = A2;
int PinSensorOnderLinks = A3;// de rest even zelf doen
// dat maakt het allemaal leesbaar, en wij snappen het dan ook
int tl;
int tr;
int bl;
int br;
int next_loop;
int tolerance;
int dv;
int dh;
int avt;
int avl;
int avr;
int avd;

void setup()
{
Serial.begin(9600); // initialize the serial port

lcd.init(); // initialize the lcd
lcd.backlight(); // ON
// ik mis de pinMode voor de uitgangen
pinMode (PinMotorLinks, OUTPUT); //
pinMode (PinMotorRechts, OUTPUT);
pinMode (PinMotorOmhoog, OUTPUT);
pinMode (PinMotorOmlaag, OUTPUT);
pinMode (PinSensorTopLinks, INPUT);
pinMode (PinSensorTopRechts, INPUT);
pinMode (PinSensorOnderLinks, INPUT);
pinMode (PinSensorOnderRechts, INPUT);
// hier ook toevoegen
}

void loop()
{
// LDR LIGHT SENSORS de rest even zelf veranderen dus tr is TopRechts
int tr = analogRead(PinSensorTopRechts); // LDR top right
int br = analogRead(PinSensorOnderRechts); // LDR bottom right
int tl = analogRead(PinSensorTopLinks); // LDR top left
int bl = analogRead(PinSensorOnderLinks); // LDR bottom left

// control delay time in milliseconds of LIGHT SENSOR readings - Arduino LED indicate time
// Input A7 0 till 5 Volt
int delaytime = analogRead(A7) * 29.326 ; // 30 seconds wait befor next_run
// set range for read time 30 sec display
int next_loop = map(analogRead(A7), 1023, 0, 30, 0);

// set range of tolerance between LIGHT SENSOR readings
// Input A6 0 till 5 Volt
int tolerance = analogRead(A6) / 20.48; // difference 50 between sensors

// set average values LDR's
int avt = (tr + tl) / 2; // average value top
int avd = (bl + br) / 2; // average value down
int avl = (tl + bl) / 2; // average value left
int avr = (tr + br) / 2; // average value right
// average difference of top and bottom LIGHT SENSORS
int dv = avt - avd; // hier staat dus het verschil boven en onder prima
// average difference of left and right LIGHT SENSORS
int dh = avl - avr;
// hier een functie voor het printen
printen();
if ((avr < 700) && (avl < 700)) // sensorvalue
{
digitalWrite(PinMotorLinks, LOW);
digitalWrite(PinMotorRechts, HIGH);
Serial.println("AZIMUTH MOTOR NIGHT");
lcd.setCursor(0, 1);
lcd.print("AZIMUTH : NIGHT"); // print lcd row 2
}

if (-1 * tolerance > dv || dv > tolerance) // check difference in top/bottom LIGHT SENSORS is greater than tolerance
{
// change direction motor with < and >
if (avt < avd) // if average LIGHT SENSOR values on top side are smaller than on bottom side then elevation motor rotates CLOCKWISE
{
// set motor Elevation down
digitalWrite(PinMotorOmhoog, HIGH);
digitalWrite(PinMotorOmlaag, LOW);
Serial.println("ELEVATION MOTOR DOWN");
lcd.setCursor(0, 0);
lcd.print("ELEVATION : DOWN "); // print lcd row 1
}
else // if average LIGHT SENSOR values on bottom side are greater than on top side then elevation motor rotates COUNTERCLOCKWISE
{
// set motor Elevation up
digitalWrite(PinMotorOmhoog, LOW);
digitalWrite(PinMotorOmlaag, HIGH);
Serial.println("ELEVATION MOTOR UP");
lcd.setCursor(0, 0);
lcd.print("ELEVATION : UP ");// print lcd row 1
}
}
else if (-1 * tolerance < dv || dv < tolerance) // if difference is smaller than tolerance, STOP elevation motor
{
// stop Elevation motor
digitalWrite(PinMotorOmhoog, LOW);
digitalWrite(PinMotorOmlaag, LOW);
Serial.println("ELEVATION MOTOR STOP");
lcd.setCursor(0, 0);
lcd.print("ELEVATION : STOP "); // print lcd row 1

// Elevation moves down at night
if ((avt < 700) && (avd < 700)) // sensor value
{
digitalWrite(PinMotorOmhoog, HIGH);
digitalWrite(PinMotorOmlaag, LOW);
Serial.println("ELEVATION MOTOR NIGHT");
lcd.setCursor(0, 0);
lcd.print("ELEVATION : NIGHT"); // print lcd row 1
}
}

if (-1 * tolerance > dh || dh > tolerance) // check difference in left and right LIGHT SENSORS is within tolerance range
{
// change direction motor with < and >
if (avr < avl) // if average LIGHT SENSOR values on left side are greater than right side, azimuth motor rotates CLOCKWISE
{
// set motor Azimuth west / left
digitalWrite(PinMotorLinks, HIGH);
digitalWrite(PinMotorRechts, LOW);
Serial.println("AZIMUTH MOTOR WEST");
lcd.setCursor(0, 1);
lcd.print("AZIMUTH : WEST "); // print lcd row 2
}
else // if average LIGHT SENSOR values on right side are greater than on left side, azimuth motor rotates COUNTERCLOCKWISE
{
// set motor Azimuth east / right
digitalWrite(PinMotorLinks, LOW);
digitalWrite(PinMotorRechts, HIGH);
Serial.println("AZIMUTH MOTOR EAST");
lcd.setCursor(0, 1);
lcd.print("AZIMUTH : EAST "); // print lcd row 2
}
}
else if (-1 * tolerance < dh || dh < tolerance) //if difference is smaller than tolerance, STOP azimuth motor
{
// stop motor Azimuth
digitalWrite(PinMotorLinks, LOW);
digitalWrite(PinMotorRechts, LOW);
Serial.println("AZIMUTH MOTOR STOP");
lcd.setCursor(0, 1);
lcd.print("AZIMUTH : STOP "); // print lcd row 2
}

// Azimuth moves east at night / right

// print lcd delaytime row 3
lcd.setCursor(0, 2);
lcd.print("DELAY : ");
char temp[5]; // enough room for 4 numbers
snprintf(temp, 6, "%4d", (delaytime / 1000)); // %4d = 4 digits, right aligned
lcd.print(temp);
lcd.setCursor(18, 2); // original 18
lcd.print("s"); // time in seconds
{
// print lcd sensitive row 4
lcd.setCursor(0, 3);
lcd.print("TOLERANCE : ");
char temp1[5]; // enough room for4 numbers
snprintf(temp1, 6, "%5d", tolerance); // %4d = 4 digets, right aligned
lcd.print(temp1);
lcd.setCursor(18, 3);
lcd.print("+-");

delay(delaytime);

}
}

void print2digits(int number)
{
if (number >= 0 && number < 10)
{
Serial.write('0');
}
Serial.print(number);
}
void printen () { //print values to serial monitor for debugging
Serial.println("********************");
Serial.print("Top Left\t");
Serial.print(tl);
Serial.println();
Serial.print("Top Right\t");
Serial.print(tr);
Serial.println();
Serial.print("Bottom Left\t");
Serial.print(bl);
Serial.println();
Serial.print("Bottom Right\t");
Serial.print(br);
Serial.println();
Serial.println();
Serial.print("Delaytime sec\t");
Serial.print(next_loop);
Serial.println();
Serial.println();
Serial.print("Tolerance\t");
Serial.print(tolerance);
Serial.println();
Serial.println();
Serial.print("+UP<>DOWN-\t");
Serial.print(dv);
Serial.println();
Serial.print("AVT - up\t");
Serial.print(avt);
Serial.println();
Serial.print("AVD - down\t");
Serial.print(avd);
Serial.println();
Serial.println();
Serial.print("+WEST<>EAST-\t");
Serial.print(dh);
Serial.println();
Serial.print("AVL - west\t");
Serial.print(avl);
Serial.println();
Serial.print("AVR - east\t");
Serial.print(avr);
Serial.println();
Serial.println();
}
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Zonnetracker vollop benut

Berichtdoor Gij Kieken » 01 Sep 2019, 19:23

@Shooter ,dit is natuurlijk veel gemakkelijker lezen zo.
@Gompy,er zijn veel manieren om iets op te lossen, hier misschien een voorbeeldje wat je uit kan proberen en proberen te begrijpen;
Vervolgens combineren in jouw code,
Code: Alles selecteren
//Geschikt voor Arduino UNO,Nano, etc...
//Sluit een potmeter van 10Kohm aan
//een zijde aan +5volt
//de andere aan Gnd
//de loper op A0

const int INPUT_PIN = A0;         //De ingang die we gebruiken
enum dayState { NACHT, DAG};      //Eigelijk zijn dit constant int,NACHT=0 en DAG=1
enum dayState myDayState = NACHT; //Declareer de status van de variabele
const int dag_drempel = 700;      //Kantelpunt voor DAG modus
const int nacht_drempel = 300;    //Kantelpunt voor NACHT modus

void setup() {
  // put your setup code here, to run once:
  //Initialiseer de Serial port
  Serial.begin(9600);
  //Configureer de I/O
  pinMode(LED_BUILTIN, OUTPUT);
  //We starten met de LED Aan
  digitalWrite(LED_BUILTIN , HIGH);
}

void loop() {
  // put your main code here, to run repeatedly:
  //Lees de waarde van de potmeter
  int potmeterWaarde = analogRead(INPUT_PIN);
  /*Verander hier potmeterWaarde in een voor jouw beter geschikte naam
    en stel die gelijk aan jouw gemiddelde LDR waardes
    gebruik uiteraard jouw variabele naam verder in de sketch
    De variabele myDayState kun je gebruiken als een reeds eerder
    vermelde vlag
   
    Verder in jouw sketch waar nodig zet je dan
    if (myDayState == DAG) { //Is het Dag?
    doe je code, zoals motors laten draaien etc...
    }

    en waar nodig als het Nacht is
    if (myDayState == NACHT) { //Is het Nacht?
    doe je code, zoals motors laten draaien etc...
    }   
   
  */

  if (myDayState == DAG) { //Is het Dag?
    if (potmeterWaarde < nacht_drempel) {
      Serial.print("De Nacht is gevallen ");
      Serial.println(potmeterWaarde);
      Serial.println("Er is een overgang van Dag naar Nacht status.");

      myDayState = NACHT;//Dit is een zogenaamde vlag die verder kunt gebruiken
      digitalWrite(LED_BUILTIN, HIGH);//Het is Nacht de Led is Aan
    }
  } else { //Het moet nu Nacht zijn
    if (potmeterWaarde > dag_drempel) {
      Serial.print("De zon komt op ");
      Serial.println(potmeterWaarde);
      Serial.println("Er is een overgang van Nacht naar Dag status.");

      myDayState = DAG;//Dit is een vlag die verder kunt gebruiken
      digitalWrite(LED_BUILTIN , LOW);//Schakel de Led Uit het is Dag
    }
  }
}

VorigeVolgende

Terug naar Afgeronde projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten