Zonnetracker vollop benut

Toon hier Uw afgeronde projecten aan anderen.
Gebruikers-avatar
Berichten: 256
Geregistreerd: 05 Apr 2018, 00:44
Woonplaats: ALKMAAR

Re: Zonnetracker vollop benut

Berichtdoor Gompy » 03 Sep 2019, 16:44

Mmmmmm.....werkt dus niet, paneel gaat nu van compleet links naar rechts of op en neer gedurende de delay van 30 minuten.
In mijn speurtocht voor de nieuwe sketch kwam ik het volgende tegen.
https://www.arduino.cc/reference/en/lan ... e/dowhile/
Nu was mijn gedachten om dit te gebruiken in een constant doorlopende loop totdat de while bereikt is en dan pas de delay in te laten gaan.

>Begin code verticaal<
Doe uitlezing en sturing verticaal.

int x = 0;
do {
x = dv(); // check the vertical sensors dh
} while (x != 0);
>Einde code verticaal<

>Begin code horizontaal<
Doe uitlezing en sturing horizontaal

int y = 0;
do {
x = dh(); // check the horizontal sensors dh
} while (y != 0);
>Einde code horizontaal<

IF (x=0 && y=0)
delay (30 minuten)


Mijn vraag zou dit kunnen werken als ik het gebruik per hoog/laag en links/recht sturing in de bestaande loop ?
Misschien een probleem (??), x en y (dv en dh) kunnen zowel positief als negatief zijn hoe pak ik zo iets aan ?

Advertisement

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

Re: Zonnetracker vollop benut

Berichtdoor Gij Kieken » 03 Sep 2019, 22:18

Heb ondertussen keer iets anders gemaakt, moet nog een beetje opgezuiverd worden maar het is ook nog maar een eerste probeersel.
Misschien kun je er wat mee al is het maar om te oefenen.
De LED's kun je vervangen door motor Links en motor Rechts ,en Led_Midden weglaten.
De potmeter zou een ldr uitlezing kunnen zijn,etc
Enfin tis maar om te proberen.
[code/*
Doel :Een hysteresis maken met een variabele Setpoint
Telkens de potmeter verdraaid wordt is dit het nieuwe Setpoint
De hysteresis werkt met een boven en ondergrens
Als ingang gebruiken we een potmeter 10K
1-zijde +Vcc,andere zijde Gnd,loper A0
3-LED 1Links,1midden,1Rechts met voorschakelweerstand 1K
Auteur :Gij Kieken
Datum :03/09/2019
Versie :_01
*/

int potValue = 0;//De waarde van de potmeter
int outputLevel = 0;//De return value van de functie
const int POTMETER_PIN = A0; //De loper van de potmeter
const int LED_LINKS_PIN = 10;//Led links aan pin10
const int LED_MIDDEN_PIN = 11; //Led midden aan pin11
const int LED_RECHTS_PIN = 12; //Led rechts aan pin12
#define AAN HIGH //1 of HIGH is Aan
#define UIT LOW //0 of LOW is Uit
//Hier maken we 3 const int door toepasssen enum
enum ledState {LED_LINKS = -1, LED_MIDDEN = 0, LED_RECHTS = 1};
enum ledState myLedState = LED_MIDDEN;//We starten in het midden

void setup() {
//Start de seriële verbinding
Serial.begin(9600);
//Configureer de I/O
pinMode(POTMETER_PIN, INPUT);
pinMode(LED_LINKS_PIN, OUTPUT);
pinMode(LED_MIDDEN_PIN, OUTPUT);
pinMode(LED_RECHTS_PIN, OUTPUT);
digitalWrite(LED_LINKS_PIN, UIT); //Led links Uit
digitalWrite(LED_MIDDEN_PIN, AAN); //Led midden Aan
digitalWrite(LED_RECHTS_PIN, UIT); //Led rechts Uit
}

void loop() {
potValue = analogRead(POTMETER_PIN);
Serial.print(F("De waarde van de potmeter is "));
Serial.print(potValue);
Serial.println("");
outputLevel = welke_Led_licht_op(potValue);
switch (outputLevel) {
case LED_LINKS:
digitalWrite(LED_LINKS_PIN, AAN); //Led links Aan
digitalWrite(LED_MIDDEN_PIN, UIT); //Led midden Uit
digitalWrite(LED_RECHTS_PIN, UIT); //Led rechts Uit
Serial.println(F("LED_LINKS is Aan "));
break;
case LED_MIDDEN:
digitalWrite(LED_LINKS_PIN, UIT); //Led links Uit
digitalWrite(LED_MIDDEN_PIN, AAN); //Led midden Aan
digitalWrite(LED_RECHTS_PIN, UIT); //Led rechts Uit
Serial.println(F("LED_MIDDEN is Aan "));
break;
case LED_RECHTS:
digitalWrite(LED_LINKS_PIN, UIT); //Led links Uit
digitalWrite(LED_MIDDEN_PIN, UIT); //Led midden Uit
digitalWrite(LED_RECHTS_PIN, AAN); //Led rechts Aan
Serial.println(F("LED_RECHTS is Aan "));
break;
}
delay(2000);//Wacht even en stel de huidige waarde in als Setpoint
digitalWrite(LED_LINKS_PIN, UIT); //Led links Uit
digitalWrite(LED_MIDDEN_PIN, AAN); //Led midden Aan
digitalWrite(LED_RECHTS_PIN, UIT); //Led rechts Uit
Serial.print(F("We wachten op bewegen potmeter en "));
Serial.println(F("LED_MIDDEN is terug Aan "));
}

//-----------------------------------------------
//Hier de functie om de drie Led's aan te sturen
int welke_Led_licht_op (int analogeWaardePotmeter) { //-1 links,0 midden,+1 rechts
int niveauUitgang = 0;
int BOVENGRENS = 20;//Kantelpunt bovengrens
int ONDERGRENS = 20;//Kantelpunt ondergrens
//We starten met de potmeter in het midden
static int lastPotValue;//Bereik 10-bit 0-1023
if (analogeWaardePotmeter <= (lastPotValue - ONDERGRENS)) {
niveauUitgang = -1;
}
if (analogeWaardePotmeter >= (lastPotValue + BOVENGRENS)) {
niveauUitgang = 1;
}
if ((analogeWaardePotmeter > (lastPotValue - ONDERGRENS)) &&
(analogeWaardePotmeter < (lastPotValue + BOVENGRENS)) ) {
niveauUitgang = 0;
}

lastPotValue = analogeWaardePotmeter;
return niveauUitgang;
}
]

