Hantering av funktioner i Arduino IDE

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Albireo
Inlägg: 73
Blev medlem: 30 november 2019, 00:29:39

Hantering av funktioner i Arduino IDE

Inlägg av Albireo »

Hej!
Försöker förstå / hantera bl.a. funktioner i Arduino IDE.

Följande program fungerar och skriver ut text / tecken från serieporten till bla. en LCD-display.
(dock fungerar inte åäö - ännu, men det blir en annan tråd .: Hantering av t.ex. åäö på en LCD-display (2x16 - I2C))

Kod: Markera allt

/* Idé hämtad från https://forum.arduino.cc/index.php?topic=396450.0
 * Displays text sent over the serial port (e.g. from the Serial Monitor) on an attached LCD.
 */
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>


/* -----( Save åäöÅÄÖ on the LED-display )----- */
byte AwithRing[8] = {  //å
  B00100,
  B01010,
  B01110,
  B00001,
  B01111,
  B10001,
  B01111,
};
  
byte AwithDots[8] = {  //ä
  B01010,
  B00000,
  B01110,
  B00001,
  B01111,
  B10001,
  B01111,
};
  
byte OwithDots[8] = {  //ö
  B01010,
  B00000,
  B01110,
  B10001,
  B10001,
  B10001,
  B01110,
};

byte BigAwithRing[8] = {  //Å
  0b00100,
  0b01010,
  0b01110,
  0b10001,
  0b11111,
  0b10001,
  0b10001,
  0b00000
};

byte BigAwithDots[8] = {  //Ä
  0b01010,
  0b00000,
  0b01110,
  0b10001,
  0b11111,
  0b10001,
  0b10001,
  0b00000
};
 
byte BigOwithDots[8] = {  //Ö
  0b01010,
  0b01110,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b01110,
  0b00000
};
      
/*
byte Minus[8] = {
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b11111,
  0b00000,
  0b00000,
  0b00000
};
*/



/* -----( Declare Constants )----- */
#define I2C_ADDR 0x27 // Adress till LCD-display

int pos = 0;
int strpos = 0;
char receivedChar;
boolean newData = false;

/* -----( Declare objects )-----   */
LiquidCrystal_I2C lcd(I2C_ADDR, 16, 2);  // set the LCD address to 0x27 for a 16 chars and 2 line display



void setup() {
  lcd.init();       // initialize the lcd

  //-------- Write characters on the display ------------------
  lcd.createChar(1, AwithRing);     //å
  lcd.createChar(2, AwithDots);     //ä
  lcd.createChar(3, OwithDots);     //ö
  lcd.createChar(4, BigAwithRing);  //Å
  lcd.createChar(5, BigAwithDots);  //Ä
  lcd.createChar(6, BigOwithDots);  //Ö
  
  lcd.backlight();      // turn on backlight.
  
  Serial.begin(9600);
  while (!Serial) {}    // wait for serial port to connect. Needed for native USB
  Serial.println("<Arduino is ready>");
}

 // when characters arrive over the serial port...

void loop() {
    recvOneChar();
    showNewData();
}

void recvOneChar() {
    if (Serial.available() > 0) {
        receivedChar = Serial.read();
        newData = true;
        // pos = pos + 1;
        pos += 1;  // Nästa tecken
    }
}

void showNewData() {
    if (newData == true) {
        Serial.print("This just in ... ");
        // receivedChar.replace("å", "\1");
        Serial.print(receivedChar);
        Serial.print(" pos .: ");
        Serial.println(pos);
        lcd.setCursor(pos,0);
        lcd.print(receivedChar);
        newData = false;
    }
}
Men min önskan är att skapa en funktion av LCD-tecken hantering av åäöÅÄÖ.
Varför fungerar inte följande idé? .:

Kod: Markera allt

...
defChar();   // Save åäöÅÄÖ on the LED-display
...
...
void defChar() {
  /* -----( Save åäöÅÄÖ on the LED-display )----- */
  byte AwithRing[8] = {  //å
    B00100,
    B01010,
    B01110,
    B00001,
    B01111,
    B10001,
    B01111,
  };
  
  byte AwithDots[8] = {  //ä
    B01010,
    B00000,
    B01110,
    B00001,
    B01111,
    B10001,
    B01111,
  };
    
  byte OwithDots[8] = {  //ö
    B01010,
    B00000,
    B01110,
    B10001,
    B10001,
    B10001,
    B01110,
  };
  
  byte BigAwithRing[8] = {  //Å
    0b00100,
    0b01010,
    0b01110,
    0b10001,
    0b11111,
    0b10001,
    0b10001,
    0b00000
  };
  
  byte BigAwithDots[8] = {  //Ä
    0b01010,
    0b00000,
    0b01110,
    0b10001,
    0b11111,
    0b10001,
    0b10001,
    0b00000
  };
  
  byte BigOwithDots[8] = {  //Ö
    0b01010,
    0b01110,
    0b10001,
    0b10001,
    0b10001,
    0b10001,
    0b01110,
    0b00000
  };
      
  /*
  byte Minus[8] = {
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b11111,
    0b00000,
    0b00000,
    0b00000
  };
  */
}
Senast redigerad av Albireo 8 januari 2020, 23:31:37, redigerad totalt 1 gång.
Shimonu
Inlägg: 295
Blev medlem: 21 oktober 2015, 22:44:33

Re: Hantering av funktioner i Arduino IDE

Inlägg av Shimonu »

