Go Down

Topic: passing argument to a function (Read 805 times) previous topic - next topic

Nicotiere

I tried to write a simple function reading temperature with a single argument as the probe address:

static byte sonde_Ballon[8] = {0x28 , 0xA5 , 0xDD , 0x5A ,  0x03 , 0x00 , 0x00 , 0x3C } ;

function: 
void getTemperature( byte Sonde) {

call:
getTemperature(*sonde_Ballon) ;
   I got these errors I don't really understand:

Monitor_Chaudiere.cpp: In function 'void getTemperature(byte)':
Monitor_Chaudiere.cpp:721:29: error: invalid conversion from 'byte' to 'const uint8_t*'
Monitor_Chaudiere.cpp:721:29: error:   initializing argument 1 of 'static uint8_t OneWire::crc8(const uint8_t*, uint8_t)'
Monitor_Chaudiere.cpp:721:41: error: invalid types 'byte[int]' for array subscript
Monitor_Chaudiere.cpp:722:12: error: return-statement with a value, in function returning 'void'
Monitor_Chaudiere.cpp:732:18: error: invalid conversion from 'byte' to 'const uint8_t*'
Monitor_Chaudiere.cpp:732:18: error:   initializing argument 1 of 'void OneWire::select(const uint8_t*)'
Monitor_Chaudiere.cpp:738:18: error: invalid conversion from 'byte' to 'const uint8_t*'
Monitor_Chaudiere.cpp:738:18: error:   initializing argument 1 of 'void OneWire::select(const uint8_t*)'
Monitor_Chaudiere.cpp:745:4: error: invalid type argument of unary '*'
Monitor_Chaudiere.cpp: At global scope:
Monitor_Chaudiere.cpp:841:1: error: expected declaration before '}' token
Is there a problem with the byte variable. I don't find good example on the web.
Thanks for your help


     

pYro_65

Make sure Arduino.h is included if this code isn't in the main sketch file, byte is declared in that header.

Those errors are from the code inside your function it looks like.

Post the code!

robtillaart

from the snippet you posted I assume you are using the Dallas Temperature Control Library

use getTemperature(sonde_Ballon);  // without the *

as getTemperature expects a pointer to the address array.
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Nicotiere

#3
Feb 16, 2014, 02:31 pm Last Edit: Feb 16, 2014, 06:29 pm by robtillaart Reason: 1
with Arduino.h included and without the * pointer I got these same  errors messages: Yes, I use DS18B20.

Monitor_Chaudiere.cpp: In function 'void getTemperature(byte)':
Monitor_Chaudiere.cpp:722:29: error: invalid conversion from 'byte' to 'const uint8_t*'
Monitor_Chaudiere.cpp:722:29: error:   initializing argument 1 of 'static uint8_t OneWire::crc8(const uint8_t*, uint8_t)'
Monitor_Chaudiere.cpp:722:41: error: invalid types 'byte[int]' for array subscript
Monitor_Chaudiere.cpp:723:12: error: return-statement with a value, in function returning 'void'
Monitor_Chaudiere.cpp:733:18: error: invalid conversion from 'byte' to 'const uint8_t*'
Monitor_Chaudiere.cpp:733:18: error:   initializing argument 1 of 'void OneWire::select(const uint8_t*)'
Monitor_Chaudiere.cpp:739:18: error: invalid conversion from 'byte' to 'const uint8_t*'
Monitor_Chaudiere.cpp:739:18: error:   initializing argument 1 of 'void OneWire::select(const uint8_t*)'
Monitor_Chaudiere.cpp:746:4: error: invalid type argument of unary '*'
Monitor_Chaudiere.cpp: In function 'void loop()':
Monitor_Chaudiere.cpp:814:33: error: invalid conversion from 'byte*' to 'byte'
Monitor_Chaudiere.cpp:814:33: error:   initializing argument 1 of 'void getTemperature(byte)'
Monitor_Chaudiere.cpp: At global scope:
Monitor_Chaudiere.cpp:842:1: error: expected declaration before '}' token

the complete subroutine is there:

Code: [Select]

void getTemperature( byte Sonde) {
   
// boolean getTemperature(float *temp)
 byte data[9], addr[8];
 // data : Données lues depuis le scratchpad
 // addr : adresse du module 1-Wire détecté
 
 
 if (OneWire::crc8(Sonde, 7) != Sonde[7]) // Vérifie que l'adresse a été correctement reçue
   return false;                        // Si le message est corrompu on retourne une erreur

 /* if (Sonde[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
   return false;         // Si ce n'est pas le cas on retourne une erreur
  // Serial.print("0x");
       for (int i=0; i<8; i++) {
         if (Sonde[i]<0x10) {Serial.print("0");}
         Serial.print(Sonde[i],HEX);
         Serial.print(" "); } */
 ds.reset();             // On reset le bus 1-Wire
 ds.select(Sonde);        // On sélectionne le DS18B20
 
 ds.write(0x44, 1);      // On lance une prise de mesure de température
 delay(800);             // Et on attend la fin de la mesure
 
 ds.reset();             // On reset le bus 1-Wire
 ds.select(Sonde);        // On sélectionne le DS18B20
 ds.write(0xBE);         // On envoie une demande de lecture du scratchpad

 for (byte i = 0; i < 9; i++) // On lit le scratchpad
   data[i] = ds.read();       // Et on stock les octets reçus
 
 // Calcul de la température en degré Celsius
 *temp = ((data[1] << 8) | data[0]) * 0.0625;
   
 // Pas d'erreur
 // return true;
}


this routine work perfectly without argument and  a  ds.select(address);  anyone ds18B20 plugged.

Thanks
Dominique

update moderator: added code tags

UKHeliBob

That code looks really pretty mostly in italics and the cool smiley makes a change from normal boring looking code too..
Please post it again in code tags as suggested in the stickies at the top of this forum.  That will stop it being mangled when it comes across
Code: [Select]
[i]in the code which turns on italics, and will prevent 
Code: [Select]
8) turning into a smiley.

Once we can read the code we may be able to give some help.
Please do not send me PMs asking for help.  Post in the forum then everyone will benefit from seeing the questions and answers.

Nicotiere

here is the example which works, followed bythe example which works:

Code: [Select]
#include <OneWire.h> // Inclusion de la librairie OneWire

#define DS18B20 0x28     // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 10 // Broche utilisée pour le bus 1-Wire

OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
byte sonde_Ballon[8] = {0x28 , 0xA5 , 0xDD , 0x5A ,  0x03 , 0x00 , 0x00 , 0x3C } ;

// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp){
  byte data[9], addr[8];
  // data : Données lues depuis le scratchpad
  // addr : adresse du module 1-Wire détecté
  if (!ds.search(sonde_Ballon)) {
    // Serial.println("pas trouvee") ;
   // if (!ds.search(addr)) { // Recherche un module 1-Wire
    ds.reset_search();    // Réinitialise la recherche de module
    return false;         // Retourne une erreur
  }
   
  if (OneWire::crc8(sonde_Ballon, 7) != sonde_Ballon[7]) // Vérifie que l'adresse a été correctement reçue
    return false;                        // Si le message est corrompu on retourne une erreur

  if (sonde_Ballon[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
    return false;         // Si ce n'est pas le cas on retourne une erreur
   // Serial.print("0x");
        for (int i=0; i<8; i++) {
          if (sonde_Ballon[i]<0x10) {Serial.print("0");}
          Serial.print(sonde_Ballon[i],HEX);
          Serial.print(" "); }
  ds.reset();             // On reset le bus 1-Wire
  ds.select(sonde_Ballon);        // On sélectionne le DS18B20
   
  ds.write(0x44, 1);      // On lance une prise de mesure de température
  delay(800);             // Et on attend la fin de la mesure
   
  ds.reset();             // On reset le bus 1-Wire
  ds.select(sonde_Ballon);        // On sélectionne le DS18B20
  ds.write(0xBE);         // On envoie une demande de lecture du scratchpad

  for (byte i = 0; i < 9; i++) // On lit le scratchpad
    data[i] = ds.read();       // Et on stock les octets reçus
   
  // Calcul de la température en degré Celsius
  *temp = ((data[1] << 8) | data[0]) * 0.0625;
   
  // Pas d'erreur
  return true;
}

// setup()
void setup() {
  Serial.begin(9600); // Initialisation du port série
}

// loop()
void loop() {
  float temp;
   
  // Lit la température ambiante à ~1Hz
  if(getTemperature(&temp)) {
     

and the exemple which works:
    // Affiche la température
    Serial.print("Temperature : ");
    Serial.print(temp);
    Serial.write(176); // caractère °
    Serial.write('C');
    Serial.println();
  }

and my routine, I just want to pass the id of DS18B20 as an argument:

[code]void getTemperature( byte Sonde) {
   
// boolean getTemperature(float *temp)
  byte data[9], addr[8];
  // data : Données lues depuis le scratchpad
  // addr : adresse du module 1-Wire détecté
 
   
  if (OneWire::crc8(Sonde, 7) != Sonde[7]) // Vérifie que l'adresse a été correctement reçue
    return false;                        // Si le message est corrompu on retourne une erreur

  /* if (Sonde[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
    return false;         // Si ce n'est pas le cas on retourne une erreur
   // Serial.print("0x");
        for (int i=0; i<8; i++) {
          if (Sonde[i]<0x10) {Serial.print("0");}
          Serial.print(Sonde[i],HEX);
          Serial.print(" "); } */
  ds.reset();             // On reset le bus 1-Wire
  ds.select(Sonde);        // On sélectionne le DS18B20
   
  ds.write(0x44, 1);      // On lance une prise de mesure de température
  delay(800);             // Et on attend la fin de la mesure
   
  ds.reset();             // On reset le bus 1-Wire
  ds.select(Sonde);        // On sélectionne le DS18B20
  ds.write(0xBE);         // On envoie une demande de lecture du scratchpad

  for (byte i = 0; i < 9; i++) // On lit le scratchpad
    data[i] = ds.read();       // Et on stock les octets reçus
   
  // Calcul de la température en degré Celsius
  *temp = ((data[1] << 8) | data[0]) * 0.0625;
   
  // Pas d'erreur
  // return true;
}

: [/code]

wildbill

Rather than:
Code: [Select]
void getTemperature( byte Sonde)
try:
Code: [Select]
void getTemperature( byte *Sonde)

Nicotiere

nothing new with *Sonde:

Monitor_Chaudiere.cpp: In function 'void getTemperature(byte*)':
Monitor_Chaudiere.cpp:722:12: error: return-statement with a value, in function returning 'void'
Monitor_Chaudiere.cpp:745:4: error: invalid type argument of unary '*'
Monitor_Chaudiere.cpp: In function 'void loop()':
Monitor_Chaudiere.cpp:813:34: error: invalid conversion from 'byte' to 'byte*'
Monitor_Chaudiere.cpp:813:34: error:   initializing argument 1 of 'void getTemperature(byte*)'
Monitor_Chaudiere.cpp: At global scope:
Monitor_Chaudiere.cpp:841:1: error: expected declaration before '}' token

wildbill

That's because you have unrelated errors. The first of them refers to trying to return a boolean from a function you've declared to be void rather than bool.

Nicotiere

sorry in the code I attached I mixed the example followed by my routine. In the example there is a return boolean but in my code there is not I comment.

wildbill

If you're still having trouble, probably best if you post your latest code.

PaulS

Quote
If you're still having trouble, probably best if you post your latest code.

All of it, and NOTHING else.

Nicotiere

code too big (>9500) I try to attach the  file .ino

wildbill

Still the same issue (among others):
Code: [Select]

void getTemperature( byte *Sonde) {
  byte data[9], addr[8];
  if (OneWire::crc8(Sonde, 7) != Sonde[7]) // Vérifie que l'adresse a été correctement reçue
    return false;                        // Si le message est corrompu on retourne une erreur


robtillaart

if you remove these 2 lines
Code: [Select]
  if (OneWire::crc8(Sonde, 7) != Sonde[7]) // Vérifie que l'adresse a été correctement reçue
    return false;                        // Si le message est corrompu on retourne une erreur

does it return a meaningful temperature?.
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Go Up