[/code]

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

Re: Zonnetracker vollop benut

Berichtdoor Gij Kieken » 04 Sep 2019, 14:12

Het is een behoorlijke uitdaging om consequent nederlandstalige variabelen te gebruiken ,heb het daarom stilaan opgegeven.
Versie _02 ,verander de tijden waar nodig naar bijvoorbeeld 30min en probeer.

Code: Alles selecteren
/*
   Doel :Een hysteresis maken met een variabele Setpoint
         Telkens de potmeter verdraaid wordt is dit het nieuwe Setpoint
         De hysteresis werkt met een boven en ondergrens
         Als ingang gebruiken we een potmeter 10K
         1-zijde +Vcc,andere zijde Gnd,loper A0
         3-LED 1Links,1midden,1Rechts met voorschakelweerstand 1K
   Versie :_02
           Functie gemaakt voor de outputs aan te sturen
           We gebruiken millis() als timer
           De loop blijft verder lopen zonder delay
   Auteur :Gij Kieken
   Datum  :04/09/2019

*/

#define AAN HIGH //1 of HIGH is Aan
#define UIT LOW  //0 of LOW is Uit
int potValue = 0;//De waarde van de potmeter
int outputLevel = 0;//De return value van de functie
const int POTMETER_PIN = A0;    //De loper van de potmeter
const int LED_LINKS_PIN = 10;   //Led links aan pin10
const int LED_MIDDEN_PIN = 11;  //Led midden aan pin11
const int LED_RECHTS_PIN = 12;  //Led rechts aan pin12
unsigned long currentMillis;    //De huidige tijd
unsigned long previousMillis;   //De vorige tijd voor de knipper Led
unsigned long previousMillisStabilize;//De vorige tijd Setpoint
unsigned long previousMillisOutput;   //De vorige tijd voor de Outputs
unsigned long interval = 1000;  //Interval voor de knipper Led
unsigned long stabilizeInterval = 2000;//Interval voor het Setpoint
unsigned long outputInterval = 5000;//Interval voor controlOutput
int ledState = UIT;             //We starten met de Led Uit

//Hier maken we 3 const int door toepasssen enum
enum ledState {LED_LINKS = -1, LED_MIDDEN = 0, LED_RECHTS = 1};
enum ledState myLedState = LED_MIDDEN;//We starten in het midden

void setup() {
  //Start de seriële verbinding
  Serial.begin(9600);
  //Configureer de I/O
  pinMode(POTMETER_PIN, INPUT);
  pinMode(LED_LINKS_PIN, OUTPUT);
  pinMode(LED_MIDDEN_PIN, OUTPUT);
  pinMode(LED_RECHTS_PIN, OUTPUT);
  pinMode( LED_BUILTIN, OUTPUT);
  digitalWrite(LED_LINKS_PIN, UIT);  //Led links Uit
  digitalWrite(LED_MIDDEN_PIN, AAN); //Led midden Aan
  digitalWrite(LED_RECHTS_PIN, UIT); //Led rechts Uit
  digitalWrite(LED_BUILTIN, UIT);    //We starten met de knipper Led Uit
}

