Waarden in LCD laten zien van positie servo's

IDE gerelateerde berichten
Berichten: 65
Geregistreerd: 05 Apr 2018, 00:44

Waarden in LCD laten zien van positie servo's

Berichtdoor Gompy » 05 Apr 2018, 12:21

Hallo,

Ik zal me eerst voorstellen, ik ben Rob gepensioeneerd, heb altijd in de elektronica gewerkt en was ook mijn hobby maar door een TIA zijn de onderdeeltjes te klein voor me geworden.
Mijn rechterhand trilt en heb er weinig controle over ik kan helaas de onderdeeltjes niet meer vast houden, vandaar dat ik nu kant en klaar koop.
Dus een Arduino om toch wat om handen te hebben en om toch nog een beetje met mijn hobby (elektronica) bezig te zijn.
Ik ben een volkomen leek wat betreft programmeren en hoop nog wat te leren en leuk bezig te zijn.

Via internet heb ik al enige dingen gedaan met Arduino en aan kunnen passen, maar nu loop ik toch stuk op wat ik wil.

Ik heb een leuk programma gevonden op internet (solartracker) met enige uitleg en video zodat ik ook het programma kan volgen.

Wat ik mis is eigenlijk de uitlezing van de servo posities en heb geprobeerd om twee programma's samen te voegen.....totaal mislukt dus.
Daarbij zou ik graag geholpen willen worden, want ik zou niet weten waarom het niet werkt :oops:
Onderaan staat de foutcode welke ik krijg, maar heb (nog) te weinig kennis om er iets mee te doen.

De code van het programma:

Code: Alles selecteren
#include <Servo.h> // include Servo library
#include <LiquidCrystal.h> // Include LCD library
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Servo horizontal; // horizontal servo
int servoh = 90;  // stand horizontal servo

Servo vertical;   // vertical servo
int servov = 90;  // stand vertical servo

// LDR pin connections
//  name  = analogpin;
int ldrlt = 0; //LDR top left (blue)
int ldrrt = 1; //LDR top rigt (green)
int ldrld = 2; //LDR down left (brown)
int ldrrd = 3; //LDR down rigt (orange)

void setup()
{
  Serial.begin(9600);
// servo connections
// name.attacht(pin);
  lcd.begin (16,2);
  horizontal.attach(9);
  vertical.attach(10);
}

void loop()

{
  int lt = analogRead(ldrlt); // top left
  int rt = analogRead(ldrrt); // top right
  int ld = analogRead(ldrld); // down left
  int rd = analogRead(ldrrd); // down right
 
  int dtime = analogRead(4)/20; // read potentiometers 
  int tol = analogRead(5)/4;
 
  int avt = (lt + rt) / 2; // average value top
  int avd = (ld + rd) / 2; // average value down
  int avl = (lt + ld) / 2; // average value left
  int avr = (rt + rd) / 2; // average value right

  int dvert = avt - avd; // check the diffirence of up and down
  int dhoriz = avl - avr;// check the diffirence og left and right
   
  if (-1*tol > dvert || dvert > tol) // check if the diffirence is in the tolerance else change vertical angle
  {
  if (avt > avd)
  {
    servov = ++servov;
     if (servov > 135)
     {
      servov = 135;
     }
  }
  else if (avt < avd)
  {
    servov= --servov;
    if (servov < 45)
  {
    servov = 45;
  }
  }
  vertical.write(servov);
  }
 
  if (-1*tol > dhoriz || dhoriz > tol) // check if the diffirence is in the tolerance else change horizontal angle
  {
  if (avl > avr)
  {
    servoh = --servoh;
    if (servoh < 0)
    {
    servoh = 0;
    }
  }
  else if (avl < avr)
  {
    servoh = ++servoh;
     if (servoh > 180)
     {
     servoh = 180;
     }
  }
  else if (avl = avr)
  {
    // nothing
  }
  horizontal.write(servoh);
  }
   delay(dtime);
}

// lcd.clear();
//  lcd.setCursor (0, 0);
//  lcd.print("Horizontal:");
//  lcd.setCursor(12, 0);
//  lcd.print(servoh);
//  lcd.setCursor(0, 1);
//  lcd.print("Vertical:");
//  lcd.setCursor(12, 1);
//  lcd.print(servov);


Het gaat mis daar waar de // staan.
Ik krijg de volgende foutmelding:

Arduino: 1.8.5 (Windows 7), Board:"Arduino Nano, ATmega328P"
solar3:95: error: 'lcd' does not name a type
lcd.clear();
^
solar3:96: error: 'lcd' does not name a type
lcd.setCursor (0, 0);
^
solar3:97: error: 'lcd' does not name a type
lcd.print("Horizontal:");
^
solar3:98: error: 'lcd' does not name a type
lcd.setCursor(12, 0);
^
solar3:99: error: 'lcd' does not name a type
lcd.print(servoh);
^
solar3:100: error: 'lcd' does not name a type
lcd.setCursor(0, 1);
^
solar3:101: error: 'lcd' does not name a type
lcd.print("Vertical:");
^
solar3:102: error: 'lcd' does not name a type
lcd.setCursor(12, 1);
^
solar3:103: error: 'lcd' does not name a type
lcd.print(servov);
^
exit status 1
'lcd' does not name a type

Maw, het programma ziet de LCD niet of kan er niets mee.
Ik gebruik de LCD die bij het pakketje zat de MC1602 2 regel en 16 karakters.
https://www.arduino.cc/en/Tutorial/HelloWorld

Vreemd genoeg doet de LCD het wel met "hello world" van de cursus enz, maar niet in het programma.

Wie wil/kan mij helpen met wat ik fout doe en vooral waarom.

Mvg, Rob
Bijlagen
schema.jpg
schema.jpg (27.25 KiB) 686 keer bekeken

Advertisement

Gebruikers-avatar
Berichten: 168
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor baco1978 » 05 Apr 2018, 16:02

je hebt nu het gene wat je op je lcd wilt laten zien, buiten de loop geplaatst
Code: Alles selecteren
}  <--- deze laatste geeft het einde aan.

// lcd.clear();
//  lcd.setCursor (0, 0);
//  lcd.print("Horizontal:");
//  lcd.setCursor(12, 0);
//  lcd.print(servoh);
//  lcd.setCursor(0, 1);
//  lcd.print("Vertical:");
//  lcd.setCursor(12, 1);
//  lcd.print(servov);



Code: Alles selecteren


// lcd.clear();
//  lcd.setCursor (0, 0);
//  lcd.print("Horizontal:");
//  lcd.setCursor(12, 0);
//  lcd.print(servoh);
//  lcd.setCursor(0, 1);
//  lcd.print("Vertical:");
//  lcd.setCursor(12, 1);
//  lcd.print(servov);
}<--- als je die verplaatst naar t einde, zou het wel moeten werken
Met vriendelijke groet Arjan

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

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor Gompy » 05 Apr 2018, 18:30

Ik heb de code aangepast zoals onder, nooit te oud om te leren, en het werkt :D
Althans, ik kan de code probleemloos uploaden, maar ik heb de LDR's per ongeluk stuk gemaakt en krijg morgen pas nieuwe.


Code: Alles selecteren
    // nothing
  }
  horizontal.write(servoh);
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Horizontal:");
  lcd.setCursor (12, 0);
  lcd.print(servoh);

  lcd.setCursor(0, 1);
  lcd.print("Vertical:");
  lcd.setCursor(12, 1);
  lcd.print(servov);

  delay(dtime);
}


Bedankt, Rob

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

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor shooter » 05 Apr 2018, 20:05

hoe heb je een LDR kapot gekregen?
paul deelen
shooter@home.nl

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

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor Gompy » 06 Apr 2018, 23:02

