Display een gegeven tekst string gefaseerd naar een LCD Display

hallo. Ik ben kompleet nieuw hier en start net met Arduino programmering. Ook totaal nieuw voor mij.
Ik heb als hobby Radiozendamateur en wil graag wat Arduino projectjes gaan combineren met deze hobby
Daarom mijn eerste probeersels, waar ik vast loop en jullie hulp vraag.

Ik heb een sketch gevonden welke een tekststring omzet in morsetekens zichtbaar en hoorbaar via een led en buzzer
Ik wil echter graag deze tekststring ook zichtbaar maken op een display, in hetzelfde ritme dat de morse tekens klinken
Ik heb het display al wel aan de praat, maar zoals de sketch nu is, wordt de tekststring in een keer getoond op het display.

Ik zoek dus een algoritme, waarbij ik de tekens een voor een uit de tekststring kan halen en, in gelijk ritme als het laten zien op de led en horen via de buzzer, op het display kan tonen

In de bijlage de huidige sketch

Morse02_cq_pa0gtb_tone_and_lcd_display.ino (8.25 KB)

Hoi.

Ik had al zo’n donkerbruin vermoeden, maar door je sketch eens te bekijken werd dat vermoeden bevestigd.
Dit is jouw sketch (met een stukje eruit gesloopt omdat het anders te groot werd):

/* building a sketch to send morsecode
 * to a buzzer and outs the textstring
 * on a lcd display
 */


#include <TimerOne.h>

// include the library code for display

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

// set the LCD address to 0x27 and setup for a 20 chars 4 line display
// A FEW use address 0x3F
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

// set timers

#define LOOPTIME 1                  // msec. 1, 2, 4, 8 are reasonable values

#define ditPeriod 100/LOOPTIME       // msec  set morsecode speed
#define dahPeriod (ditPeriod*3)
#define relaxTime (ditPeriod)
#define letterSpace (ditPeriod*2)
#define wordSpace (ditPeriod*6)

#define buzz 1400   // Hz
#define tonePin 11   // morse output
#define tone2Pin 12  // dc compensate for anti plop.
                    // Use two resistors on tonePin and tone2Pin to connect to low pass filter.
#define ledPin 13   // Pin 13 has a LED connected on most Arduino boards

String Morseinput;
unsigned char Index=0,i;

unsigned int mscnr;
unsigned int tonecnr;
unsigned char oldmillis;

unsigned char mbyte, mseq, mbitpos = 0;
bool b_sendmorse = 0, b_mactive = 0;

/*********************************************************/
void setup(){
  unsigned int i;
  
//  Morseinput textstring to send to buzzer
  Morseinput = String("CQ CQ de PA0GTB PA0GTB k");

// set up the LCD's number of columns and rows:
  lcd.begin(20,4);
// Set cursr on line 1
  lcd.setCursor(0, 1);
  lcd.print (Morseinput);  // puts now total string on display !!

// I want to modify this so that the strings coms in speed with the
// morsecode, character by character on display  

// Initialize the digital pin as an output.
  pinMode(13, OUTPUT);
  pinMode(tonePin, OUTPUT);         // add a resistro to tis pin
  pinMode(tone2Pin, OUTPUT);        // add a resistor to this pin and connect the two resistors on the other end for DC compensation.
  pinMode(ledPin, OUTPUT);    

  digitalWrite(tone2Pin,HIGH);

  tone(tonePin, 800);
  delay(100);
  noTone(tonePin);
  delay(100);
  tone(tonePin, 1000);
  delay(100);
  noTone(tonePin);
  delay(100);
  tone(tonePin, 1250);
  delay(100);
  noTone(tonePin);
  delay(100);
  tone(tonePin, 1625);
  delay(100);
  noTone(tonePin);
  delay(1000);

/*  for(i=500;i<2000;i++){
    tone(tonePin,i);
    delay(1);
  }
  for(i=2000;i>500;i--){
    tone(tonePin,i);
    delay(1);
  }
  noTone(tonePin);
  delay(1000);
*/
  delay(1000);
  b_sendmorse = 1;
}


//************************************************************************
//*********************** main loop **************************************
//************************************************************************
void loop(){
  
  while(oldmillis == (millis() & LOOPTIME));                // wait until changed (1msec)
  oldmillis = ((millis() & LOOPTIME));
  mscnr++;
  morseout();

//**********************************
  if(mscnr % (16384/LOOPTIME) == 0) b_sendmorse = 1;        // send morse every 16.4 seconds

  if(b_sendmorse){                                          // demo call to morse routine
    if(!b_mactive){
      if(Morseinput[Index]>0){                              // get character from string
        if(isLowerCase(Morseinput[Index])){
          Morseinput[Index] = Morseinput[Index]-0x20;
        }
        get_mbyte(Morseinput[Index]);                       // get a morse byte
        Index++;
        b_mactive = 1;
      }else{
        b_sendmorse = 0;
        Index = 0;
      }
    }
  }
//***********************************

}
//************************************************************************
//*********************** end main loop **********************************
//************************************************************************