Vad är det som inte fungerar menar du?`

Just nu definierar de endast arrayerna lokalt i funktionen, misstänker att det är vad som lurar dig. De kommer inte vara tillgängliga i någon annan funktion.
Albireo
Inlägg: 73
Blev medlem: 30 november 2019, 00:29:39

Re: Hantering av funktioner i Arduino IDE

Inlägg av Albireo »

Skickade med bara den del som jag har problem med - här kommer hela programmet.

Kod: Markera allt

/* https://forum.arduino.cc/index.php?topic=396450.0
 * 
 * Displays text sent over the serial port (e.g. from the Serial Monitor) on
 * an attached LCD.
 */
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

/* -----( Declare Constants )----- */
#define I2C_ADDR 0x27 // Adress till LCD-display
defChar();   // Save åäöÅÄÖ on the LED-display

int pos = 0;
int strpos = 0;
char receivedChar;
boolean newData = false;

/* -----( Declare objects )-----   */
LiquidCrystal_I2C lcd(I2C_ADDR, 16, 2);  // set the LCD address to 0x27 for a 16 chars and 2 line display



void setup() {
  lcd.init();       // initialize the lcd

  //-------- Write characters on the display ------------------
  lcd.createChar(1, AwithRing);     //å
  lcd.createChar(2, AwithDots);     //ä
  lcd.createChar(3, OwithDots);     //ö
  lcd.createChar(4, BigAwithRing);  //Å
  lcd.createChar(5, BigAwithDots);  //Ä
  lcd.createChar(6, BigOwithDots);  //Ö
  
  lcd.backlight();      // turn on backlight.
  
  Serial.begin(9600);
  while (!Serial) {}    // wait for serial port to connect. Needed for native USB
  Serial.println("<Arduino is ready>");
}

 // when characters arrive over the serial port...

void loop() {
    recvOneChar();
    showNewData();
}

void recvOneChar() {
    if (Serial.available() > 0) {
        receivedChar = Serial.read();
        newData = true;
        // pos = pos + 1;
        pos += 1;  // Nästa tecken
    }
}

void showNewData() {
    if (newData == true) {
        Serial.print("This just in ... ");
        // receivedChar.replace("å", "\1");
        Serial.print(receivedChar);
        Serial.print(" pos .: ");
        Serial.println(pos);
        lcd.setCursor(pos,0);
        lcd.print(receivedChar);
        newData = false;
    }
}


void defChar() {
  /* -----( Save åäöÅÄÖ on the LED-display )----- */
  byte AwithRing[8] = {  //å
    B00100,
    B01010,
    B01110,
    B00001,
    B01111,
    B10001,
    B01111,
  };
  
  byte AwithDots[8] = {  //ä
    B01010,
    B00000,
    B01110,
    B00001,
    B01111,
    B10001,
    B01111,
  };
    
  byte OwithDots[8] = {  //ö
    B01010,
    B00000,
    B01110,
    B10001,
    B10001,
    B10001,
    B01110,
  };
  
  byte BigAwithRing[8] = {  //Å
    0b00100,
    0b01010,
    0b01110,
    0b10001,
    0b11111,
    0b10001,
    0b10001,
    0b00000
  };
  
  byte BigAwithDots[8] = {  //Ä
    0b01010,
    0b00000,
    0b01110,
    0b10001,
    0b11111,
    0b10001,
    0b10001,
    0b00000
  };
  
  byte BigOwithDots[8] = {  //Ö
    0b01010,
    0b01110,
    0b10001,
    0b10001,
    0b10001,
    0b10001,
    0b01110,
    0b00000
  };
      
  /*
  byte Minus[8] = {
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b11111,
    0b00000,
    0b00000,
    0b00000
  };
  */
}
Men detta program ger dessa problem vid kompilering
Arduino:1.8.10 (Windows 10), Kort:"Arduino Uno"

SerialDisplay_16x2_-_1:15:10: error: expected constructor, destructor, or type conversion before ';' token

defChar(); // Save åäöÅÄÖ on the LED-display
^

C:\Users\...\SerialDisplay_16x2_-_1.ino: In function 'void setup()':
SerialDisplay_16x2_-_1:31:21: error: 'AwithRing' was not declared in this scope
lcd.createChar(1, AwithRing); //å
^~~~~~~~~

SerialDisplay_16x2_-_1:32:21: error: 'AwithDots' was not declared in this scope
lcd.createChar(2, AwithDots); //ä
^~~~~~~~~

SerialDisplay_16x2_-_1:33:21: error: 'OwithDots' was not declared in this scope
lcd.createChar(3, OwithDots); //ö
^~~~~~~~~

SerialDisplay_16x2_-_1:34:21: error: 'BigAwithRing' was not declared in this scope
lcd.createChar(4, BigAwithRing); //Å
^~~~~~~~~~~~

SerialDisplay_16x2_-_1:35:21: error: 'BigAwithDots' was not declared in this scope
lcd.createChar(5, BigAwithDots); //Ä
^~~~~~~~~~~~

SerialDisplay_16x2_-_1:36:21: error: 'BigOwithDots' was not declared in this scope
lcd.createChar(6, BigOwithDots); //Ö
^~~~~~~~~~~~

Multiple libraries were found for "Wire.h"
Använd: C:\Users\...\arduino\hardware\avr\1.8.2\libraries\Wire
Multiple libraries were found for "LiquidCrystal_I2C.h"
Använd: C:\Users\...\Arduino\libraries\LiquidCrystal_I2C-1.1.2
Oanvänd: C:\Users\...\Arduino\libraries\NewliquidCrystal
exit status 1
expected constructor, destructor, or type conversion before ';' token

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
Shimonu
Inlägg: 295
Blev medlem: 21 oktober 2015, 22:44:33

Re: Hantering av funktioner i Arduino IDE

Inlägg av Shimonu »

För defChar måste du säga vad returtypen är.

För de andra så finns de inte inom det skopet. De är deklarerade någon annanstans eller inte alls.
Albireo
Inlägg: 73
Blev medlem: 30 november 2019, 00:29:39

Re: Hantering av funktioner i Arduino IDE

Inlägg av Albireo »

Detta är hela programmet.
"returtypen"?? Vad innebär det? Exempel?
hummel
Inlägg: 2267
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Hantering av funktioner i Arduino IDE

Inlägg av hummel »

Alla funktioner måste deklareras med typ och samtliga parametrar. Vilka argument skickas till funktionen. Vad returnerar funktionen.

Kod: Markera allt

//Deklaration av funktion
void showNewData(void); //funktion som inte tar några argument och inte returnerar något resultat.
int showNewData(char c); //funktion som tar en parameter c av type char. Den returnerar en integer.
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Hantering av funktioner i Arduino IDE

Inlägg av Icecap »

Hade du gjort detta med att skicka char-definitionerna INUTI defchar() hade det fungerat fint.
Och jag hade vald att göra det i den funktion.

Som det är nu definierar du data i en subfunktion och de finns bara i den funktion. Du kallar aldrig funktionen, det finns ingen programkod i den så den gör inget.
Albireo
Inlägg: 73
Blev medlem: 30 november 2019, 00:29:39

Re: Hantering av funktioner i Arduino IDE

Inlägg av Albireo »

hummel skrev:...Vilka argument skickas till funktionen. Vad returnerar funktionen...
Funktionen defChar behöver inga ingående variabler, men skapar 6st nya variabler. (som jag ser det)
_______________________________
Icecap skrev:...Hade du gjort detta med att skicka char-definitionerna INUTI defchar() ...
"char-definitionerna" - Är det inte teckendefinitionerna som är i funktionen defChar()?

Som jag ser det (men är inte så bra på detta)
Först så skapas ett mönster som sparas i en variabel ex.

Kod: Markera allt

  byte AwithRing[8] = {  //å
    B00100,
    B01010,
    B01110,
    B00001,
    B01111,
    B10001,
    B01111,
  };
  
Sedan placeras mönstret i en minnescell i LCD-displayen .:

Kod: Markera allt

lcd.createChar(1, AwithRing);     //å
För att tillsist kunna anropas (vilket inte görs i programmet - därav en annan tråd .: Hantering av t.ex. åäö på en LCD-display (2x16 - I2C) )

Kanske även skulle fungera att lägga mönstret direkt till LCD-displayen?

Kod: Markera allt

  lcd.createChar(1,
    B00100,
    B01010,
    B01110,
    B00001,
    B01111,
    B10001,
    B01111);     //å
(kanske bara behöver/skall utföras vid ett tillfälle? - Inte varje gång programmet körs?)
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Hantering av funktioner i Arduino IDE

Inlägg av Icecap »

De definitioner finns BARA inom CharDef(). Om du försöker använda dom från annanstans finns de inte.
Flyttar du de createChar() du använder inuti chardef() och anropar chardef() under initieringen gör du det rätt och definitionerna är tillgängliga.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Hantering av funktioner i Arduino IDE

Inlägg av sodjan »

Vid det här laget bör du ha fattat att du inte kan skapa locala variabler
i en funktion och tro att du kan använda dom utanför funktionen, så det
kommenterar jag inte vidare.

> (kanske bara behöver/skall utföras vid ett tillfälle? - Inte varje gång programmet körs?)

Handlar detta om att skapa tecken i den (8 st. har jag för mig)
"user defined" characters som finns i HD44780 controllern? Det
är helt dynamiska tecken och stänger du av LCD'n så försvinner
de, men om *bara* programmet startas om så behövs det inte
rent tekniskt, men hur ska programmet vet om det startas första
gånger eller om det startas (om) mot en redan initierad display?
Albireo
Inlägg: 73
Blev medlem: 30 november 2019, 00:29:39

Re: Hantering av funktioner i Arduino IDE

Inlägg av Albireo »

I klartext är det jag hoppats på utföra, omöjligt i Arduino?
(Det finns inga "riktiga" funktioner, eller möjlighet till subrutiner)
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Hantering av funktioner i Arduino IDE

Inlägg av sodjan »

Klart det inte är omöjligt. Det som du har gjort är inget
"Arduino fel", det är ett vanligt programmeringsfel i C.
Rätta till det. Det är lite märkligt att du inte alls har
visat att du fattar vilket fel du gjorde...
Albireo
Inlägg: 73
Blev medlem: 30 november 2019, 00:29:39

Re: Hantering av funktioner i Arduino IDE

Inlägg av Albireo »

Tror jag förstår problemet - till viss del, men hittar ingen lösning... :humm:
Vad har jag missat? Vad tycker du/ni att jag ska göra?
Är det I2C jag inte förstår till fullo?
För mig är det att fortsätta fråga till jag förstår, eller att "ge upp".

Vet inte ens vilken display jag använder (det står 1602A på den och har blå bakgrund med I2C teknik samt köpt i Tyskland)
Om den innehåller en "HD44780 controller" - ingen aning!
Vet inte vilken teckentabell den har - ingen aning!
Verkar finnas asiatisk eller europeisk teckentabell. Denna LCD verkar inte ha en europeisk teckentabell. (vilket hade varit bättre)
Det finns LCD-displayer som behåller "programmeringen" även vid strömavbrott.
Har läst om (16x2) displayer där visserligen de 8 första tecknen inte är definierade (plats för egna) men inget problem att fritt programmera även de övriga. (Har inte testat om min är en sådan - först bör jag veta teckentabellen.)
Sodjan skrev:...Rätta till det...
Finns något exempel? Ledtråd? :?

Har försökt tolka "manualen" till Arduino Functions
Där visas hur bara ett värde returneras från en funktion (men inte hur flera värden returneras)

Skrev om funktionen så inga värden behöver returneras, men då måste värdet lcd tillföras funktionen.
Men jag vet inte om lcd är en variabel eller om det är ett objekt. (kan objekt passas till en funktion - som en variabel?)
För jag inte förstår vad instruktionen LiquidCrystal_I2C lcd(0x27, 16, 2); gör.
Många exempel använder följande instruktion LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); Ingen aning vad som skiljer, men den strukturen fungerar inte för mig.

Har fler frågor än svar just nu!
- Förstår inte skillnaden att skriva instruktioner innan eller i void setup()
- Vet inte hur jag ska deklarera min funktion - det är inte en "int" förmodligen inte en "char" och känns inte som en String...
ds77
Inlägg: 2216
Blev medlem: 24 juli 2008, 09:38:07
Ort: småland

Re: Hantering av funktioner i Arduino IDE

Inlägg av ds77 »

Shimonu skrev:Just nu definierar de endast arrayerna lokalt i funktionen, misstänker att det är vad som lurar dig. De kommer inte vara tillgängliga i någon annan funktion.
Icecap skrev:Hade du gjort detta med att skicka char-definitionerna INUTI defchar() hade det fungerat fint.
Och jag hade vald att göra det i den funktion.

Som det är nu definierar du data i en subfunktion och de finns bara i den funktion. Du kallar aldrig funktionen, det finns ingen programkod i den så den gör inget.
Icecap skrev:De definitioner finns BARA inom CharDef(). Om du försöker använda dom från annanstans finns de inte.
Flyttar du de createChar() du använder inuti chardef() och anropar chardef() under initieringen gör du det rätt och definitionerna är tillgängliga.
sodjan skrev:Vid det här laget bör du ha fattat att du inte kan skapa locala variabler
i en funktion och tro att du kan använda dom utanför funktionen, så det
kommenterar jag inte vidare.
Ledsen att citera så mycket men det verkar inte som det här har gått fram.

Hur fungerar det om du skippar defChar funktionen och istället lägger deklarationen under /* -----( Declare Constants )----- */?
Castor
Inlägg: 1985
Blev medlem: 24 mars 2012, 13:03:49

Re: Hantering av funktioner i Arduino IDE

Inlägg av Castor »

Leta rätt på datablad till din display, lägg ut en länk här så kanske någon med gott om tid vill läsa vad som gäller för denna display. Läs gärna databladet själv också, ställ inte bara frågan "vad ska jag göra" här i tråden. Du har fått förklarat hur det fungerar, om du inte förstått läs igen tills du inser hur displayen ska hanteras för att ge det resultat du vill ha.
Skriv svar