Verzenden van een waarde via nrf24l01
9 berichten
• Pagina 1 van 1
Verzenden van een waarde via nrf24l01
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:
De waarde die ik wil gaan verzenden is deze:
alleen als ik deze erin zit bij dan krijg ik een fotmelding..:
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?!
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
Re: Verzenden van een waarde via nrf24l01
De sensor_waarde:
Dus de analogRead op pin 5 wordt wel overgezonden middels NRF24l01.
Als ik van bovenstaande code de volgende maak:
Dan geeft hij de volgende code weer:
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?
- 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?
Re: Verzenden van een waarde via nrf24l01
Die functie heeft als parameter 'r'.
De naam 'r' geldt alleen binnen die functie voor die parameter. Je mag het iedere willekeurige naam geven.
Bij de aanroep gebruik ook je een variabele die 'r' heet. Die zou je een andere naam kunnen geven om verwarring te voorkomen:
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.
- 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.
Re: Verzenden van een waarde via nrf24l01
In de Void setup lukt dit inderdaad wel..
Kan iemand mij helpen hoe ik dit in de Void loop aan moet passen?
Als ik daar MyR gebruik dan werkt dit niet..
- 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..
Re: Verzenden van een waarde via nrf24l01
Misschien heb je per ongeluk een regel verwijderd.
Dan gaat het om deze regel:
De "float myR" declareert een variabele met de naam "myR" van het type "float". Vanaf dat moment kent de compiler die variabele.
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.
Re: Verzenden van een waarde via nrf24l01
Die heb ik er nog steeds in staan.
void setup staan:
En dit in de Loop:
En dan krijg ik deze foutcode:
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.
Re: Verzenden van een waarde via nrf24l01
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.
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 (13.25 KiB) 6128 keer bekeken
Re: Verzenden van een waarde via nrf24l01
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.
Maar dan ben ik er nog niet achter wat er fout is in die regel.
Re: Verzenden van een waarde via nrf24l01
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.
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.
9 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 24 gasten