Funktionsanrop i Arduino....

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
JonLee
Inlägg: 12
Blev medlem: 17 november 2013, 20:34:26
Ort: Gideå, västernorrlands län
Kontakt:

Funktionsanrop i Arduino....

Inlägg av JonLee »

Hej igen nu kommer nästa frågor :)

Jag har en char array deklarerad och vill skriva ut värden ur den via en annan funktion som jag ska anropa. Här är koden för anropet, värdena som jag skickar med är vilken tecken position, vilken kolum och vilken position i arrayn som ska användas... Som jag också har förstått det så behöver jag inte skicka med alla värdena som jag kan ta emot i funktionhuvudet, men kan det ha med det att göra ändå?

Kod: Markera allt

  lcdPrint(0, 0, 0);
Här är funktionen som anropas, den är inte helt klar men ska slipas till bara jag får anropet att fungera...

Kod: Markera allt

// Print function for LCD use...
void lcdPrint(int rows, int colums, int text, float tempC, boolean cls = false){
  lcd.setCursor(rows, colums);
  lcd.print(charArray[text]);
  if (cls == true){
    lcd.clear();
  }
}
Men jag får detta felmeddelande hela tiden :(
TempLCD_FanController_V1.ino: In function 'void startUp()':
TempLCD_FanController_V1:46: error: 'lcdPrint' was not declared in this scope
Vad är fel, jag har läst på att det kan ha med arrayn att göra och att man ska använda passing by reference men jag har inte riktigt fattat vart och hur man implementerar det i koden...

Hjälp :/
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Funktionsanrop i Arduino....

Inlägg av sodjan »

Anropet hittar inte lcdPrint.
Se: http://arduino.cc/en/Reference/FunctionDeclaration
ToPNoTCH
Inlägg: 5144
Blev medlem: 21 december 2009, 17:59:48

Re: Funktionsanrop i Arduino....

Inlägg av ToPNoTCH »

Har du lagt kanske lagt funktionen innanför main loopen ?

Tror dessutom "rows" kan vara ett namn som du inte bör använda. Det kompilerar med den variabeln, men den blir röd i gränssnittet vilket tyder på att det namnet används till annat.
JonLee
Inlägg: 12
Blev medlem: 17 november 2013, 20:34:26
Ort: Gideå, västernorrlands län
Kontakt:

Re: Funktionsanrop i Arduino....

Inlägg av JonLee »

Nu har jag dubbelcheckat och vridit runt överallt efter något felkomma, felplacerat eller så men det finns inte. Jag använder samma typ av funktionsanrop ifrån andra ställen och det fungerar perfekt.

Dock börjar jag fundera, visst ska jag kunna skicka ett tal direkt utan att först lagra den i en variabel? som i mitt anrop där jag helt enkelt bara skriver tre nollor efter varandra...

Dom andra funktionerna jag har är variabeln globalt deklarerad och skickas med som argument, men jag trodde av det jag har läst på nu under gårdagen att det ska gå att skicka värden direkt också så länge som det finns en typdeklaration i anropat funktionshuvud...

Kod: Markera allt

void lcdPrint(int lcdRows, int lcdColums, int lcdText, float tempC, boolean cls = false)
hmm läste detta, kan detta ha med saken att göra?
To "call" our simple multiply function, we pass it parameters of the datatype that it is expecting:
Rätta mig om jag har fel men kräver anropet att alla variabler som jag deklarerar i funktionshuvudet ovan ska finnas med oavsett om jag inte behöver dom just då, för då förstår jag varför inte anropet fungerar :doh:
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: Funktionsanrop i Arduino....

Inlägg av Bosen »

Nä, det ska du inte behöva ha.
När jag får felmeddelande som liknar ditt, så har jag oftast glömt ett ; på någon rad eller ibland någon måsvinge. Det är bara att dubbelkolla koden.
JonLee
Inlägg: 12
Blev medlem: 17 november 2013, 20:34:26
Ort: Gideå, västernorrlands län
Kontakt:

Re: Funktionsanrop i Arduino....

Inlägg av JonLee »

Nä, det ska du inte behöva ha.
När jag får felmeddelande som liknar ditt, så har jag oftast glömt ett ; på någon rad eller ibland någon måsvinge. Det är bara att dubbelkolla koden.
Nopp har kollat och dubbelkollat, allt som behövs finns med i forma av måsvingar, komman osv... Om jag uncomment anrops raden så fungerar det att kompilera den, men inte om den raden är aktiv i koden. Så det känns som om det är fel på själva anropet ändå, frågan är bara vad??

Jag länkar ut hela koden så får vi se vom ni kanske upptäcker något, men skäll inte för mycket på mig om koden, den ska städas :D

Kod: Markera allt

// =========================================================================================================
// Programmer: Johnny (JonLee) Lindberg. Date: 20140309

// This program vill controll and show the Watercooling system for my computer, fully built it vill 
// have 8 fans, 2 waterpumps, 4 tempsensors, 2 waterflow sensors, 2 waterleakage sensors and computer 
// controll on/off switching. It will show all data on a I2C LCD 4*20 display. 

// It will take a start button event and checks if all waterpumps, fans start and flows/spins as 
// expected if so it will trigger the computer to start and thereafter keep track of temp, waterflows 
// and fan speed for the cooler. if any of these get out of range it will take a security shutdown and 
// alarm with a buzzer and show what data that went out of range. It will also keep track of normal 
// computer shutdown so when it shutsdown if temp is to high it will run cooling untill it is within 
// given parameters.
// ========================================================================================================
// Including librarys
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

// Data wire is plugged into port 3 on the Arduino
#define ONE_WIRE_BUS 3
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
// Declare variables
float tempC;
float fanTempMax = 24.00;
int fanSpeedMin = 80;
int fanSpeedMax = 255;
int FANpin = 5;
boolean firstRun = true;
char* myText[] = {"JonLee Cooler", "Checking FAN...", "Done... OK"};
int myTimers[] = {1000, 3000, 5000};
// Enable and initialize LCD
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void setup(void)
{
  // Start up the library
  sensors.begin();
  // Setup rows and colums for LCD
  lcd.begin(16, 2);
}

// Mainlopp, this function lopp for eternity, calling other functions, code or 
// just freezing due to bad coding :/
void loop(void)
{ 
  // Call startup function, checking voltage, fans, water and temp sensors
  if (firstRun == true)
  {
    startUp();
    firstRun = !firstRun;
  }
  // Call for temp function to mesure and print out values.
  getTemp(); 
  // Call for timerDelay for getting temperatur.
  tempGetTimer();
}

// Startup function, checking all data and sensors.
void startUp()
{
  lcdPrint(0, 0, 0);
  //lcd.setCursor(0, 0);
  //lcd.print("MADZerQ Cooling");
  lcdPrint(0, 1, 1);
  //lcd.setCursor(0, 1);
  //lcd.print("Checking FAN...");
  analogWrite(FANpin, fanSpeedMax);
  delay(myTimers[2]);
  analogWrite(FANpin, fanSpeedMin);
  lcd.setCursor(0, 1);
  lcd.print("DONE... OK");
  delay(myTimers[2]);
  lcd.clear();
}

// Temp mesurement function, collects temp data from dallas 1 wire interface
float getTemp()
{
  lcd.setCursor(0, 0);
  lcd.print("Getting Temp...");
  sensors.requestTemperatures();
  tempC = sensors.getTempCByIndex(0);
  lcdWriter(tempC);
  fanController(tempC);
  
}

// FAN controller function, starts or stop FANS connected if temp is to high.
void fanController(float fanTemp)
{
  if (fanTemp >= fanTempMax)
  {
    lcd.setCursor(0, 0);
    lcd.print("HOT! FAN rews up");
    analogWrite(FANpin, fanSpeedMax);
  }
  else
  {
    lcd.setCursor(0, 0);
    lcd.print("COLD! FAN slows");
    analogWrite(FANpin, fanSpeedMin);
  }
}

// function to write data to LCD display, this one writes tempvalues
void lcdWriter(float lcdTemp)
{
  lcd.setCursor(0, 1);
  lcd.print("Temp is:");
  lcd.setCursor(9, 1);
  lcd.print(lcdTemp);
  lcd.setCursor(14, 1);
  lcd.print("C");
}

// function to show timer countdown before next tempmesurement, will be removed in release version
void tempGetTimer()
{
  delay(myTimers[1]);
  lcd.setCursor(0, 0);
  lcd.print("Waiting:");
  lcd.setCursor(8, 0);
  lcd.print("         ");
  for (int t = 25; t > 0; t--)
  {
    if (t <= 9)
    {
      lcd.setCursor(9, 0);
      lcd.print(" ");
      lcd.setCursor(10, 0);
      lcd.print(t);
    }
    else
    {
      lcd.setCursor(9, 0);
      lcd.print(t);
    }
    lcd.setCursor(12, 0);
    lcd.print("sec");
    delay(myTimers[0]);
  }
}

// Print function for LCD use...
void lcdPrint(int lcdRows, int lcdColums, int lcdText, float lcdTemp, boolean cls = false)
{
  lcd.setCursor(lcdRows, lcdColums);
  lcd.print(myText[lcdText]);
  if (cls == true)
  {
    lcd.clear();
  }
}
Användarvisningsbild
JonasJ
Inlägg: 653
Blev medlem: 11 september 2007, 16:02:26
Ort: Kinna
Kontakt:

Re: Funktionsanrop i Arduino....

Inlägg av JonasJ »

Du anropar med 3 parametrar men funktionen förväntar sig 4 st.

Kod: Markera allt

lcdPrint(0, 0, 0);

Kod: Markera allt

void lcdPrint(int lcdRows, int lcdColums, int lcdText, float lcdTemp, boolean cls = false)
sedan har du även detta med default parametrar som inte riktigt verkar fungera i Arduino-världen:
http://forum.arduino.cc/index.php/topic,40799.0.html

Lägger jag till en nolla på anropet och tar bort default-parametern får jag det att kompilera.
JonLee
Inlägg: 12
Blev medlem: 17 november 2013, 20:34:26
Ort: Gideå, västernorrlands län
Kontakt:

Re: Funktionsanrop i Arduino.... [LÖST]

Inlägg av JonLee »

sedan har du även detta med default parametrar som inte riktigt verkar fungera i Arduino-världen:
http://forum.arduino.cc/index.php/topic,40799.0.html

Lägger jag till en nolla på anropet och tar bort default-parametern får jag det att kompilera.
Mm provade nu och det fungerade, tänkte inte på det :oops: , ibland behövs det fler ögon att se med...

Så bökigt, mycket enklare om den hade fungerat med default värden i funktionshuvudet... men jag är van vid Python och där går det att göra så, default ändras om det kommer ett värde in annars används default.

Men jag tackar så mycket för hjälpen :D Heder till dig... :bravo:
Användarvisningsbild
mri
Inlägg: 1165
Blev medlem: 15 mars 2007, 13:20:50
Ort: Jakobstad, Finland
Kontakt:

Re: Funktionsanrop i Arduino....

Inlägg av mri »

Jag gissar problemet var att du inte hade nån funktionsprototyp var funktionsargument och defaultvärdet framgick, före själva funktionsanropet.
Nerre
Inlägg: 27210
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Funktionsanrop i Arduino....

Inlägg av Nerre »

Det är väl så enkelt som att

void foo(int a)

inte är samma funktion som

void foo(int a, int b)
Användarvisningsbild
Icecap
Inlägg: 26638
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Funktionsanrop i Arduino....

Inlägg av Icecap »

JonLee: I C finns inte overloaded funktioner, det finns i C++. Grejen är att det är bättre att använda korrekt syntax för det aktuella språket än att anta att "alla är lika" och "det borde vara...".

Många funktioner är mycket lika mellan olika språk, helt enkelt för att man behöver dom, detta betyder dock inte att syntax är identisk.
Användarvisningsbild
mri
Inlägg: 1165
Blev medlem: 15 mars 2007, 13:20:50
Ort: Jakobstad, Finland
Kontakt:

Re: Funktionsanrop i Arduino....

Inlägg av mri »

Men nu är det ju Arduino tråden handlar om och då är det C++
Användarvisningsbild
Icecap
Inlägg: 26638
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Funktionsanrop i Arduino....

Inlägg av Icecap »

mri: konstigt - alla som använder skiten påstår att det minsann är standard C som gäller! Har du en specialpaket mjukvara - eller har du bara fel? Eller ljuger alla andra användare?
Användarvisningsbild
Wedge
Inlägg: 1026
Blev medlem: 8 juli 2012, 17:33:33

Re: Funktionsanrop i Arduino....

Inlägg av Wedge »

Sorry, Icecap, det är C++.
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Funktionsanrop i Arduino....

Inlägg av sodjan »

Varken C eller C++ är Python, som referensen var till.

> men jag är van vid Python....
Skriv svar