Problemen met een "if"
5 berichten
• Pagina 1 van 1
Problemen met een "if"
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 ?
Alvast bedankt, Rob
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
Re: Problemen met een "if"
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
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
Re: Problemen met een "if"
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
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
Re: Problemen met een "if"
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
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
Re: Problemen met een "if"
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
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
}
5 berichten
• Pagina 1 van 1
Terug naar Gezamenlijke projecten
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 0 gasten