void loop() {
  currentMillis = millis();//Stel de tijd in
  potValue = analogRead(POTMETER_PIN);
  if ( currentMillis - previousMillisOutput >= outputInterval) { //Is de tijd verlopen?
    previousMillisOutput = currentMillis;//Onthoud de laatste waarde
    //Hier de functie voor de Led status te bepalen
    outputLevel = welke_Led_licht_op(potValue);//Functie bepalen welke Led's
    Serial.print(F("De waarde van de potmeter is "));
    Serial.print(potValue);
    Serial.println("");
    //Hier worden de uitgangen gestuurd
    control_Outputs (outputLevel);//Functie stuur de uitgangen Aan/Uit
  }
  //Hier worden de uitgangen terug gestabiliseerd
  if ( currentMillis - previousMillisStabilize >= stabilizeInterval) {//Is de tijd verlopen?
    previousMillisStabilize = currentMillis;//Onthoud de laatste waarde
    stabilize_Outputs();//Uitgangen terug stabilizeren
  }
//Om aan te tonen dat de loop gewoon verder loopt zonder delay
  //-----------------------------------------
  //Hier de routine om een Led asynchroon te laten knipperen
  if ( currentMillis - previousMillis >= interval) { //Is de tijd verlopen?
    previousMillis = currentMillis;//Onthoud de laatste waarde
    if ( ledState == AAN) { //Was de Led was Aan ?
      interval = 1000;//Nieuw interval Uit tijd op 1 seconde
      ledState = UIT; //Zet de status Uit
    } else  {         //Was de Led Uit?
      interval = 200; //Nieuw interval Aan tijd op 0.4 seconde
      ledState = AAN; //Zet de status Aan
    }
    digitalWrite( LED_BUILTIN, ledState); // set new led state
  }
} //End of void loop()
//-----------------------------------------------
//Hier de functie om te bepalen welke van de drie Led's aan te sturen
int welke_Led_licht_op (int analogeWaardePotmeter) { //-1 links,0 midden,+1 rechts
  int niveauUitgang = 0;
  int BOVENGRENS = 50;//Kantelpunt bovengrens
  int ONDERGRENS = 50;//Kantelpunt ondergrens
  //We starten met de potmeter in het midden
  static int lastPotValue;//Bereik 10-bit 0-1023
  if (analogeWaardePotmeter <= (lastPotValue - ONDERGRENS)) {
    niveauUitgang = -1;
  }
  if (analogeWaardePotmeter >= (lastPotValue + BOVENGRENS)) {
    niveauUitgang = 1;
  }
  if ((analogeWaardePotmeter > (lastPotValue - ONDERGRENS)) &&
      (analogeWaardePotmeter < (lastPotValue + BOVENGRENS)) ) {
    niveauUitgang = 0;
  }

  lastPotValue = analogeWaardePotmeter;
  return niveauUitgang;
}
//-------------------------------------------------
//Hier de functie om de uitgangen te sturen
void control_Outputs (int selection) {  //Welke Led's Aan/Uit
  switch (outputLevel) {
    case LED_LINKS:
      digitalWrite(LED_LINKS_PIN, AAN);  //Led links Aan
      digitalWrite(LED_MIDDEN_PIN, UIT); //Led midden Uit
      digitalWrite(LED_RECHTS_PIN, UIT); //Led rechts Uit
      Serial.println(F("LED_LINKS is Aan "));
      break;
    case LED_MIDDEN:
      digitalWrite(LED_LINKS_PIN, UIT);  //Led links Uit
      digitalWrite(LED_MIDDEN_PIN, AAN); //Led midden Aan
      digitalWrite(LED_RECHTS_PIN, UIT); //Led rechts Uit
      Serial.println(F("LED_MIDDEN is Aan "));
      break;
    case LED_RECHTS:
      digitalWrite(LED_LINKS_PIN, UIT);  //Led links Uit
      digitalWrite(LED_MIDDEN_PIN, UIT); //Led midden Uit
      digitalWrite(LED_RECHTS_PIN, AAN); //Led rechts Aan
      Serial.println(F("LED_RECHTS is Aan "));
      break;
  }
}
//-------------------------------------------------
//Hier de functie om de uitgangen terug te stabilizeren
void stabilize_Outputs () {  //Uitgangen terug stabiel
  digitalWrite(LED_LINKS_PIN, UIT);  //Led links Uit
  digitalWrite(LED_MIDDEN_PIN, AAN); //Led midden Aan
  digitalWrite(LED_RECHTS_PIN, UIT); //Led rechts Uit
  Serial.print(F("We wachten op bewegen potmeter en "));
  Serial.println(F("LED_MIDDEN is terug Aan "));
}

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

Re: Zonnetracker vollop benut

Berichtdoor Gompy » 04 Sep 2019, 14:47