De LDR's zaten in een blokje en ik kwam er achter dat je de LDR's niet plat in één vlak moet leggen, maar in een hellend vlak (bv 30-45 graden) omdat de LDR's anders geen vat kunnen krijgen op het zonlicht.
Stel het paneel draait van oost naar west onder een hoek van 180 graden en verticaal in een hoek van 90 graden.
Zon komt op en in de loop van de dag draait de zon naar het westen, op dit moment stopt het paneel dan met functioneren en blijft op het westen staan.
De volgende dag komt de zon weer op in het oosten (tenminste dat gaan we hopen), maar de LDR's zien dan geen zonlicht.
Als ik de LDR's onder een hoek van 30 a 45 graden monteer valt er de volgende dag tenminste een beetje licht op één van de LDR's zodat het paneel licht kan gaan zoeken.
Dit lukt voor alsnog, maar ik het de horizontale hoek wel kleiner moeten maken naar 35 - 145 graden.
Ook de minimale verticale hoek hoeft geen 0 graden te zijn want dat bereik je nooit en heeft ook geen zin wat betreft de opbrengst van het zonnepaneel.

De volgende stap in mijn leerproces is om het paneel 's nachts in neutrale positie te zetten.
Zeg maar de code een reset geven zodat het paneel de volgende dag weer op 90 graden horizontaal en 45 graden verticaal staat.
Die 45 graden is gekozen ook ivm met regen, het paneel kan dan op regenachtige dagen mooi schoon gespoeld worden.
Als er bv geen verandering op de analoge ingangen komt gedurende bv 4 uur dan resetten.
Maar hierover moet ik me eerst inlezen want dit is het eerste "echte" project en waarschijnlijk zijn mijn gedachten wel helemaal verkeert.....

Mvg, Rob

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

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor Gompy » 07 Apr 2018, 18:34

Na veel lezen, proberen en hulkp van het forum heb ik een werkende (....) schakeling met de onderstaande code.
Maar ik zit nog met één probleem, kan ik bv 's nachts als servov en servoh op beplade waarde staan (35 en 135) terug springen naar:
//***return at night <<<<<(zie code) zodat de volgende ochtend de tracker weer paraat staat in de juiste richting ?

Dan nog een andere vraag, hoe zet ik de waarde van servov recht onder servoh ?
Heb nu;
125
45
en zou graag
125
45
willen hebben

Code: Alles selecteren
#include <Servo.h> // include Servo library
#include <LiquidCrystal.h> // Include LCD library
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Servo horizontal; // horizontal servo
int servoh = 90;  // position horizontal servo
Servo vertical;   // vertical servo
int servov = 90;  // position vertical servo

// LDR pin connections
//  name  = analogpin
int ldrlt = 0; //LDR top left (orange)
int ldrrt = 1; //LDR top rigt (brown)
int ldrld = 2; //LDR down left (yellow)
int ldrrd = 3; //LDR down rigt (green)

void setup()
{
  Serial.begin(9600);
// servo connections
  lcd.clear();
  lcd.begin (16,2);
// name.attacht(pin)
  horizontal.attach(9);
  vertical.attach(10);

  lcd.setCursor(0, 0);
  lcd.print("Gompy Solar V1.3") ;
  lcd.setCursor(0, 1);
  lcd.print("The Netherlands ");
  delay(2000);
  lcd.clear();
  delay(1000);
  lcd.setCursor(0,0); 

//***return at night <<<<<
 
  vertical.write(servov = 35);
  horizontal.write(servoh = 35);
}

void loop()

{
  int lt = analogRead(ldrlt); // top left
  int rt = analogRead(ldrrt); // top right
  int ld = analogRead(ldrld); // down left
  int rd = analogRead(ldrrd); // down right
 
  int dtime = analogRead(4)/20; // read potentiometers 
  int tol = analogRead(5)/4;
 
  int avt = (lt + rt) / 2; // average value top
  int avd = (ld + rd) / 2; // average value down
  int avl = (lt + ld) / 2; // average value left
  int avr = (rt + rd) / 2; // average value right

  int dvert = avt - avd; // check the diffirence of up and down
  int dhoriz = avl - avr;// check the diffirence og left and right
   
  if (-1*tol > dvert || dvert > tol) // check if the diffirence is in the tolerance else change vertical angle
  {
  if (avt > avd)
  {
    servov = ++servov;
     if (servov > 90)
     {
      servov = 90;
     }
  }
  else if (avt < avd)
  {
    servov= --servov;
    if (servov < 35)
  {
    servov = 35;
  }
  }
  vertical.write(servov);
  }
 
  if (-1*tol > dhoriz || dhoriz > tol) // check if the diffirence is in the tolerance else change horizontal angle
  {
  if (avl > avr)
  {
    servoh = --servoh;
    if (servoh < 35)
    {
    servoh = 35;
    }
  }
  else if (avl < avr)
  {
    servoh = ++servoh;
     if (servoh > 145)
     {
     servoh = 145;
     }
  }
  else if (avl = avr)
  {
    // nothing
  }
  horizontal.write(servoh);
  }
 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Horizontal:");
  lcd.setCursor (12, 0);
  lcd.print(servoh);
  lcd.setCursor(15, 0);
  lcd.print((char)223);

  lcd.setCursor(0, 1);
  lcd.print("Vertical  :");
  lcd.setCursor(12, 1);
  lcd.print(servov);
  lcd.setCursor(15, 1);
  lcd.print((char)223);

     Serial.print(" Horizontal\t");
     Serial.print(servoh);
     Serial.print(" \t brown  ");
     Serial.print(ldrlt);
     Serial.print(" \t orange  ");
     Serial.print(ldrrt);
     Serial.print(" difference ");
     Serial.print(ldrlt - ldrrt);
     
     Serial.print(" Vertical\t");
     Serial.print(servov);
     Serial.print(" \t yellow ");
     Serial.print(ldrld);
     Serial.print(" \t green  ");
     Serial.print(ldrrd);
     Serial.print(" difference ");
     Serial.println(ldrld - ldrrd); 

  delay(dtime);
}


Alvast bedankt, Rob

Gebruikers-avatar
Berichten: 168
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor baco1978 » 09 Apr 2018, 09:29

Code: Alles selecteren
 
lcd.setCursor(12, 1);
if (servov<100) lcd.print(""); // door je variabele te  testen, als waarde kleiner is dan 100, print dan een spatie.
  lcd.print(servov);
  lcd.setCursor(15, 1);
Met vriendelijke groet Arjan

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

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor Gompy » 09 Apr 2018, 11:50

Bedankt voor het antwoord.
Ik heb het volgende geprobeerd, maar dat heeft helaas geen effect.
Boven de 100 springt de waarde nog steeds naar achter
Het gaat alleen om de horizontale positie, verticaal komt hij nooit verder dan 90 graden.

Code: Alles selecteren
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Horizontal:");
  lcd.setCursor (12, 0);
  if (servoh<100) lcd.print(""); // door je variabele te  testen, als waarde kleiner is dan 100, print dan een spatie.
  lcd.print(servoh);
  lcd.setCursor(15, 0);
  lcd.print((char)223);


Mvg, Rob

Gebruikers-avatar
Berichten: 168
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor baco1978 » 09 Apr 2018, 12:08

excuses
lcd.print("")

moet lcd.print(" ") zijn.

ik was nu zelf vergeten een spatie te plaatsen
Met vriendelijke groet Arjan

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

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor Gompy » 09 Apr 2018, 12:21

Aha.....gelukt, weer wat geleerd !
Wat een spatie al niet kan doen.
Als beginner loop je telkens tegen dit soort kleine dingen aan waar ik nog geen antwoord op heb.

Op naar het volgende "probleem", zorgen dat de servo's niet in de setup naar 90 graden "vliegen" maar gecontroleerd met bv telkens 1 graad.
Waarschijnlijk moet ik daarvoor de servo.h aanpassen (?)

Bedankt, Rob

Volgende

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast