Zonnetracker vollop benut

Toon hier Uw afgeronde projecten aan anderen.
Gebruikers-avatar
Berichten: 2192
Geregistreerd: 06 Aug 2016, 01:03

Re: Zonnetracker vollop benut

Berichtdoor Koepel » 20 Sep 2019, 08:37

Prima.
Zolang je in de "while" zit, kun je geen nieuwe waardes op het scherm zetten. Als dat niet geeft, dan kun je natuurlijk gewoon een "while" gebruiken en daar een tijdje in bezig zijn.
Gebruik je iedere keer je hele project om iets uit te proberen ? Heb je iets om eenvoudigs om je sketch te proberen ?

Advertisement

Gebruikers-avatar
Berichten: 172
Geregistreerd: 05 Apr 2018, 00:44

Re: Zonnetracker vollop benut

Berichtdoor Gompy » 20 Sep 2019, 11:18

Kijk niemand die vermeldt dat het programma ALLEEN in dat stukje loop staat te draaien in de voorbeelden / lessen.
Ik dacht dat net zoals in PLC's de loop constant doorlopen werd, maar op het moment dat er een while niet juist is overgeslagen werd.
De uitlezing op de display moet alleen de staat weergeven waarin de sketch iets doet, doet dat stukje sketch niets dan is de informatie ook niet relevant voor de LCD.

In de (uitgeklede) test sketch heb ik alleen 4 voorwaarden if(rechtsom) , else(linksom) , else if(stop) en een if(nacht) staan en een stukje printen LCD en serial.
Als ik alleen de voorbeelden uit bv de lessen gebruik werkt eea wel, maar als ik het in mijn test sketch zet is het een ander verhaal.
Dat is ook waarom ik het soms niet snap dat het niet werkt.

Liever wil ik niet de while gebruiken maar een extra STATE voor de dagfunctie.
IF (normale voorwaarden) && (dagvoorwaarden)
Maar dan loop ik weer vast op de ELSE en ELSE IF want als de IF niet moet worden uitgevoerd dan zal de sketch het andere gaan doen.
Ik zoek dus iets wat het complete "blok" if, else, else if, op non-actief stelt (nacht) of juist wel actief zet (dag)

Op dit moment heb ik alleen een voorwaarde in de nacht staan (als licht < waarde) en niet in de dag.
Hierdoor wordt de dag uitgevoerd om vervolgens toch uiteindelijk de nacht uit te voeren.....volgorde in (huidige) sketch.

Gebruikers-avatar
Berichten: 172
Geregistreerd: 05 Apr 2018, 00:44

Re: Zonnetracker vollop benut

Berichtdoor Gompy » 20 Sep 2019, 12:27

Stukje van de test sketch waarin het "huppeltje" (geen dag, dan nacht) nog ontbreekt.

Code: Alles selecteren
//-------------------------------------------------------
// START PROGRAM RUN ELEVATION MOTOR
//-------------------------------------------------------
  if (-1*tolerance > dv || dv > tolerance) // check difference in top/bottom LIGHT SENSORS is greater than tolerance
{
// CHANGE ELEVATION MOTOR DIRECTION
  if (avt < avb) // If average LIGHT SENSOR values on top side are smaller than on bottom side then elevation motor rotates CLOCKWISE
  {
// SET ELEVATION MOTOR DOWN
  digitalWrite(in3, HIGH && enableState);
  digitalWrite(in4, LOW);
  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 ELEVATION MOTOR UP
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH && enableState);
  lcd.setCursor(0,0);
  lcd.print("ELEVATION   :     UP");// Print lcd row 1
  }
}
  else if (-1*tolerance < dv || dv < tolerance) // If difference is smaller tolerance, STOP elevation motor
  {
// STOP ELEVATION MOTOR
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  lcd.setCursor(0,0);
  lcd.print("ELEVATION   :   STOP"); // Print lcd row 1
 
// MOVE ELEVATION MOTOR NIGHT POSITION
  if (ev <= aevn) // Sensor values night < 300
  {
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  lcd.setCursor(0,0);
  lcd.print("ELEVATION   :  NIGHT"); // Print lcd row 1
  }
}

