Verzenden van een waarde via nrf24l01

Arduino specifieke Software
Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Verzenden van een waarde via nrf24l01

Berichtdoor DeDraak » 01 Mei 2017, 11:42

Hallo,

Ik heb na lang lopen puzzelen 2 sketches werkend gekregen in 1 sketch.
1 sketch is een temperatuuropnemer ET_73 waarbij Koepel mij vorig jaar heeft geholpen en de andere is een NRF2401 sketch om gegevens over te zenden.

Beide sketches werken apart prima maar nu ik ze samen heb gevoegd gaat het ook goed alleen lukt het mij niet om de juiste waarde door te zetten.
Kan iemand mij een zetje in de goede richting geven?
Dit is de samengevoegde sketch:
Code: Alles selecteren
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>

// we definieeren de structuur van het te sturen bericht (het envelopje met daarin de gegevens)
struct sensor_bericht
{
  unsigned long sensor_waarde;  // de uitgelezen sensor-waarde

};

RF24 radio(9, 10);      // nRF24L01(+) transceiver aangesloten met pins 9 en 10
RF24Network network(radio);   // netwerk definiëren

const uint16_t tweede_node = 2;   // adres van onze (sensor) node
const uint16_t andere_node = 0; // adres van de andere (ontvanger) node
const unsigned long interval = 5000; //om de hoeveel tijd we de sensorwaarde naar de ontvanger node sturen (2 seconden)
unsigned long tijd_laatste_bericht;  // wanneer we voor het laatste een bericht hebben gestuurd


// Measured values
const float measured_T[] =
{ 0,      20,     40,     60,    80,    100,   120,    140,    160,     180,     200,    220, 240, 250 };
const float measured_R[] =
{ 750E+3, 300E+3, 120E+3, 52E+3, 25E+3, 13E+3, 7.5E+3, 4.1E+3, 2.48E+3, 1.56E+3, 1.0E+3, 680, 480, 400 };


// Using: http://www.thinksrs.com/downloads/programs/Therm%20Calc/NTCCalibrator/NTCcalculator.htm
// With the measured values at 0, 100, 250 degrees:
//    A = 0.6742E-3, B = 2.030E-4, C = 0.9711E-7, beta = 4133K
const float A = 0.6742E-3;
const float B = 2.030E-4;
const float C = 0.9711E-7;
const float beta = 4133.22;   // This is the 'beta', not the 'B'.

// The resistance at 25 degrees is also taken from that thinksrs page.
const float ntc_nominal_T = 25.0;
const float ntc_nominal_R = 210876.87;        // It is probably a 210k NTC resistor

// Pins
const int probePin = A5;

// Values for the series resistor to 5V
const float series_resistor = 22E+3;      // 22k


void setup()
{
  Serial.begin( 57600);
  SPI.begin();
  radio.begin();
  network.begin(/*kanaal*/ 90, /*node adres*/ tweede_node);
  Serial.println();
  Serial.println(F( "\nET-73"));
  Serial.println(F( "-------"));

  for ( int i = 0; i < sizeof(measured_T) / sizeof(float); i++)
  {
    Serial.print(F( "T = "));
    Serial.print( measured_T[i]);
    Serial.print(F( ", R = "));
    Serial.print( measured_R[i]);

    // Calculate what the ADC value would be with this resistor value.
    // Simulate the ADC, by rounding to lower integer with floor().
    float adc = floor( measured_R[i] / (measured_R[i] + series_resistor) * 1024.0);

    // Calculate the resistance value of the NTC thermistor
    float r  = series_resistor / ((1024.0 / (adc + 0.5)) - 1.0);

    Serial.print(F( ", Simple = "));
    Serial.print( SimpleBeta( r));



    if ( adc < 2 || adc > 1021)
      Serial.print(F( "  out of range"));

    Serial.println();
  }
  Serial.println();
}


void loop()
{
// houdt het netwerk aan de gang
  network.update();
  unsigned long tijd_nu = millis();
  RF24NetworkHeader header(/*naar node*/ andere_node);
  unsigned long sensor_waarde = analogRead( A5 );               ////dit wordt verzonden
  sensor_bericht bericht = {sensor_waarde };
  bool ok = network.write(header, &bericht, sizeof(bericht));
  tijd_laatste_bericht = millis();


  // Measure the real temperature.
  // Calculate the resistance value of the NTC thermistor
  float adc = getADC( probePin);
  float r  = series_resistor / ((1024.0 / (adc + 0.5)) - 1.0);

  //Serial.print(F( "R = "));
  //Serial.print( r);
  Serial.print(F( "Temp = "));
  Serial.print(SimpleBeta( r));


  if ( adc < 2.0 || adc > 1021.0)
    Serial.print(F( "  out of range"));

  Serial.println();
Serial.print("sensor_waarde:");
Serial.println(sensor_waarde);         //Serial.print(sensor_waarde);

delay(2000);   

}

// getADC
// ------
// This function returns the adc value as a float.
// It is ment for the ATmega chips with 10-bits ADC.
// Because the average is used, a little noise could increase
// the number of bits. Therefor a float number is returned.
//
float getADC( int pin)
{
  // About 60 samples fit into a unsigned int.
  // Therefor the 'n' should be not above 60.
  int n = 1;                      // maximum 60 was 20
  unsigned int total = 0;
  for ( int i = 0; i < n; i++)
  {
    total += analogRead( pin);
  }
  float adc = (float) total / (float) n;
  return ( adc);
}

// SimpleBeta
// ----------
// Calculate the temperature of a NTC thermistor.
// Calculation as shown at https://learn.adafruit.com/thermistor/using-a-thermistor
// And here : https://en.wikipedia.org/wiki/Thermistor
// The simplified Beta parameter equation is used.
//
// The voltage at the pin is (rawADC + 0.5) * Vcc / 1024.
// Therefor I use "1024" instead of the "1023" in the Adafruit page.
//
float SimpleBeta( float r)

{
  float t1 = (1.0 / (ntc_nominal_T + 273.15)) + (log( r / ntc_nominal_R) / beta);
  return ( (1.0 / t1) - 272.15); //was 273.15 
}





De waarde die ik wil gaan verzenden is deze:
Code: Alles selecteren
 Serial.print( SimpleBeta( r));


alleen als ik deze erin zit bij dan krijg ik een fotmelding..:

Code: Alles selecteren
unsigned long sensor_waarde = analogRead( A5 );


Ik heb de analogRead( A5 ); dus vervangen voor SimpleBeta( r) en dat gaat niet goed.
Waarschijnlijk moet ik die weer omzetten naar een andere variabele ofzo maar ik ben hem even kwijt?!

Advertisement

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Verzenden van een waarde via nrf24l01

Berichtdoor DeDraak » 03 Mei 2017, 13:36

De sensor_waarde:
Code: Alles selecteren
unsigned long sensor_waarde = analogRead( A5 );


Dus de analogRead op pin 5 wordt wel overgezonden middels NRF24l01.
Als ik van bovenstaande code de volgende maak:
Code: Alles selecteren
unsigned long sensor_waarde = SimpleBeta(r);


Dan geeft hij de volgende code weer:
Code: Alles selecteren
Arduino: 1.6.12 (Windows 7), Board:"Arduino/Genuino Uno"

C:\Users\Beheerder\Documents\Arduino\Test_Zaterdag\Test_Zaterdag.ino: In function 'void loop()':

Test_Zaterdag:93: error: 'r' was not declared in this scope

   unsigned long sensor_waarde = SimpleBeta( r); 

                                             ^

exit status 1
'r' was not declared in this scope

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.


Die Simple(r); geeft in mijn seriele poort wel de waarde aan die ik verzonden wil hebben..

Kan iemand mij vertellen wat er mis gaat?

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Verzenden van een waarde via nrf24l01

Berichtdoor Koepel » 03 Mei 2017, 13:43

Die functie heeft als parameter 'r'.
Code: Alles selecteren
float SimpleBeta( float r)
{
  float t1 = (1.0 / (ntc_nominal_T + 273.15)) + (log( r / ntc_nominal_R) / beta);
  return ( (1.0 / t1) - 272.15); //was 273.15
}