//*****************************************************
//************* Background morse routine **************
//***  b_mactive  morse engine activated            ***
//***  mbyte      morse character                   ***
//*****************************************************
void morseout(void){
  
  if(b_mactive && (mseq == 0)){
    mseq = 1;
    mbitpos = 0;
  }
    
  switch(mseq){
    case 1:                                     // start
      if(mbyte == 0x07){                        // wordSpace
        tonecnr = wordSpace;
        mseq = 4;
      }else{
        if(((mbyte << mbitpos) & 0x80) == 0x80){ // get di/dah
          tonecnr = dahPeriod;
        }else tonecnr = ditPeriod;
        digitalWrite(tone2Pin,LOW);           // DC compensation
        tone(tonePin, buzz);
        digitalWrite(ledPin, HIGH);           // turn the LED on (HIGH is the voltage level)
        mseq = 2;
      }
      break;
    
    case 2:
      if(tonecnr-- == 0){                     // end tone
        noTone(tonePin);
        digitalWrite(tone2Pin,HIGH);
        digitalWrite(ledPin, LOW);
        tonecnr = relaxTime;
        mseq = 3;
      }
      break;
    
    case 3:                                   // add pause
      if(tonecnr-- == 0){
        mseq = 4;
      }
      break;

    case 4:        
      if(++mbitpos > (mbyte & 0x07)){         // get next bit
        tonecnr = letterSpace;
        mseq = 5;                             // end morse
      }else mseq = 1;                         // next bit
      break;

    case 5:                                   // add letterSpace
      if(tonecnr-- == 0){
        b_mactive = 0;                        // end transmit
        mseq = 0;
      }
      break;
  }
}
/**************************************************************/
/*** Morse chars definitions *******************************/
/**************************************************************/
// first 5 bits (msb's) represent dash (1) or dot(0)
// last 3 bits  (lsb's): length+1 (0 to 7)

void get_mbyte(char x){
  switch (x){
    case 'A':
      mbyte = 0x41;    //    0100 0001
      break;
    case 'B':
      mbyte = 0x83;    //    1000 0011
      break;
    case 'C':
      mbyte = 0xa3;    //    1010 0011
      break;
.
.
.
    case '8':
      mbyte = 0xe4;    //    1110 0100
      break;
    case '9':
      mbyte = 0xf4;    //    1111 0100
      break;
//*** custom character ***
    case ' ':
      mbyte = 0x07;    //    0000 0111      special !!
      break;
  }
}

Jouw Morseinput word in je sketch ook karakter voor karakter gelezen en vervolgens verzonden.
Daarbij word ie geholpen door ene Index.
Je kunt aan dat stukje gewoon telkens het dan actuele karakter naar je scherm sturen hoor, dat gaat zonder meer gewoon werken.
Dus, voordat Index verandert, stuur je de inhoud van Morseinput, ter hoogte van Index ook nog even door naar je scherm.
Je moet zelf weten of je ook nog de conversie doet naar HOOFDLETTERS door er 32 af te tellen als het kleine letters zijn die je tegen komt.

met dank voor je reactie dit is de eerste serieuze reactie op mijn vraag. Ik had hem ook al elders gesteld maar werd daar een beetje voor jan met de korte achternaam weggezet en afgeblazen

Ik snap wat je bedoeld. in de sketch wordt echter het karakter omgezet naar een morsecode die vervolgens hoorbaar en zichtbaar wordt gemaakt Ik zie zo even nog niet in welke variabele waar het echte karakter nu staat zodat ik dat kan benoemen en kan printen op het display. kun je mij dit aangeven svp...

Ik ben pas 1 week aan het stoeien met al deze zaken en weet dat ik nog veel moet leren...hi.. Maar ik probeer de routines te snappen. Simplere dingen lukken al wel maar ik wilde dit snappen en aan de praat krijgen.

alvast bedankt

PS je kunt het natuurlijk ook in het stukje code aangeven

AAnvullend ik heb het denk ik gevonden Maar ik mis nu telkens het eerste karakter van de string


if(b_sendmorse){ // demo call to morse routine if(!b_mactive){ if(Morseinput[Index]>0){ // get character from string if(isLowerCase(Morseinput[Index])){ Morseinput[Index] = Morseinput[Index]-0x20; } get_mbyte(Morseinput[Index]); // get a morse byte Index++; b_mactive = 1; lcd.print (Morseinput [Index]); }else{ b_sendmorse = 0; Index = 0;

Mogelijk toch op de verkeerde plaats ?

Laat maar. ik heb hem nu op de correcte plaats Met dank

Hoi pa0gtb.

We zijn hier van het leren, en dat is de reden waarom ik je niet een stukje code heb toegeworpen dat je vervolgens gebruikt zonder het te snappen. Dat is ook de reden waarom je de wat minder aangename reacties kreeg. Je gebruikt een code die je ergens hebt gevonden zoals je zelf schreef, en vervolgens ga je vragen stellen over iets waarvan het antwoord al bijna in die code staat. Dat kan soms wat botte reacties opleveren, ook van mij.

In dit geval dus niet, omdat je voldoende had aangegeven dat je nog maar net met deze materie bezig bent. Je hebt je roepnaam als gebruikersnaam op het forum gekozen, en dan is het niet heel raar dat je met dit morse dingetje aan het spelen bent. Maar eigenlijk is het veel beter als je onderaan de trap begint en de voorbeelden die bij de IDE zitten eens bestudeert. Dan leer je namelijk om code te lezen. Ik heb je dus niet een pasklare oplossing gegeven, maar in plaats daarvan wat hints gegeven. Die hints zouden in een andere thread wat minder duidelijk zijn, hier heb ik je gewezen op op de betreffende variabelen (met naam benoemd) waar je de informatie uit kunt halen.

Het stukje code (snippet) dat je liet zin, is inderdaad wat ik bedoelde. De vergissing die je gemaakt hebt, is waar ik je wel al voor had gewaarschuwd, want index wordt eerst verhoogd, en pas daarna ga je kijken wat er moet worden afgebeeld.

Ik neem nu aan dat je je lcd.print dus 2 regels omhoog hebt geplaatst, waarmee je probleem is opgelost. In dat geval heb je ook de hoofdletter conversie uitgevoerd. Als je dat niet wil, dan kun je je lcd.print nog een stukje hoger zetten, voor die conversie. Misschien wel interessant om dat te doen en dan de sketch een tijdje te laten lopen. Dan zie je vermoedelijk iets wat die sketch doet, waarvan je je nu niet bewust bent (probeer het maar eens, en let dan goed op).

Zoals gezegd, we zijn hier van het leren, en jij hebt nu geleerd. Dus iedereen blij. Maar ik zou er nog iets blijer van worden als je een volgende keer niet alleen je problemen hier toont, maar ook tot welke oplossing je bent gekomen. Want zo help je anderen dus ook om te leren. Ik leer hier op het forum ook dagelijks. En dan vooral door het lezen van de vragen van anderen, en te gaan nadenken over mogelijke oplossingen daarvan. Maar ook van de oplossingen die anderen gevonden hebben. Das nou juist het mooie van een forum zoals dit.

In ieder geval chappeau dat het je gelukt is om de aanpassing die je wilde maken, ook gelukt is en nu dus kunt gebruiken.

Dank je wel voor je reactie Ik leer daar ook weer van... :-) ja ik heb inderdaad de print opdracht nu iets hoger geplaatst en nu werkt het

Ik ben ook gestart met een groepje mede radioamateurs in een workshop om te leren en te snappen wat je doet, wat er gebeurd en waarom. Maar ja, dat ging me niet snel genoeg vandaar dat ik er als het ware ingesprongen ben toen ik iets vond wat ik verder uit wilde diepen. Alle begin is moeilijk.... pas op de plaats is soms inderdaad beter.

Ik merk dat de Arduino programmeertaal toch wat anders in elkaar steekt als Pascal en C wat ik in mijn jonge jaren heb geleerd. Ik ook alweer ruim 35 jaar gelden dat ik daar mee bezig was.

Ik lees nu veel en heb ook een aardig manual gevonden met voorbeelden die ik nu uitwerk lezen, doen, zien en snappen... en dan verder... :)

Nogmaals dank

Hoi.

De Arduino programmeertaal bestaat niet, die vergissing word vaker gemaakt. Het is eerder een Arduino programmeer omgeving, maar das een schil om een C++ compiler. Dus die moet eigenlijk wel erg lijken op de C ervaringen die je eerder hebt opgedaan.

Het mooie van de eerdere programmeer ervaringen, is dat je een bepaalde gedachtewijze zou moeten hebben 'opgelopen' tijdens die periode. Die zou je nu van pas moeten komen, ik merk zelf dat ik wat minder moeite heb met 'de tafel' van acht, en van 16, maar ook dat ik met mijn zeer beperkte ervaringen een kleine 30 jaar geleden toch wel op een bepaalde manier tegen zaken aan kijk die me nu helpt.

Heb je al geprobeerd de nu werkende sketch nog een beetje aan te passen, en heb je ook ontdekt wat ik bedoelde in mijn vorige post ? In dit geval zou wat ik daar bedoelde niet zoveel uitmaken, maar voor de toekomst zou zoiets toch een mogelijk kwalijk en onbedoeld effect gaan geven.

Door te gaan spelen met werkende code en dan te gaan zien wat dat doet, leer je ook heel veel. Ik vind dat leuk om te doen, maar dan moet je er wel de tijd voor hebben...