Ik ben bang dat ik de hysteresis op moet geven want dit is echt veel te hoog voor mij gegrepen op dit moment.
Wel heb ik de hysteresis zoals je aan het begin hebt voorgelegd in een Arduino gezet en dat werkt perfect.
Maar......als beginner het in een sketch te gebruiken is voor mij gewoon te veel van het goede, ik loop telkens vast.

Ik wil even spelen met de DO WHILE functie omdat dit veel makkelijker voor mij te begrijpen is en eventueel toe te passen (aan te vullen) in mijn bestaande sketch.
Gewoon harde commando's zonder al te veel variabele te gebruiken en elle lange stukken code te gebruiken.
Telkens stukje bij beetje uitbreiden want om eerlijk te zijn zie ik in jouw code al na een tiental regels door de bomen het bos niet meer.
Niet dat de uitleg niet duidelijk is, maar ik moet het wel kunnen begrijpen en kunnen toepassen aan wat ik wil gaan bereiken met mijn bestaande zonnepaneel.

Er zijn vele uren aan bouwen, testen, opnieuw bouwen, enz en programmeren vooraf gegaan, dus het zomaar opzij schuiven wil ik liever niet.
Ik ben al veel "betere" oplossingen tegen gekomen, maar dan zou ik met zowel bouwen als programmeren geheel opnieuw moeten beginnen.
Dat programmeren van de sketch is geen probleem (die kost alleen tijd), maar het opnieuw bouwen gaat me veel tijd en geld kosten en dat wil ik voorkomen.

Over je inzet heb ik niets te klagen en waardeer het te zeerste, maar het is echt voor mij teveel in één keer.....sorry.

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

Re: Zonnetracker vollop benut

Berichtdoor Gij Kieken » 04 Sep 2019, 14:56

Je kunt ook een onorthodoxe manier toepassen.
Gooi eerst jouw delay uit de sketch of zet haar op bv op 100ms.
Pas millis toe om een timer te maken van bijvoorbeeld 30min.
Maak een uitgang bij waar je een relais aansluit die de spanning voor jouw motoren onderbreekt.
Laat die relais ieder halfuur bv 1min aan staan en dan terug een half uur uit.
Veelal als het een relais kaartje is van onze gele broeders moet je het invert aansturen.
Dit betekend als je de ingang IN1 van dit printje met gnd (LOW) verbind trek de relais aan.

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

Re: Zonnetracker vollop benut

Berichtdoor Gompy » 04 Sep 2019, 15:09

Ik gebruik een L298N voor de motor aansturing, de gebruikte motoren met reductie van het grote zonnepaneel verbruiken maar 50mA maximaal door de manier waarop ik ze gebruik (met schroefspindel).
Ook heb ik geen relais nodig om de eindstop of aan / uit te schakelen, ik laat de motoren omdraaien / stoppen met diodes en een eindschakelaar.
Ik had ooit eens compleet schema's, maar door een crash van mijn HD zijn die verloren gegaan dus kan ik op dit moment ook niet meer posten.
Bijlagen
Motor sturing met eindschakelaars 1.jpg
Motor sturing met eindschakelaars 1.jpg (14.85 KiB) 6266 keer bekeken
L298N-klein.jpg
L298N-klein.jpg (14.29 KiB) 6266 keer bekeken

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

Re: Zonnetracker vollop benut

Berichtdoor Gompy » 04 Sep 2019, 15:13

Een foto van het paneel en de aansturing met spindels en eindschakelaars.
Bijlagen
Zonnepaneel-1.jpg
Zonnepaneel-1.jpg (81.83 KiB) 6266 keer bekeken

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

Re: Zonnetracker vollop benut

Berichtdoor Gij Kieken » 04 Sep 2019, 15:21

Zit er een Enable ingang op die motor stuur kaartjes?

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

Re: Zonnetracker vollop benut

Berichtdoor Gompy » 04 Sep 2019, 16:43

Jazeker, maar die gebruik ik niet.
Zou ik hem willen gebruiken dan moet ik de gehele ingebouwd elektronica uit de kast verwijderen en dat is nu niet meer te doen met dit weer......had ik aan het begin van de zomer moeten doen.
https://c.76.my/Malaysia/arduino-l298n- ... erce@4.jpg

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

Re: Zonnetracker vollop benut

Berichtdoor Gij Kieken » 04 Sep 2019, 17:13

Als het droog weer is ,is je oplossing nabij.
Twee brugdraadjes plaatsen en een heel klein stukje code.
Je kunt dan kiezen ofwel 1-uitgang gebruiken per Enable ingang ofwel 1-uitgang voor beide Enable ingangen.
De code kun je reeds afleiden uit het laatste voorbeeldje.
Het stukje code voor de knipper Led.

VorigeVolgende

Terug naar Afgeronde projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten