Hulp gevraagd bij de besturing voor een polijsttrommel

Hoi Allemaal.
Ik ben Rolf uit Gelderland.
Ik ben bezig om een polijsttrommel te maken,
De hardware heb ik voor 95% klaar.
De trommel is 160mm in diameter en 400mm lang.
Deze ligt op 4 looprollen 2 ervan worden aangedreven door een riem overbrenging.
als aandrijfmotor gebruik ik een Nema 17 stappenmotor.
Ik heb een 20x4 lcd scherm ingebouwd om het een en ander weer te geven.
een arduino uno als besturing en twee potmeters om het een en ander in te stellen.
Ik heb wat basis kennis van arduino en heb al wat meerdere projecten gebouwd met hulp hier op het forum.
al is dit weer een paar jaar geleden.
ik heb al een basis programma geschreven zodat het lcd scherm werkt.
met een welkoms tekst.
Nu wil ik beginnen met de weergave van het lcd scherm.
Ik wil met 1 potmeter de snelheid kunnen regelen van de stappenmotor.
Van stilstand tot max toerental wat de nema nog prettig vindt.
De trommel hoeft namelijk niet heel hard rond te draaien.
De aansturing van de stappenmotor krijg ik wel voor elkaar.
ben nog wel opzoek naar een kleine driver die geschikt is voor de nema17 dus als hier iemand een tip voor heeft welke ik het best kan nemen hoor ik dat graag.
Ik lees de potmeter uit op A0 en de waarde zet ik in de serial monitor.
de waarde is min 0 en max 1023.
Ik weet met mijn basis kennis wel om deze waarde op het lcd scherm neer te zetten.
Maar wat ik eindelijk graag zou willen zien is om een lijn van het lcd doormidel van een balkje de snelheid te tonen.
dus 0 procent geen balkje en 100 procent een voledig balkje van zeg maar 10 karakters.
zou iemand mij hier mee op weg willen helpen.
ik hoef geen kant en klare oplosing.
Maar ik zoek eindelijk iemand die me wegwijs kan maken en me in de goede richting kan sturen zodat ik er ook van kan leren.
Dit is namelijk voor mij al 90 procent van deze mooie hobby.

Ik voeg even de code toe hoe ver ik nu ben.

// Dit gedeelte is voor het lcd gedeelte

#include <Wire.h>                         // Library voor I2C communicatie
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h> // include i/o class header
hd44780_I2Cexp lcd;                        // declare lcd object: auto locate & config display for hd44780 chip

int read_potentiometer = A0;               // input pin voor de potmeter op Analoog pen 0,

float delay_time;
int value_potentiometer = 0;

void setup() {

// Hier komt de setup code deze word maar 1 keer gebruikt.

Serial.begin(9600);                          // opent de seriele poort en zet data verkeer op 9600 bps.
lcd.begin(20, 4);                            // geeft aan dat het om een 20x4 lcd gaat.
  lcd.init();                                // start het lcd op 
  lcd.backlight();                           // zet de achtergrond verlichting aan.
  lcd.clear();                               // maakt het lcd scherm leeg.
  
  lcd.setCursor(0,0);                        // zet de cursor neer op rij 1 op positie 1.
  lcd.print("       WELKOM");                // zet tekst neer "WELKOM"
  delay (1000);                              // wacht 1 sec. Ik weet dat we hier een hekel aan hebben vandaar
                                             // Dat ik dit alleen gebruik in de setup
                                                         
  lcd.setCursor(0,1);                        // Zet de cursor neer op rij 2 op positie 1.
  lcd.print("  VEEL PLEZIER MET");           // Zet tekst neer "VEEL PLEZIER MET".
  delay (1000);                              // wacht 1 sec.
  
  lcd.setCursor(0,2);                        // Zet de cursor neer op rij 3 op positie 1.
  lcd.print("      POLIJSTEN !");            // Zet tekst neer "POLIJSTEN !".
  delay (1000);                              // Wacht 1 sec.
  
  lcd.clear();                               // Maakt het lcd leeg.
  lcd.setCursor(0,0);                        // Zet de cursor op rij 2 positie 1.
  lcd.print("     RK Disign");               // Zet tekst neer "RK Disign".
  delay (2000);                              // Wacht 2 sec.
  
  lcd.clear();                               // Maakt het lcd leeg.
  

   
  lcd.clear();                                // Maakt het lcd scherm weer leeg.
  lcd.setCursor(0,1);                         // Zet de cursor neer op rij 2 op positie 1.







}

void loop() {
  
  // put your main code here, to run repeatedly:

value_potentiometer = analogRead(read_potentiometer); 

   if (value_potentiometer >  0   ){
      delay_time=210-((value_potentiometer/5));  
    }
    else
    {
      delay_time=0;    // Minumum speed when it is 0
      }

Serial.println(value_potentiometer);

Ik begrijp dus dat ik de waarde van analoog A0 die ligt tussen 0 en 1023 om moet gaan zetten naar een waarde van 0 naar 100% ik wil hiervoor 10 karakters voor gaan gebruiken.
dus dat worden stappen van 10 procent per karakter.
wie kan me hiermee de goede kant ophelpen of aangeven naar wat voor sketch te kijken.

mvg Rolf

Ben nog even veder gegaan met de code.
Ik heb geprobeerd de code in een voor mij begrijpelijke manier neer te zetten.

Ik heb de waarde van analoog A0 omgezet in een map
van 0 tot 1024 naar 0 tot 100
Deze waarde geef ik op het lcd scherm weer om wat te proberen deze loopt netjes van 0 tot 100 procent heb het procent symbool er ook achter gekregen.
nu heb ik geprobeerd met if(analogRead(0)<10){
lcd.print("*");

een sterretje neer te zetten als voor het eerste blokje van de 10 procent en met een else veder te gaan voor het volgende blokje.
Maar ik heb mijn twijfels of dit wel de juiste manier is ?

Ik voeg even de code toe zo dat je kunt zien wat ik bedoel.

Kunnen jullie mij vertellen of ik dit op een juiste manier benader ?


// Dit gedeelte is voor het lcd gedeelte

#include <Wire.h>                           // Library voor I2C communicatie
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h>  // include i/o class header
hd44780_I2Cexp lcd;                         // declare lcd object: auto locate & config display for hd44780 chip

int WaardePotmeter = A0;                    // input pin voor de potmeter op Analoog pen 0,
int WaardePotmeter1 = 0;
int WaardePotmeter2 = 0; 

void setup() {

// Hier komt de setup code deze word maar 1 keer gebruikt.

Serial.begin(9600);                          // opent de seriele poort en zet data verkeer op 9600 bps.
lcd.begin(20, 4);                            // geeft aan dat het om een 20x4 lcd gaat.
  lcd.init();                                // start het lcd op 
  lcd.backlight();                           // zet de achtergrond verlichting aan.
  lcd.clear();                               // maakt het lcd scherm leeg.
  
 // lcd.setCursor(0,0);                      // zet de cursor neer op rij 1 op positie 1.
 // lcd.print("       WELKOM");              // zet tekst neer "WELKOM"
 // delay (1000);                            // wacht 1 sec. Ik weet dat we hier een hekel aan hebben vandaar
                                             // Dat ik dit alleen gebruik in de setup
 //lcd.setCursor(0,1);                       // Zet de cursor neer op rij 2 op positie 1.
 //lcd.print("  VEEL PLEZIER MET");          // Zet tekst neer "VEEL PLEZIER MET".
 //delay (1000);                             // wacht 1 sec.
  
 // lcd.setCursor(0,2);                      // Zet de cursor neer op rij 3 op positie 1.
 //lcd.print("      POLIJSTEN !");           // Zet tekst neer "POLIJSTEN !".
 // delay (1000);                            // Wacht 1 sec.
  
 //lcd.clear();                              // Maakt het lcd leeg.
 // lcd.setCursor(0,0);                      // Zet de cursor op rij 2 positie 1.
 //lcd.print("     RK Disign");              // Zet tekst neer "RK Disign".
 //delay (2000);                             // Wacht 2 sec.
  
 //lcd.clear();                              // Maakt het lcd leeg.
    
}

void loop() {

WaardePotmeter1 = analogRead(WaardePotmeter);               
WaardePotmeter2 = map(WaardePotmeter1, 0, 1024, 0, 100);  

lcd.setCursor(9, 1);                         // Zet de cursor neer op rij 2 op positie 9.
lcd.print(WaardePotmeter2);                  // zet de waarde van potmeter2 op het lcd
lcd.print("%");                              // zet het procent teken achter de waarde
lcd.print(" ");                              // Wis het extra symbool weet niet hoe dit komt dus gebruik ik dit
lcd.setCursor(0,2);                          // Zet de cursor neer op rij 3 op positie 1.
if(analogRead(0)<10){                        // Waneer de waarde kleiner als 10 is doe het volgende
lcd.print("*");                              // zet het sterretje 
}else if(analogRead(0)<20 && analogRead(0)>10){ //Waneer de waarde kleiner als 20 is en groter dan 10
lcd.print(" *");                             // zet het sterretje op positie 2 op rij 3
}
}

Hoi Rolf (in het verleden misschien bekend als Homedistiller ?), welkom terug.

Ik heb je codes nog niet bekeken, en het is mij nu iets te laat om dar aan te beginnen.
Ik zal later nog even kijken, maar ik denk dat if niet de beste oplossing is voor je balkje.
Wanneer je inderdaad de persoon bent die ik vermoed, dan kun je wellicht nog herinneren dat we het eens over switch... case hebben gehad, dat zou al wat beter en efficiënter zijn.
Maar ik denk dat je hier beter kunt tellen en de cursor gaan aansturen en er daarom maar weinig if of switch gedaan hoeft te worden.
Ik zal je codes nog eens bekijken en kom er later op terug.

Hoi Mas,

Dat klopt! leuk dat je nog steeds actief bent op het forum.
Ik ben aangenaam verast.
Ik heb toen erg veel van je geleerd.
Het probleem is vaak dat er te lange tijd tussen het programmeren zit.
En dat ik er dan weer een beetje moet inkomen.
Denk dat de leeftijd daar ook wel wat mee te maken heeft.
Dus mocht je nog wat tips hebben of ideeen dan hoor ik ze graag

Ik heb ook even gezocht om de cursor aan te sturen en ben er met een losse sketch mee aan het stoeien.
Ik hou jullie even op de hoogte hoe dat gaat.
de polijst trommel is nu ook voor 90 procent klaar.
Ik zal later wat foto's plaatsen.
ook maak ik de stl files beschikbaar als alles netjes werkt.
zodat er meer personen zijn die hem kunnen bouwen.
De trommel is 160 mm in diameter en 250 mm lang

Heb een code gevonden voor een bar graph.
deze werkt voor de balk perfect.
Maar zodra ik andere tekst in het display wil zetten.
Geeft hij alleen maar de eerste letter weer.
Het maakt niet uit op welke lijn of rij zet.
Alleen de eerste letter verschijnt.
Ik heb de code helemaal ingekort zodat alleen het nodige blijft.
Maar wat ik ook probeer ik krijg het niet voor elkaar.
de balk werkt perfect maar dan kan ik geen andere tekst op het scherm weergeven maar alleen 1 letter.
zou het kunnen zijn dat ik een verkeerd lcd scherm heb ?
ik heb de 40x4 lcd normaal gebruik ik deze

#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h> // include i/o class header

voor mijn scherm

Ik heb de code toegevoegd die ik nu probeer werkend te krijgen.
Ik vond hem mooi kort en eenvoudig namelijk

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <LcdBarGraphRobojax.h>

byte lcdNumCols = 20; // -- number of columns in the LCD// Dit gedeelte is voor het lcd gedeeltebyte lcdNumCols = 20;    // -- number of columns in the LCD
byte lcdLine = 4;        // -- number of line in the LCD
byte sensorPin0 = A0;    // -- value for this example

float inpuValue0;       

int LEDR = 10;
int LEDG = 11;

LiquidCrystal_I2C lcd(0x27, lcdNumCols, lcdLine);  // -- creating LCD instance
LcdBarGraphRobojax lbg1(&lcd, 15, 5, 1);           // -- creating 16 character long bargraph starting at char 0 of line 0 (see video)

void setup() {
 
  lcd.backlight();      // Make sure backlight is on
  lcd.init();
  delay(500);
}

void loop()
{
  lbg1.clearLine(2);// clear line 1 to display fresh voltage value
  int inpuValue0 = analogRead(sensorPin0);
  lbg1.drawValue( inpuValue0, 1024); // -- draw bar graph from the analog value read
  analogWrite(LEDR, inpuValue0/4);

  lcd.setCursor (0, 0); //
  lcd.print("Speed");
}

OK, dit is een voorbeeld sketch die bij de door jou gevonden library hoort.
Wanneer je deze in je Arduino zet zonder aanpassingen, komt dan de balk op de 2e regel en daarboven op regel 1 dus, de tekst "speed" ?

Ik hoop dat je je nog herinnert dat we bij de Arduino beginnen met tellen bij de nul en niet bij één.
In dit voorbeeld zie ik staan "clearline(2)" met als commentaar dat dan regel 1 gewist wordt.
Klopt dit wel, of heb jij die 2 er in gezet en het commentaar niet aangepast ?

Je moet er natuurlijk voor zorgen dat jij niet op een regel wil gaan schrijven die de LiquidBarGraph library ook gebruikt.

Ik zou dit zelf gaan proberen zonder deze library.
Daarvoor zou ik de map functie gebruiken, ook omdat je dat nu ook al doet.
Maar dan zou ik hem niet naar honderd schalen, maar naar het aantal blokjes dat je wil gebruiken tot het maximum.
Je had het volgens mij over 10 blokjes, en je hebt een display met een breedte van 20 blokjes.
Ik heb het even opgezocht met mijn karakter zoek sketchje, en bij mijn display is karakter nummer 255 een vol blokje.
Daarom zou ik het volgende doen:

WaardePotmeter2 = map(WaardePotmeter1, 0, 1024, 0, 20);  

lcd.setCursor(9, 1);                         // Zet de cursor neer op rij 2 op positie 9.
lcd.print(WaardePotmeter2);                  // zet de waarde van potmeter2 op het lcd
lcd.print("%");                              // zet het procent teken achter de waarde
lcd.print(" ");                              // Wis het extra symbool weet niet hoe dit komt dus gebruik ik dit
lcd.setCursor(0,2);                          // Zet de cursor neer op rij 3 op positie 1.
if(WaardePotmeter2<5){                        // Wanneer de waarde kleiner als 5 (1 blokje) is doe het volgende
lcd.print("*");                              // zet het sterretje (je kunt ook een pijltje naar links doen ofzo, wanneer de waarde kleiner is dan het eerste blokje zou aangeven)
}else for (int blokje = 0; blokje <= WaardePotmeter2; blokje++) {
  lcd.setCursor(blokje,2);
  lcd.write (255);
}

Ik heb dit niet getest, en ik weet ook niet of jouw display ook een blokje op geheugenpositie 255 heeft.
Hier tel je dus tot maximaal 20, dat is een hele regel.
Je kunt dat ook aanpassen naar het door jou gewenste aantal blokjes wanneer dat minder is dan een hele regel.
Vervolgens zet je telkens een blokje, net zo lang tot het aantal blokjes overeen komt met de waarde die uitgelezen is.
In jouw code kijk je telkens nog een keer naar de waarde van A0, maar die zou inmiddels veranderd kunnen zijn.
Daarom is het beter als je je beperkt tot de inhoud van WaardePotmeter2.

Jouw controle op de eerste waarde heb ik behouden, zodat je ook aan kunt geven wanneer de waarde kleiner is dan je met de blokjes kunt aangeven.
Groter dan je kunt aangeven bestaat niet want dat is de volle schaal van de balkjes.

Bekijk en probeer dit eens, en wanneer je hier nog vragen over hebt hoor ik het wel.

Hoi Mas ik ben vanmiddag met je code bezig geweest.
Ik heb het nu werkend naar mijn zin na wat aanpassingen.

Maar 1 ding krijg ik niet voor elkaar.
Wat ik ook probeer het balkje blijft op regel 3 staan.
En ik wil hem graag op regel 2.
Ik heb al van alles geprobeerd om dit voor elkaar te krijgen.
Zie jij wat ik verkeerd doe ?

#include <Wire.h>                                // Library voor I2C communicatie
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h>       // include i/o class header
hd44780_I2Cexp lcd;                              // declare lcd object: auto locate & config display for hd44780 chip

int WaardePotmeter = A0;                         // input pin voor de potmeter op Analoog pen 0,
int WaardePotmeter1 = 0;
int WaardePotmeter2 = 0; 

void setup() {
                                                 // put your setup code here, to run once:
Serial.begin(9600);                              // opent de seriele poort en zet data verkeer op 9600 bps.

lcd.begin(20, 4);                                // geeft aan dat het om een 20x4 lcd gaat.
lcd.init();                                      // start het lcd op 
lcd.backlight();                                 // zet de achtergrond verlichting aan.
lcd.clear();                                     // maakt het lcd scherm leeg.
}

void loop() {
  delay(300);
                                                 // put your main code here, to run repeatedly:
WaardePotmeter1 = analogRead(WaardePotmeter); 
WaardePotmeter2 = map(WaardePotmeter1, 0, 1024, 0, 20);  
lcd.clear();                                     // maakt het lcd scherm leeg.
lcd.setCursor(1, 0);                             // Zet de cursor neer op rij 1 op positie 1.
lcd.print("      Speed:");                       // zet de tekst Speed: neer


lcd.setCursor(0,1);                              // Zet de cursor neer op rij 2 op positie 1.
if(WaardePotmeter2<5){                           // Wanneer de waarde kleiner als 5 (1 blokje) is doe het volgende
lcd.print(" ");                                  // Wis het eerste blokje anders blijft het eerste blokje staan
}else for (int blokje = 0; blokje <= WaardePotmeter2; blokje++) {
  lcd.setCursor(blokje,2);
  lcd.write (255);
 
}}



Ik heb het probleem gevonden.

lcd.setCursor(blokje,2); hier zeg je zet het blokje op lijn "3"

deze heb ik veranderd in blokje 1 en nu zet hij het netjes op lijn 2 neer.
de regel : lcd.setCursor(0,1); heb ik nu kunnen verwijderd omdat deze niks deed in de code.

Nu kan ik weer veder met de code.
morgen krijg ik de driver binnen voor de stappenmotor .
Dan kan ik met de code beginnen voor het laten draaien van de stappen motor.
Nu ga ik beginnen om op het display de tijd neer te zetten die aftelt. (countdown)
die wil ik in kunnen stellen met 3 knoppen.
1 knop tijd verhogen met inhouden en een knop voor te verlagen met inhouden
en een knop voor start en stop.
Ik wilde dit eerst met een potmeter doen maar dit is te omslachtig.
Nu dus kijken naar een countdown zonder delay.
En dan de instelling maken voor de tijd in te voeren.

Ja dit klopt, dat gedeelte heb ik over genomen uit je vorige code.
Je had niet verteld op welke regel je dit wilde hebben, maar het is wel de reden waarom ik vroeg of dit klopte, (in het commentaar stond volgens mij iets anders als in de code), en waarom ik je wees op het beginnen met tellen bij nul.

Heel goed dat je dit zelf hebt uitgevonden.

Jouw volgende punten zijn zaken die we in je distilleer apparaat al besproken hebben, dus als je dat er nog eens bij pakt kom je daar ook weer verder.
En anders horen we het wel.
Succes !

O, ik zie in jouw huidige code staan dat je scherm elk rondje dat ie maakt gewist wordt.
Dit kan er toe gaan leiden dat je scherm gaat knipperen, mede door de relatief trage behandeling die het wissen van zo'n schermpje is.
Beter wis je alleen dat gedeelte wat je wil gaan overschrijven, en dan zelfs alleen nog als er een kans bestaat dat er dan iets zou blijven hangen (zoals het eerste blokje, of als bijvoorbeeld een af te drukken waarde ineens geen tientallen meer bevat).

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.