De naam 'r' geldt alleen binnen die functie voor die parameter. Je mag het iedere willekeurige naam geven.
Code: Alles selecteren
float SimpleBeta( float dinosauriers_zijn_cool)
{
  float t1 = (1.0 / (ntc_nominal_T + 273.15)) + (log( dinosauriers_zijn_cool / ntc_nominal_R) / beta);
  return ( (1.0 / t1) - 272.15); //was 273.15
}



Bij de aanroep gebruik ook je een variabele die 'r' heet. Die zou je een andere naam kunnen geven om verwarring te voorkomen:
Code: Alles selecteren
    // Calculate the resistance value of the NTC thermistor
    float myR  = series_resistor / ((1024.0 / (adc + 0.5)) - 1.0);

    Serial.print(F( ", Simple = "));
    Serial.print( SimpleBeta( myR));


De compiler zegt dat bij de aanroep de variabele 'r' helemaal niet bestaat. Dus als je die functie aanroept, gebruik dan een variabele die wel bestaat.

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Verzenden van een waarde via nrf24l01

Berichtdoor DeDraak » 08 Mei 2017, 12:59

In de Void setup lukt dit inderdaad wel..

Code: Alles selecteren
// Calculate the resistance value of the NTC thermistor
    float myR  = series_resistor / ((1024.0 / (adc + 0.5)) - 1.0);

    Serial.print(F( ", Simple = "));
    Serial.print( SimpleBeta( myR));


Kan iemand mij helpen hoe ik dit in de Void loop aan moet passen?
Als ik daar MyR gebruik dan werkt dit niet..

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Verzenden van een waarde via nrf24l01

Berichtdoor Koepel » 08 Mei 2017, 14:41

Misschien heb je per ongeluk een regel verwijderd.
Dan gaat het om deze regel:
Code: Alles selecteren
float myR  = series_resistor / ((1024.0 / (adc + 0.5)) - 1.0);

De "float myR" declareert een variabele met de naam "myR" van het type "float". Vanaf dat moment kent de compiler die variabele.

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Verzenden van een waarde via nrf24l01

Berichtdoor DeDraak » 08 Mei 2017, 15:37

Die heb ik er nog steeds in staan.

void setup staan:
Code: Alles selecteren
void setup()
{
  Serial.begin( 57600);
  SPI.begin();
  radio.begin();
  network.begin(/*kanaal*/ 90, /*node adres*/ tweede_node);
  Serial.println();
  Serial.println(F( "\nET-73"));
  Serial.println(F( "-------"));

  for ( int i = 0; i < sizeof(measured_T) / sizeof(float); i++)
  {
    Serial.print(F( "T = "));
    Serial.print( measured_T[i]);
    Serial.print(F( ", R = "));
    Serial.print( measured_R[i]);

    // Calculate what the ADC value would be with this resistor value.
    // Simulate the ADC, by rounding to lower integer with floor().
    float adc = floor( measured_R[i] / (measured_R[i] + series_resistor) * 1024.0);

    // Calculate the resistance value of the NTC thermistor
    float Myr  = series_resistor / ((1024.0 / (adc + 0.5)) - 1.0);

    Serial.print(F( ", Simple = "));
    Serial.print( SimpleBeta( Myr));



    if ( adc < 2 || adc > 1021)
      Serial.print(F( "  out of range"));

    Serial.println();
  }
  Serial.println();
}


En dit in de Loop:
Code: Alles selecteren
void loop()
{
// houdt het netwerk aan de gang
  network.update();
  unsigned long tijd_nu = millis();
  RF24NetworkHeader header(/*naar node*/ andere_node);
  //unsigned long sensor_waarde = analogRead( A5 );               ////dit wordt verzonden
  unsigned long sensor_waarde = SimpleBeta( Myr);
  sensor_bericht bericht = {sensor_waarde };
  bool ok = network.write(header, &bericht, sizeof(bericht));
  if (ok) Serial.println("OK ");
  else Serial.println("Failed");

  tijd_laatste_bericht = millis();


  // Measure the real temperature.
  // Calculate the resistance value of the NTC thermistor
  float adc = getADC( probePin);
  float r  = series_resistor / ((1024.0 / (adc + 0.5)) - 1.0);

  //Serial.print(F( "R = "));
  //Serial.print( r);
  Serial.print(F( "Temp = "));
  Serial.print(SimpleBeta( r));


  if ( adc < 2.0 || adc > 1021.0)
    Serial.print(F( "  out of range"));

  Serial.println();
Serial.print("sensor_waarde:");
Serial.println(sensor_waarde);         //Serial.print(sensor_waarde);


delay(2000);   

}

// getADC
// ------
// This function returns the adc value as a float.
// It is ment for the ATmega chips with 10-bits ADC.
// Because the average is used, a little noise could increase
// the number of bits. Therefor a float number is returned.
//
float getADC( int pin)
{
  // About 60 samples fit into a unsigned int.
  // Therefor the 'n' should be not above 60.
  int n = 1;                      // maximum 60 was 20
  unsigned int total = 0;
  for ( int i = 0; i < n; i++)
  {
    total += analogRead( pin);
  }
  float adc = (float) total / (float) n;
  return ( adc);
}

// SimpleBeta
// ----------
// Calculate the temperature of a NTC thermistor.
// Calculation as shown at https://learn.adafruit.com/thermistor/using-a-thermistor
// And here : https://en.wikipedia.org/wiki/Thermistor
// The simplified Beta parameter equation is used.
//
// The voltage at the pin is (rawADC + 0.5) * Vcc / 1024.
// Therefor I use "1024" instead of the "1023" in the Adafruit page.
//
float SimpleBeta( float r)

{
  float t1 = (1.0 / (ntc_nominal_T + 273.15)) + (log( r / ntc_nominal_R) / beta);
  return ( (1.0 / t1) - 272.15); //was 273.15 
}


En dan krijg ik deze foutcode:
Code: Alles selecteren
Arduino: 1.6.12 (Windows 7), Board:"Arduino/Genuino Uno"

C:\Users\Beheerder\Documents\Arduino\Test_Zaterdag\Test_Zaterdag.ino: In function 'void loop()':

Test_Zaterdag:92: error: 'Myr' was not declared in this scope

   unsigned long sensor_waarde = SimpleBeta( Myr);

                                             ^

exit status 1
'Myr' was not declared in this scope

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Verzenden van een waarde via nrf24l01

Berichtdoor Koepel » 08 Mei 2017, 17:59

Je kunt bij de voorkeuren de regelnummers aanzetten. De compiler geeft het regelnummer waar het probleem zit.
Heb je Arduino IDE 1.8.2 ? dan wordt ook de regel gemarkeerd met een andere kleur.
Je kunt ook zoeken binnen een sketch, dus je kunt zoeken naar "Myr", totdat je er eentje ziet die verdacht is.
Bijlagen
Myr.png
Myr.png (13.25 KiB) 5953 keer bekeken

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Verzenden van een waarde via nrf24l01

Berichtdoor DeDraak » 09 Mei 2017, 09:14

Zover was ik al Koepel, ik heb IDE 1.8.2, en geeft inderdaad op die regel de foutcode.
Maar dan ben ik er nog niet achter wat er fout is in die regel.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Verzenden van een waarde via nrf24l01

Berichtdoor Koepel » 09 Mei 2017, 09:37

De variabele 'Myr' is nog niet gedeclareerd, en bestaat dus nog niet.

Weet je wat de 'scope' van een variabele is ? Dat is waar een variabele bekend is bij de compiler.
Een globale variabele (boven de setup() functie) is overal bekend.
Een lokale variabele is alleen binnen een functie bekend, en niet daarbuiten.
Bij een if-statement kan binnen het if-statement ook nieuwe variabelen gemaakt worden, die is dan alleen binnen het if-statement bekend.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Google [Bot], ihajinizul, iselaperawe, Majestic-12 [Bot] en 26 gasten