Gebruikers-avatar
Berichten: 172
Geregistreerd: 05 Apr 2018, 00:44

Re: Zonnetracker vollop benut

Berichtdoor Gompy » 20 Sep 2019, 19:21

Mmm, 5 dagen na de upload in de Arduino loopt de boel vast :(

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

Re: Zonnetracker vollop benut

Berichtdoor Gij Kieken » 20 Sep 2019, 20:26

Zie de rest van de code niet,zou wel eens kunnen zijn dat het geheugen stilaan opraakt.
Heb je nu al eens de print F-macro bekeken?

Gebruikers-avatar
Berichten: 172
Geregistreerd: 05 Apr 2018, 00:44

Re: Zonnetracker vollop benut

Berichtdoor Gompy » 20 Sep 2019, 20:48

Ik heb hem nogmaals gecompileerd en geupload, maar het gebruikte (dynamisch) geheugen blijft 28%.....boven schreef ik al ~30% weet je nog :)

Alleen verstoort het F de serial print functie

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

Re: Zonnetracker vollop benut

Berichtdoor Gij Kieken » 20 Sep 2019, 21:06


Gebruikers-avatar
Berichten: 172
Geregistreerd: 05 Apr 2018, 00:44

Re: Zonnetracker vollop benut

Berichtdoor Gompy » 20 Sep 2019, 21:19

