LCD uitlezen bij Arduino nano

Hallo,

Ik ben geheel nieuw op het gebied van Arduino en heb er al wat mee gestoeid.
Nu ben ik tegen een leuk projectje aan gelopen waar ik wel mee verder wil, maar mis de kennis.
Wel veel gelezen en geprobeerd, maar krijg telkens fouten en weet ze (nog) niet op te lossen.

Het gaat om het volgende projectje, https://www.instructables.com/id/Arduino-Solar-Tracker/
Ik heb het geheel aan de praat gekregen, maar zou graag de hoek van servo's willen zien.
Dit als ik het onder de knie heb en kan zien wat ik doe dit uit te breiden met bv optimaliseren op grond van de opgeleverde energie onder welke hoek enz.
Nu hangt er geen groot paneel aan, maar een klein 5 Volt paneeltje gewoon voor de fun.

Wie kan mij helpen om op de LCD-display de hoek van de servo's te laten zien ?

Alvast bedankt, Gompy

Hoi Gompy, en welkom.

Ik verafschuw die destructables site, want 99% van de gevallen vertelt je hoe je iets kunt bouwen, maar niet hoe en waarom het werkt.
Dat is hier niet anders.
Er is wel een stukje dat gaat over hoe het werkt, maar daar word dus helemaal niet verteld hoe het werkt (hooguit een kwart daarvan en dan ben ik al heel optimistisch).

Maar goed dat is niet waar je om vroeg.
Wat je wil doen is heel eenvoudig.
Je wil namelijk op een of ander scherm de inhoud van de variabele servov en servoh afdrukken.

Ik snap ook wel wat je probleem hier bij zou kunnen zijn, maar daar heb je nog niet zoveel over verteld.
Maar ik denk dus dat je niet weet hoe je dat schermpje aanstuurt.
Daar kan pas antwoord op gegeven worden als we weten over welk scherm we aan het praten zijn.
En dan is "een klein 5 Volt paneeltje" wel een ietsje pietsje summier.
Heb je het ding al in huis ?
Wijs dan naar een link van dat product.
Heb je 'm nog niet en wellicht verschillende kandidaten ?
Wijs dan naar die mogelijke kandidaten.
Wil je van iemand een voorstel krijgen over welk display je het best zou kunnen gebruiken ?
Vertel dan wat jouw exacte wensen zijn voor dat scherm (dus ook: denk daar eerst even over na).

Zo kan er een passend antwoord gegeven worden.

Overigens staat er op die site waar je (net niet) naar linkt, dat er een nieuwe en verbeterde versie is.

Hallo en alvast bedankt voor het antwoorden.

Ik ben een gepensioeneerde elektroman en wil graag wat omhanden hebben.
Van programma's snap ik wel het eea (kan ze enigzinds lezen), maar ben geen programmeur.
Toch zou ik het wel willen leren en dat was dat ik op een solartracker kwam omdat ik vanuit de modelbouw (mijn oude hobby maar door TIA niet meer te doen) nog wel wat servo's had liggen.
De meeste programma's kan ik redelijk volgen en al soms wat aanpassingen maken zonder al teveel fouten die ik niet kan oplossen.

Ik heb een 5 Volt USB solarpanel een zgn reislader voor smartphones en gebruik ik niet voor de voeding van de Arduino......die wordet gewoon gevoed met de USB van de computer.
Ik heb een LCD diplay van 2x 16 karakters met 16 pennen (MS1602C).
Ik heb er al wat mee gespeeld en kan "hallo wereld" enz op de display zetten waar ik wil, maar ik krijg het niet voor elkaar om dat stukje code in de solartracker te zetten.

Waar zet ik de code van de display en hoe.
Ik snap dat ik servov en servoh moet uitlezen, maar hoe koppel ik dat stukje code aan de code uit de link ? (Tenzij je iets beters hebt natuurlijk, ik sta overal voor open....ik moet nog leren)

De tracker werkt overigens wel, hoewel ik al een bug zie want als de zon onder gaat blijft de tracker staan en draait niet naar daar waar de zon weer op komt de volgende morgen.

Ik hoop dat ik hiermee voldoende informatie heb gegeven en wil graag nog wat leren.

Alvast bedankt, Rob

Eerst even je laatste puntje.
Dat is een bekend probleem, want de tracker kijkt nou eenmaal de andere kant op, en hoe moet dat ding nou weten waar morgen de zon zal schijnen ?

Je kunt dat natuurlijk oplossen door 'm te laten scannen, maar dan staat dat ding de hele nacht een beetje achtjes te draaien.
Maar ook dat is oplosbaar, al is dat iets wat je later maar eens moet oppakken.

Nou je hebt al een stuk meer informatie gegeven.
Namelijk wat voor soort display je hebt, en dat je dat ook al dingen kan laten tonen.

De sketches kun je combineren, maar je moet wel even opletten dat je dat goed doet.
Eenvoudigweg aan elkaar plakken is niet zo'n goed idee want dat gaat niet werken.

Als eerste moet je even kijken of je display niet dezelfde pinnen gebruikt als je servo's.
Anders moet je dat eerst even aanpassen en dat dan weer laten werken met de huidige code (die dus ook aan de aanpassing aangepast moet worden).
Daarna kun je van de dan werkende code, gedeeltes kopieren.
Gedeeltes, want wat bij de andere sketch in setup staat, moet uiteraard bij de ene sketch ook weer naar setup gekopieerd worden.
En wat er dan op het display moet verschijnen, dat plak je dan achter aan de loop.
Eerst maar weer eens testen.
En dan aanpassen wat er precies op het LCDtje verschijnt
Je weet inmiddels dat je ("deze tekst") moet doorgeven om iets op het scherm te krijgen, maar je kunt ook (variabele) doorgeven (zoek de verschillen).
En dat kun je dan ook nog eens combineren.

Ik zou zeggen doe het stapje voor stapje, dan kun je je werk zien groeien (en da's erg leuk).
En sla je werk met een steeds iets andere naam (zoals versienummer) op.
Dan kun je ook terug als die laatste stap toch niet helemaal doet wat je dacht dat het zou doen.

Als je hulp nodig hebt, plaats dan je code hier in het onderwerp, dan kunnen we gemakkelijker volgen waar je het over hebt.
En uiteraard doe je dat dan tussen [code] [/code] tags.

Over dat hij blijft staan waar de zon onder gaat is naar mijn idee makkelijk op te lossen door bv de tracker in neutrale stand te zetten.....op startmode, 45 graden verticaal en 90 graden horizontaal
Als de zon op komt zullen altijd twee LDR's meer licht opvangen dan de andere twee en dus de richting van de zon draaien.

De pinnen voor de LCD zijn bekent en worden niet gebruikt voor de rest van de besturing.
Voor de display gebruik ik D2 t/m D4 en D11, 12.
Deze zijn vrij als ik gebruik maak van het schema uit de link.

Het is leuk om net de Arduino te spelen, maar je moet wel eerst het spel kennen en dat ontbreekt bij mij voor het over grote deel (nog).
Helaas worden er weinig projecten van begin af getoond en waarom men dat doet en in mijn omgeving ken ik niemand die me een eindje op weg kan helpen......zeg maar aan de hand kan nemen en me een beetje stuurt.

Mvg, Rob

Hallo, ik heb de code voor de LCD proberen te schrijven maar struikel over de volgende melding.

exit status 1
'lcd' does not name a type

Hieronder staat de code die ik probeer te gebruiken, maar na uren "prutsen" slaag ik er toch niet in om door de sketch heen te komen.
Waar de <<<<<<<<<< staan in de code gaat het mis

BTW, ik gebruik de LiquidCrystal.h uit de library welke ik ook heb gebruikt voor "Hello world" enz

Mvg, Rob

#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 (blueSensor) int ldrrt = 1; //LDR top rigt (greenSensor) int ldrld = 2; //LDR down left (brownSensor) int ldrrd = 3; //LDR down rigt (orangeSensor) 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.print(servoh);     delay(100);       lcd.setCursor(0,1);     lcd.print(" Vertical: ");     lcd.print(servov);    <<<<<<<<<<<<<<<<<<<<<<<     delay(100);         Serial.print(" horizontal\t");     Serial.print(servoh);     Serial.print(" \t green  ");     Serial.print(ldrrt);     Serial.print(" \t blue  ");     Serial.print(ldrlt);     Serial.print(" difference ");     Serial.print(ldrrt - ldrlt);         Serial.print(" vertical\t");     Serial.print(servov);     Serial.print(" \t brown ");     Serial.print(ldrld);     Serial.print(" \t orange  ");     Serial.print(ldrrd);     Serial.print(" difference ");     Serial.println(ldrld - ldrrd);         delay(1000); } 

zet er een comment voor dus // dan wordt de regel niet gecompileerd, kijk dan waar de fout optreedt.
gebruik als base DEC, wellicht staat er ergens een typefout en dat hoeft niet zichtbaar te zijn.
dus iets als lcd.print(servov,DEC);
een andere oorzaak kan zijn dat de library niet op de goede plaats staat.

Als ik dit verwijder

Serial.print(" horizontal\t");     Serial.print(servoh);     Serial.print(" \t green  ");     Serial.print(ldrrt);     Serial.print(" \t blue  ");     Serial.print(ldrlt);     Serial.print(" difference ");     Serial.print(ldrrt - ldrlt);         Serial.print(" vertical\t");     Serial.print(servov);     Serial.print(" \t brown ");     Serial.print(ldrld);     Serial.print(" \t orange  ");     Serial.print(ldrrd);     Serial.print(" difference ");     Serial.println(ldrld - ldrrd);         delay(1000); } 

En zet voor onderstaande //

lcd.clear();     lcd.setCursor(0,0);     lcd.print(" Horizontal: ");     lcd.print(servoh);     delay(100);       lcd.setCursor(0,1);     lcd.print(" Vertical: ");     lcd.print(servov);    <<<<<<<<<<<<<<<<<<<<<<<     delay(100); 

Dan loopt hij helemaal door en upload de sketch naar de Arduino.
Ik heb dan echter geen uitlezing van de display meer.....die ik toch al niet had.

De library ziet hij dus wel.

Met lcd.print(servov,DEC); krijg ik dit.

solar3:98: error: 'lcd' does not name a type

lcd.print(servov,DEC);

exit status 1
'lcd' does not name a type

Mvg, Rob

Hoi Rob.

De IDE geeft je een aantal hints als er een foutmelding komt.
Dit is de foutmelding die ik te zien krijg:

sketch_apr04a.ino:104:6: error: 'lcd' does not name a type 

Daar staat dus eerst de sketchnaam (in dit geval een tijdelijke naam omdat ik 'm niet opgeslagen heb), en dan :104:6:, en daarna pas wat er mis is volgens de IDE.
Die 104 staat voor regelnummer, en de 6 staat voor de positie op die regel.
Dat zou kunnen helpen (maar in dit geval niet).
Ik heb die regel uitgecommenteerd door er // voor te zetten.
Maar dan komt dezelfde melding, voor 1 regel hoger.
Dus heb ik maar even het gedeelte waar de fouten staan groter gemaakt (door 'm aan de oranje balk omhoog te schuiven, je ziet de muis cursor veranderen als je dat kunt doen).
Dan kom ik uit bij de 1e foutmelding (want er zijn er veel meer) op regel 95.
En zie ik op regel 93 een sluitende }
Die kun je aanklikken, en dan zie je waar de openende { die daar bij hoort staat want die word gemerkt met een blauw kadertje er omheen.
En zodra je dat gevonden hebt, weet je ook wat er hier mis is.
Die openende { staat namelijk direct na de tekst "void.loop()"
En daarmee valt de aansturing van je LCD dus ineens buiten de sketch en krijg je geklaag van de IDE.
Dit is 1 van de vele valkuilen waar je in kunt trappen als je codes gaat combineren.

Als je regel 93 verwijdert, is het geklaag van de IDE voorbij en compileert de code.
Of die dan ook gaat werken weet ik niet want daar heb ik niet naar gekeken.
Veel succes.

Bedankt, ik ben al weer een stukje verder.

In diverse youtube filmpjes zie ik dat er regelnummers voor staan, hoe krijg ik dat voor elkaar ?
Nu moet ik 100 regels gaan aftellen want ik heb die regelnummering nog niet gevonden.

Mvg, Rob

OK, nieuwe uitgeklede code welke ik wel kan uploaden, maar geen uitlezing heb.

#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); } 

Mvg, Rob

Heb je mijn vorige bericht ook nog gelezen ?
Want uit die laatste code is gewoon alles wat met LCD te maken heeft, verdwenen.

Welke IDE versie gerbuik je ?

Ga naar het menu, preferences (wellicht voorkeuren of instellingen in het Nederlands), daar kun je een vinkje zetten om de regelnummers aan te zetten.

Je kunt het overigens ook omdraaien he.
Dan klik je op de { die bij void.loop() staat, om verderop te gaan zoeken naar de (foute) } die daar bij hoort.
Die regel verwijder je dan.
Bij mij kwam dat, met de code die jij liet zien, op regel 93 uit.

Dat klopt dat ik alles even met lcd heb verwijdert om te zien of het dan wel doorloopt.
Indien nodig haal ik de // weer voor de laatste regels vandaan zodat lcd weer mee doet.

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

Er staat Arduino 1.8.5 boven in de balk.

Sorry, maar dit zijn mijn eerste stappen op het gebied van "echt" wat maken.
Heb wel de zgn cursussen van youtube enz gedaan, maar dit gaat even iets verder.
Wat ik wel tegen kom op Google is dat men wel meer last van deze error (?) heeft.

Mvg, Rob

Hoi.

Ik heb je een pasklare oplossing aangedragen.

volgens mij is het enige dat je moet doen, de } verwijderen.
Dat is deze (er staat er hier maar 1):

  delay(dtime); } lcd.clear(); 

Duidelijker kan ik het je echt niet maken.

Ik heb de code aangepast en het werkt (....), althans ik krijg geen fouten meer en de display toont wat ik wil.
Nadeel is dat ik wat LDR's per ongeluk heb beschadigd bij het opnieuw maken van de lichtsensor.
Ik moet dus even tot morgen wachten op de nieuwe LDR's om te zien of de code ook doet wat ik wil.

Het enige is nog het naar neutraal gaan als de LDR's geen licht oppakken ('s nachts) zodat de volgende ochtend het paneeltje weer klaar staat om op de zon te richten.
Maar dat is nog even toekomst muziek, voorlopig ben ik erg blij met de oplossing....bedankt !

#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 (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   lcd.clear();   lcd.begin (16,2); // name.attacht(pin)   horizontal.attach(9);   vertical.attach(10);   lcd.setCursor(0, 0);   lcd.print("Gompy Solar V1.2") ;   lcd.setCursor(0, 1);   lcd.print("The Netherlands ");   delay(2000);   lcd.clear();   delay(1000);   lcd.setCursor(0,0);    } 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 < 0)   {     servov = 0;   }   }   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 (14, 0);   lcd.print(servoh);   lcd.setCursor(0, 1);   lcd.print("Vertical  :");   lcd.setCursor(14, 1);   lcd.print(servov); } 

Mvg, Rob