Vraagje over de Seriële monitor en LCD

Arduino specifieke Software
Berichten: 11
Geregistreerd: 30 Okt 2015, 16:08

Vraagje over de Seriële monitor en LCD

Berichtdoor Joost70 » 30 Okt 2015, 16:32

Hallo allemaal,

Ik ben bezit een code te maken, waarin de gebruiker in de Seriële Monitor tekst in moet typen. De Arduino doet vervolgens deze stappen:
- Het zet de getypte tekst op het LCD scherm (zelf al ge-programmeert)
- Het speelt met een piezo element een riedeltje af (zelf al ge-programmeert)
- Vervolgens moet het de hele tijd langzaam naar links scrollen zodat de tekst van tientallen letters en tekens op het 16 vakjes grote LCD scherm te zien zijn. Elke keer als alle tekst is laten zien, moet (alleen het scrollen) weer opnieuw beginnen (Hier heb ik jullie hulp bij nodig)

Dit is de code die ik heb gemaakt:
Code: Alles selecteren
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
boolean pieper = false;
String alpha;
int aantal = 0;

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // initialize the serial communications:
  Serial.begin(9600);
  pinMode(8, OUTPUT);
}

void loop() {
  // when characters arrive over the serial port...
  if (Serial.available()) {
    // clear the screen
    lcd.clear();
    // read all the available characters
    while (Serial.available() > 0) {
      aantal = Serial.available();
      // display each character to the LCD
      lcd.write(Serial.read());
      pieper = true;
      aantal = Serial.available();
      Serial.println("Aantal: "+aantal);
    }
  }

  if(pieper == true) {
    for(int i=0; i<3; i+=1) {
      tone(8, 1420, 500);
      delay(500);
      tone(8, 2021, 500);
      delay(500);
      tone(8, 2950, 500);
      delay(500);
      noTone(8);
      delay(1000);     
    }
    pieper = false;
  }

  for(int i=0; i<(aantal+5); i+=1) {
    lcd.scrollDisplayLeft();
    delay(500);
  }

 
}


Nog één keer voor de duidelijkheid
- Ik wil dus eigenlijk dat de Arduino weet hoelang de code is en net zolang blijft scrollen naar links tot de volledig getypte tekst is laten zien.
- Vervolgens moet het het LCD scherm 'clearen' en opnieuw beginnen met scrollen.
- De tekst die de gebruiker intypt heeft geen vaste lengte.

Ik hoop dat jullie mij hierbij kunnen helpen.
Alvast bedankt!

Groeten,
Joost70

Advertisement

Gebruikers-avatar
Berichten: 270
Geregistreerd: 30 Dec 2012, 11:42

Re: Vraagje over de Seriële monitor en LCD

Berichtdoor Rudi » 30 Okt 2015, 16:51

Om je op weg te zetten, de LiquidCrystal library heeft scroll functies aan boord, neem de documentatie van die library maar even door.
Arduinows!
Why do computer programmers confuse Halloween with Christmas? Because Oct 31 = Dec 25
I got 01100011 problems but a bit ain't 00000001

Berichten: 11
Geregistreerd: 30 Okt 2015, 16:08

Re: Vraagje over de Seriële monitor en LCD

Berichtdoor Joost70 » 30 Okt 2015, 17:00

Bedankt voor de snelle reactie Rudi,

Ik had dit al gezien en regelmatig gebruikt, maar eigenlijk was mijn vraag meer:
Hoe kan ik de Arduino laten berekenen hoeveel keer hij moet scrollen om alle tekst weer te kunnen geven?

Daarnaast, als ik een tekst invoer, breekt de Arduino de tekst op een bepaald punt af en zet ie t op de volgende regel. Hoe kan ik dat voorkomen?

Groet,
Joost70

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

Re: Vraagje over de Seriële monitor en LCD

Berichtdoor shooter » 30 Okt 2015, 18:37

als je als laatste karakter een hex00 zet dan kun je daarop zoeken en je lengte bepalen.
paul deelen
shooter@home.nl

Berichten: 11
Geregistreerd: 30 Okt 2015, 16:08

Re: Vraagje over de Seriële monitor en LCD

Berichtdoor Joost70 » 30 Okt 2015, 23:43

Wat is ee hex00? Ik hen nog maar n half jaar de Arduino.
Met welk commando is dit te realiseren? Dan zal ik zelf het gebruik ervan opzoeken.

Is er ook iets om ervoor te zorgen dat de Arduino de tekst niet zomaar afbreekt en op de volgende regel verdergaat?

Groet,
Joost70

Berichten: 11
Geregistreerd: 30 Okt 2015, 16:08

Re: Vraagje over de Seriële monitor en LCD

Berichtdoor Joost70 » 31 Okt 2015, 19:31

Hallo allemaal,

Bijna alles is me nu gelukt, behalve 1 klein dingetje. Die van dat de Arduino na een tijdje uit zichzelf de tekst er nog een keer achteraan plakt. Dit wil ik liever niet hebben. Ik heb al gekeken, maar kan geen 'kortsluitinkjes' is m'n code vinden voor dit probleem.

Kan iemand mij hierbij helpen?

Alvast bedankt!
Joost70

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Vraagje over de Seriële monitor en LCD

Berichtdoor nicoverduin » 31 Okt 2015, 21:23

De Arduino doet echt niets uit zichzelf :) en Hex '00' is het sluit teken van een string. Meestal benoemd met '\0'.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 11
Geregistreerd: 30 Okt 2015, 16:08

Re: Vraagje over de Seriële monitor en LCD

Berichtdoor Joost70 » 01 Nov 2015, 11:27

De Arduino doet niks uit zichzelf, maar ik heb het niet geprogrammeerd!
Waarschijnlijk zit de fout in de LiquidCrystal library die ik gebruik. Weet iemand hoe ik deze fout op kan lossen?

Mocht het nodig zijn, kan ik in de volgende post (als ik vanaf m'n pc een bericht plaats (nu van m'n tablet)) de code sturen die ik tot nu toe heb!

Groeten

Berichten: 11
Geregistreerd: 30 Okt 2015, 16:08

Re: Vraagje over de Seriële monitor en LCD

Berichtdoor Joost70 » 01 Nov 2015, 12:12

Hallo,

Ik heb even iets bedacht om het beter uit te leggen. Als eerste mijn aangepaste code tot nu toe:
Code: Alles selecteren
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
boolean pieper = false;
String readString;
String lcdDisplay;
int aantal = 0;
int aantalScrolls = 0;
int aantalCopy = 0;

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // initialize the serial communications:
  Serial.begin(9600);
  pinMode(8, OUTPUT);
}

void loop() {
  // when characters arrive over the serial port...
  if (Serial.available()) {
    // clear the screen
    lcd.clear();
    lcdDisplay = "";
    aantalScrolls = 0;
    // read all the available characters
    while (Serial.available() > 0) {
      char c = Serial.read(); aantal+=1;
   
      readString += c; //makes the string readString
   
    }
   
    // display each character to the LCD
      lcdDisplay += readString;
      readString = "";
      lcd.print(lcdDisplay);
      pieper = true;
  }

 

  if(pieper == true) {
    for(int i=0; i<3; i+=1) {
      tone(8, 1420, 500);
      delay(500);
      tone(8, 2021, 500);
      delay(500);
      tone(8, 2950, 500);
      delay(500);
      noTone(8);
      delay(1000);     
    }
    pieper = false;
    aantalCopy = aantal;
  }

  aantal = 0;
 
  if(aantalCopy > 16 && aantalScrolls < 3) {
    for(int i=0; i<aantalCopy; i+=1) {
    lcd.scrollDisplayLeft();
    delay(500);
  }
  aantalScrolls += 1;
  lcd.clear();
  lcd.print(lcdDisplay);
  delay(2000);
 }
  else if(aantalCopy > 16 && aantalScrolls == 3) {
    lcd.clear();
  }
 
 
}


Vervolgens heb ik een voorbeeld afbeelding gemaakt op mijn computer. Deze zit in de bijlage.

Stel dat ik een tekst invoer op in de Seriële monitor, in dit voorbeeld de tekst 'This is an example that I have made for you!'
De arduino laat deze tekst zien (zoals in NUMBER 1 in de bijlage)
Vervolgens scrollt de arduino naar links. Na een tijdje kom ik bij NUMBER 2 in de bijlage: de arduino plakt de ingevoerde tekst achter het laatste teken van de vorige tekst. Dit is ALTIJD na een bepaald aantal keer scrollen. Ik kan niets in mijn code vinden dat de boosdoener is.

Soms is de zin te lang, dan knipt de Arduino de code gewoon doormidden en laat hij het tweede gedeelte ineens op de tweede regel zien.

Ik hoop dat het wat duidelijker is. Mocht dit niet zo zijn, vraag het alstublieft!

Groeten van mij!
Bijlagen
LCD.jpg
Bijlage
LCD.jpg (59.44 KiB) 7480 keer bekeken

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Vraagje over de Seriële monitor en LCD

Berichtdoor nicoverduin » 01 Nov 2015, 12:38

Ik zie wel dat je veel gebruik maakt van String. Dat zou best eens een van de boosdoeners kunnen zin. De Arduino kent geen memory management. String vraagt dynamisch voor de hele string + extra teken elke keer als je er een nieuw teken toevoegt. Dit veroorzaakt fragmentatie wat zelfs tot overschrijvingen kan leiden.
Voor string functies kun je beter gewoon char gebruiken en strcpy() ed.

Verder als ik kijk naar jouw specificaties boven in, dan zou ik wat meer structuur brengen in het programma. En de zaken wat beter ordenen.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Google [Bot] en 90 gasten