Daar heb ik hem vandaan..... :(
Maar ondanks dat ik een nieuwe upload naar de nano heb gedaan krijg ik nog steeds dit te zien.
Bijlagen
serialprint.jpg
serialprint.jpg (14.28 KiB) 83 keer bekeken

Gebruikers-avatar
Berichten: 172
Geregistreerd: 05 Apr 2018, 00:44

Re: Zonnetracker vollop benut

Berichtdoor Gompy » 20 Sep 2019, 21:26

Sorry, zag dat de buadrate (nog) verkeerd stond.....schaam me diep.
Bijlagen
Geheugen.jpg
Geheugen.jpg (7.89 KiB) 83 keer bekeken

Gebruikers-avatar
Berichten: 172
Geregistreerd: 05 Apr 2018, 00:44

Re: Zonnetracker vollop benut

Berichtdoor Gompy » 21 Sep 2019, 00:33

Nog even tussendoor de sketch van 20-09-2019 zoals hij draait op het grote zonnepaneel.

Code: Alles selecteren
/* SOLARTRACKER
 *
 * IN AND OUTPUTS Arduino (nano)
 * A0 = tr - input LDR top right
 * A1 = br - input LDR bototm right
 * A2 = tl - input LDR top left
 * A3 = bl - input LDR bottom left
 * A4 = sda LCD 4x20
 * A5 = sdc LCD 4x20
 * A6 = input potentiometer 10k for tolerange between all LDR's
 * A7 = input current module ACS712
 *
 * D9  = in1 - output L298N - motor left/right
 * D10 = in2 - output L298N - motor left/right
 * D11 = in3 - output L298N -motor up/down
 * D12 = in4 - output L298N - motor up/down
 *
 * SHORTCUTS IN SKETCH
 * avt = average top LDR's tl and tr
 * avb = average bottom LDR's bl and br
 * avl = average left LDR's tl and bl
 * avr = average right LDR's tr and br
 * dv = differenge vertical LDR's avt and avb
 * dh = difference horizontal LDR's avl and avr
 * av = average value azimute
 * ev = average value elevation
 * aavn = average azimuth value night
 * aevn = average elevation value night
 */

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

//-------------------------------------------------------
// SET I2C ADDRESS FOR LCD
//-------------------------------------------------------
LiquidCrystal_I2C lcd(0x27,20,4); // LCD address

//-------------------------------------------------------
// 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

//-------------------------------------------------------
// START LOOP ACTIVE RUNTIME
//-------------------------------------------------------
unsigned long currentMillis;          // Current time
unsigned long previousMillis;        // Past time
unsigned long interval = 180000; // Startup runtime motors for position 3*1000mS*60S=3min
int enableState = HIGH;              // Start with ON

//-------------------------------------------------------
//START PRINTTIME
//-------------------------------------------------------
unsigned long previousMillisPrint;                  // Serial print
const unsigned long intervalPrint = 10000UL; // Serial print interval 10 seconds

//-------------------------------------------------------
// CURRENT SENSOR ACS712
//-------------------------------------------------------

const int currentPin = A7;
int sensitivity = 100;        // 185=5A 100=20A 66=30A
int adcValue= 0;
int offsetVoltage = 2500; // For DC charge and discharge
double adcVoltage = 0;
double currentValue = 0;

void setup()
{
  Serial.begin(115200); // Initialize the serial port
  lcd.begin();                // Initialize LCD
  lcd.backlight();           // ON

//-------------------------------------------------------
// PIN ASSIGN
//-------------------------------------------------------
  pinMode(in1, OUTPUT); // D9 to module in1 L298N
  pinMode(in2, OUTPUT); // D10 to module in2 L298N
  pinMode(in3, OUTPUT); // D11 to module in3 L298N
  pinMode(in4, OUTPUT); // D12 to todule in3 L298N
  pinMode(A0, INPUT);    // Top left LDR
  pinMode(A1, INPUT);    // Top right LDR
  pinMode(A2, INPUT);    // Bottom left LDR
  pinMode(A3, INPUT);    // Bottom right LDR
  pinMode(A6, INPUT);    // Potentiometer reading tolerance LDR's
  pinMode(A7, INPUT);    // Sensor ACS712 currentmeter battery

//-------------------------------------------------------
// PRINT START MESSAGE ON LCD
//-------------------------------------------------------
  lcd.setCursor(1,0);
  lcd.print(F("Gompy SolarTracker"));
  lcd.setCursor(2,1);
  lcd.print(F("The Netherlands"));
  lcd.setCursor(6,2);
  lcd.print(F("STARTED"));
  lcd.setCursor(0,3);
  lcd.print(F("VERSION 2.4 20092019")); 
  delay(3000);
  lcd.clear();

//-------------------------------------------------------
// PRINT START MESSAGE TO SERIALMONITOR
//-------------------------------------------------------
  Serial.println(F("MONITOR STARTED"));
  Serial.println(F("NEW VALUES WILLBE ACTIVE IF"));
  Serial.println(F("SOLARPANEL GOTO START POSITION")); 
}
 
void loop()
{
//------------------------------------------------------- 
// ROUTINE FLAG TO RUN ASYNCHONE TIMER
//-------------------------------------------------------
  currentMillis = millis(); // Set loop time ON
  if (currentMillis - previousMillis >= interval)
 {
// HAS TIME PASSED ?
  previousMillis = currentMillis; // Remember last value
  if (enableState == HIGH)
  {
// IS STATE ON ?
  interval = 1800000; // Set next loop time 30min (1*1000*60*30)
  enableState = LOW; // Set state OFF
 }
  else
  {
// IS STATE OFF ?
  interval = 180000;    // Set motor run time 3min (1*1000*60*3)
  enableState = HIGH; // Set state on
  }
}
//-------------------------------------------------------
// 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
 
// SET TOLERANCE SENSORS VALUES 0 - 50
  int tolerance = analogRead(A6)/20.46; // Difference 50 between sensors

// AVERAGE VALUE LDR'S
  int avt = (tr + tl) / 2;   // Average value top
  int avb = (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 - avb;
// AVERACE DIFFERENCE OF LEFT AND RIGHT LIGHT SENSORS
  int dh = avl - avr;
// AVERAGE AZIMUTE VALUE NIGHT
  int av = (avt + avb) / 2;
  int aavn = 300;            // set Average Azimuth Value Night here
// AVERAGE ELEVATION VALUE NIGHT
  int ev = (avl + avr) / 2;
  int aevn = 300;            // set Average Elevator Value Night here

//-------------------------------------------------------
// RECALCULATE VALUE CURRENT SENSOR
//-------------------------------------------------------
  adcValue = analogRead(A7);
  adcVoltage = (adcValue / 1024.0) * 5000;
  currentValue = ((adcVoltage - offsetVoltage) / sensitivity);

//-------------------------------------------------------
// PRINT DEBUG INFORMATION EVERY intervalPrint time
//-------------------------------------------------------
{
  unsigned long currentMillis = millis();
  if( currentMillis - previousMillisPrint >= intervalPrint)
  {
    previousMillisPrint = currentMillis;

// DEBUG INFORMATION
  Serial.println();
  Serial.print(F("*******NEW*******"));
  Serial.println();
  Serial.print(F("Top Left\t"));
  Serial.print(tl);
  Serial.println();
  Serial.print(F("Top Right\t"));   
  Serial.print(tr);
  Serial.println();
  Serial.print(F("Bottom Left\t"));
  Serial.print(bl);
  Serial.println();
  Serial.print(F("Bottom Right\t"));
  Serial.print(br);
  Serial.println();
  Serial.println();
  Serial.print(F("Tolerance\t"));
  Serial.print(tolerance);
  Serial.println();
  Serial.println();
  Serial.print(F("+UP<>DOWN-\t"));
  Serial.print(dv);
  Serial.println();
  Serial.print(F("AVT - up\t"));
  Serial.print(avt);
  Serial.println();
  Serial.print(F("AVB - down\t"));   
  Serial.print(avb);
  Serial.println();
  Serial.println();
  Serial.print(F("+WEST<>EAST-\t"));
  Serial.print(dh);
  Serial.println();
  Serial.print(F("AVL - west\t"));     
  Serial.print(avl);
  Serial.println();
  Serial.print(F("AVR - east\t"));     
  Serial.print(avr);
  Serial.println();
  Serial.println();
  Serial.print(F("Active run time\t"));
  Serial.println(interval/1000);
  Serial.print(F("LOOP TIME\t"));
  Serial.println((interval/1000) - (currentMillis-previousMillis)/1000);
  Serial.println(); 
  Serial.print(F("Amps\t\t"));
//  Serial.println(A7);   
  Serial.println(currentValue);
  Serial.println(); 
  Serial.print(F("ELEVATION DOWN\t"));
  Serial.println(avt < avb);
  Serial.print(F("ELEVATION UP\t"));
  Serial.println(avt > avb);
  Serial.print(F("ELEVATION STOP\t"));
  Serial.println(-1*tolerance < dv || dv < tolerance);
  Serial.print(F("ELEVATION NIGHT\t"));
  Serial.println(ev <= aevn);
  Serial.println(); 
  Serial.print(F("AZIMUTH WEST\t"));
  Serial.println(avr < avl);
  Serial.print(F("AZIMUTH EAST\t"));
  Serial.println(avr > avl);
  Serial.print(F("AZIMUTH STOP\t"));
  Serial.println(-1*tolerance < dh || dh < tolerance);
  Serial.print(F("AZIMUTH NIGHT\t"));
  Serial.println(av <= aavn);
  Serial.print(F("*******END*******"));
  Serial.println();
  }

//-------------------------------------------------------
// START PROGRAM RUN AZIMUTH AND ELEVATION MOTOR
//-------------------------------------------------------
  if (-1*tolerance > dv || dv > tolerance) // check difference in top/bottom LIGHT SENSORS is greater than tolerance
{
// CHANGE ELEVATION MOTOR DIRECTION
  if (avt < avb) // If average LIGHT SENSOR values on top side are smaller than on bottom side then elevation motor rotates CLOCKWISE
  {
// SET ELEVATION MOTOR DOWN
  digitalWrite(in3, HIGH && enableState);
  digitalWrite(in4, LOW);
  lcd.setCursor(0,0);
  lcd.print(F("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 ELEVATION MOTOR UP
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH && enableState);
  lcd.setCursor(0,0);
  lcd.print(F("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);
  lcd.setCursor(0,0);
  lcd.print(F("ELEVATION   :   STOP")); // Print lcd row 1
 
// MOVE ELEVATION MOTOR NIGHT POSITION
  if (ev <= aevn) // Sensor values night
  {
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  lcd.setCursor(0,0);
  lcd.print(F("ELEVATION   :  NIGHT")); // Print lcd row 1
  }
}

//-------------------------------------------------------
// CHECK DIFFERANGE BETWEEN SENSORS LEFT AND RIGHT FOR AZIMUTH
//-------------------------------------------------------
  if (-1*tolerance > dh || dh > tolerance) // Check difference in left and right LIGHT SENSORS is within tolerance range
 {

// CHANGE AZIMUTH MOTOR DIRECTION
  if (avr < avl) // If average LIGHT SENSOR values on left side are greater than right side, azimuth motor rotates CLOCKWISE
  {
// SET AZIMUTH MOTOR WEST = LEFT
  digitalWrite(in1, HIGH && enableState);
  digitalWrite(in2, LOW);
  lcd.setCursor(0,1);
  lcd.print(F("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 AZIMUTH MOTOR EAST = RICHT
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH && enableState);
  lcd.setCursor(0,1);
  lcd.print(F("AZIMUTH     :   EAST")); // Print lcd row 2
  }
 }
  else if (-1*tolerance < dh || dh < tolerance) // If difference is smaller than tolerance, STOP azimuth motor
  {

// STOP AZIMUTH MOTOR
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  lcd.setCursor(0,1);
  lcd.print(F("AZIMUTH     :   STOP")); // Print lcd row 2
  }

// MOVE AXIMUTH MOTOR NIGHT POSITION / RIGHT
  if (av <= aavn)  // Sensor values night
  {
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  lcd.setCursor(0,1);
  lcd.print(F("AZIMUTH     :  NIGHT")); // Print lcd row 2
  }
 {
//-------------------------------------------------------
// PRINT VALUES ON LCD - ROW 1 AND 2 FROM PROGRAM
//-------------------------------------------------------
// PRINT LOOP TIME LCD ROW 3
  lcd.setCursor(0,2);
  lcd.print(F("LOAD CURRENT:"));
  char temp1[5]; // Enough spaces for 4 numbers
  snprintf(temp1,6, "%5d", currentValue); // %5d = 5 digets, right aligned 
  lcd.print(temp1);
  lcd.setCursor(19,2);
  lcd.print("A");

// PRINT TOLERANCE LCD ROW 4
  lcd.setCursor(0,3);
  lcd.print(F("TOL:"));
  char temp2[5]; // Enough spaces for 4 numbers
  snprintf(temp2,6, "%3d", tolerance); // %3d = 3 digets, right aligned
  lcd.print(temp2);

// PRINT LOOP TIME LCD ROW 4 
  lcd.setCursor(8,3);
  lcd.print(F("LOOP:"));
  char temp3[5]; // Enough spaces for 5 numbers
  snprintf(temp3,6, "%5d", ((interval - (currentMillis-previousMillis))/1000)); // // %5d = 5 digets, right aligned
  lcd.print(temp3);
  lcd.setCursor(19,3);
  lcd.print(F("S"));

  delay(300);//
  }
}
//-------------------------------------------------------
// PRINT FULLY NUMBERS
//-------------------------------------------------------
void print2digits(int number)
{
  if (number >= 0 && number < 10)
  {
    Serial.write('0');
  }
  Serial.print(number);
}

VorigeVolgende

Terug naar Afgeronde projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast