Problemen met een "if"

Als U een gezamenlijk project wil starten of aan projecten van anderen mee wilt werken.
Berichten: 70
Geregistreerd: 05 Apr 2018, 00:44

Problemen met een "if"

Berichtdoor Gompy » 06 Jun 2018, 22:31

Onderstaande sketch is van mijn zonnepaneel wat dmv motoren (dus geen servo's of steppers) mee draait op de zon.
Ik zit echter met een "probleempje" dat het paneel niet richting oost wilt draaien als de zon onder is gegaan of bv om 00:00 uur.
In de sketch zitten twee optie volgens mij, de simpele die tussen de //************ staat of het gebruik maken van de klok.
Helaas krijg ik het niet voor elkaar om de oplossing van één van beide te maken :?
BTW, de motoren stoppen dmv eindschakelaars, dus na donker mag de oost/west (azimuth) motor gerust aangestuurd blijven.

Wie kan me een setje in de juiste richting geven ?

Code: Alles selecteren
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);

// motor azimuth
int in1 = 9;
int in2 = 10;
// motor elevation
int in3 = 11;
int in4 = 12;

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

  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  if(timeStatus() != timeSet)
  Serial.println("Unable to sync with the RTC");
  else
  Serial.println("RTC has set the system time");
  while (!Serial) ; // wait for serial
  delay(200);

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

// Print message to the LCD.
  lcd.setCursor(0,0);
  lcd.print(" Gompy SolarTracker ");
  lcd.setCursor(0,1);
  lcd.print("  The Netherlands   ");
  lcd.setCursor(0,2);
  lcd.print("    Version 1.5     ");
  lcd.setCursor(0,3);
  lcd.print("  Date 28-05-2018   "); 
  delay(2000);
  lcd.clear();
}

void loop()
{
// LIGHT SENSORS
  int tr = analogRead(0); // LDR top right / brown
  int br = analogRead(1); // LDR bottom right / green
  int tl = analogRead(2); // LDR top left / yellow
  int bl = analogRead(3); // LDR bottom left / orange
// control delay time in milliseconds of LIGHT SENSOR readings
  int delaytime = analogRead(A7)*2;
// set range of tolerance between LIGHT SENSOR readings - Arduino LED indicate time
  int tolerance = analogRead(A6)/4;
// set range for read 0 - 100%
  int sensetive = map(analogRead(A6), 1022, 0, 0, 100);
// 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 LIGHT SENSOR values to serial monitor for debugging
  Serial.println("--------------------");
  Serial.print("Top Left\t");
  Serial.print(tl);
  Serial.println(); 
  Serial.print("Bottom Left\t");
  Serial.print(bl);
  Serial.println(); 
  Serial.print("Top Right\t");   
  Serial.print(tr);
  Serial.println(); 
  Serial.print("Bottom Left\t"); 
  Serial.print(bl);
  Serial.println();
    Serial.print("AVT TOP  \t"); 
  Serial.print(avt);
  Serial.println();
    Serial.print("AVD DOWN\t"); 
  Serial.print(avd);
  Serial.println();
  Serial.print("Delaytime\t");
  Serial.print(delaytime);
  Serial.println();
  Serial.print("Sensetive\t");
  Serial.print(sensetive);
  Serial.println();
  Serial.println("--------------------");

  if (-1*tolerance > dv || dv > tolerance) // check if the 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 greater than on bottom side then elevation motor rotates CLOCKWISE
  {
// set motor Elevation enable
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  Serial.println("ELEVATION MOTOR MOVES UPWARDS");
  lcd.setCursor(0,0);
  lcd.print("ELEVATION :    UP"); // 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 enable
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  Serial.println("ELEVATION MOTOR MOVES DOWN");
  lcd.setCursor(0,0);
  lcd.print("ELEVATION :  DOWN");// 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
  }
//************************************************
//  if (avt < 100) // check night - turn east
// {
//************************************************
  if (-1*tolerance > dh || dh > tolerance) // check if the 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 enable
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  Serial.println("AZIMUTH MOTOR MOVES 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 enable
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  Serial.println("AZIMUTH MOTOR MOVES 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
  }

 
// print lcd delaytime row 3
  lcd.setCursor(0,2);
  lcd.print("DELAY     :  ");
  char temp[5]; // enough room for 4 numbers
  snprintf(temp, 5, "%4d", delaytime); // %4d = 4 digits, right aligned
  lcd.print(temp);
  lcd.setCursor(18, 2);
  lcd.print("ms"); // time in milliseconds
// print lcd sensitive row 4
  lcd.setCursor(0,3);
  lcd.print("SENSITIVE :   ");
  char temp1[4]; // enough room for 3 numbers
  snprintf(temp1, 4, "%3d", sensetive); // %3d = 3 digits, right aligned
  lcd.print(temp1);
  lcd.setCursor(18, 3);
  lcd.print("%");

  delay(delaytime);

  tmElements_t tm;

  if (RTC.read(tm))
  {
    Serial.println("********************");
    print2digits(tm.Hour);
    Serial.write(':');
    print2digits(tm.Minute);
    Serial.write(':');
    print2digits(tm.Second);
    Serial.print(" - ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();
  }
  else
  {
    if (RTC.chipPresent())
    {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else
    {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
  }
}

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


Alvast bedankt, Rob

Advertisement

Berichten: 40
Geregistreerd: 22 Jan 2013, 16:40

Re: Problemen met een "if"

Berichtdoor zuid » 07 Jun 2018, 07:11

Rob,
In bovenstaande code heb je volgens mij het baar oost draaien in de nacht helemaal weggelaten ( klopt dat?)
Ik denk dat je probleem ontstaat als je probeert het naar oost draaien ergens binnen alle andere voorwaarden te plaatsen.
Probeer het eens op te lossen voordat je programma gaat controleren of het paneel in de juiste positie staat.
Dus eerst controleren is het nacht, zo ja draai naar het oosten, dus als avt en avd en avl en avr < 100 ga naar het oosten.

Als aan deze voorwaarde niet voldaan is kan het programma het paneel naar de juiste positie draaien.
Je probleem is waarschijnlijk de combinatie van wel of niet voldoen aan de tolerantie grenzen en de vraag is het nacht.

m.v.g. Nico

Berichten: 70
Geregistreerd: 05 Apr 2018, 00:44

Re: Problemen met een "if"

Berichtdoor Gompy » 07 Jun 2018, 12:28

Hi Nico,

Ik heb het even // gezet voor dat stukje code zodat het paneel wel gewoon blijft werken.
Mijn gedachten was dat is ik de voorwaarden af vraag dat het wel zou werken.

1 - Controleer tolerantie van LDR's
2 - Controleer welke kant het paneel op moet draaien
3 - Controleer of het nacht is

Maar waar ik 3 ook zet, het heeft niet het gewenste effect.

Mvg, Rob

Berichten: 40
Geregistreerd: 22 Jan 2013, 16:40

Re: Problemen met een "if"

Berichtdoor zuid » 07 Jun 2018, 13:14

Rob,
Heb je het ook zoals hieronder geprobeerd?

if (NACHT) { ga naar Oost}
else { doe de andere bewegingen}

Dus geen combinatie van de andere bewegingen met de nacht situatie.
m.v.g. Nico

Berichten: 70
Geregistreerd: 05 Apr 2018, 00:44

Re: Problemen met een "if"

Berichtdoor Gompy » 07 Jun 2018, 13:27

Ik heb zelfs onder alle condities, dus oost/west en op/neer, een geheel nieuwe (nacht) actie aangemaakt.
Maar door mijn (nog) beperkte kennis doe ik het toch hier of daar niet goed.
Een nieuwe versie met de "extra" actie compiled wel, maar de daaruit gevolgde actie heeft niet het gewenste resultaat.

Volgens mijn beperkte kennis heb ik alle if - else en else if al verbruikt en twijfel of ik deze kan uitbreiden ?
Naar mijn inziens zou eigenlijk achter de else de extra regel moeten staan (???) want daar wordt het paneel richting oost gestuurd.

Het gaat om dit stukje sketch wat niet wilt werken.
Als ik dat tussen "ergens" tussen de ***************** zet gaat het dus fout.

if ((avt < 100) && (avd < 100)) // night move east


Code: Alles selecteren
****************************************
  if (-1*tolerance > dh || dh > tolerance) // check if the 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 enable
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  Serial.println("AZIMUTH MOTOR MOVES 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 enable
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  Serial.println("AZIMUTH MOTOR MOVES 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
  }

Terug naar Gezamenlijke projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast