M2tklib show the value of a long variable

Hello, is it posible to show the value of a long variable in an lcd with the menu lib m2tk and u8glib.
Until now after the study of the examples i'm with the followng code.
The error message is:
invalid conversion from 'long int*' to 'uint32_t*'
Error compiling

#include "U8glib.h"
#include "M2tk.h"
#include "utility/m2ghu8g.h"

U8GLIB_KS0108_128 u8g(22, 23, 24, 25, 26, 27, 28, 29, 37, 33, 34, 36, 35);

uint8_t uiKeySelectPin = 2;
uint8_t uiKeyDownPin = 3;
uint8_t uiKeyUpPin = 4;
uint8_t uiKeyExitPin = 5;

long global_value = 123456;
M2_U32NUM(el_u8_cb, "c6", &global_value);


M2tk m2(&el_u8_cb, NULL, NULL, m2_gh_u8g_bfs);


void setup()
{
	
	// Connect u8glib with m2tklib
	m2_SetU8g(u8g.getU8g(), m2_u8g_box_icon);

	// Assign u8g font to index 0
	m2.setFont(0, u8g_font_6x12r);

	
	m2.setPin(M2_KEY_SELECT, uiKeySelectPin);
	m2.setPin(M2_KEY_NEXT, uiKeyDownPin);
	m2.setPin(M2_KEY_PREV, uiKeyUpPin);
	m2.setPin(M2_KEY_EXIT, uiKeyExitPin);
	
}

void draw(void) {
	m2.draw();
}


void loop()
{
	
	
	m2.checkKey();    
	if ( m2.handleKey() != 0 ) {
		u8g.firstPage();
		do {
			draw();
		} while( u8g.nextPage() );
	}
}

At the moment it is not possible to display negative 32 bit values. If your application just needs unsigned values, then replace

long global_value = 123456;

with

uint32_t global_value = 123456;

to avoid the error.

Oliver

I want to show in lcd the value of a sensor.

I have a procedure
long readPressure(){ } and a variable long middlePressure = readPressure();

How to show the variable middlePressure, did i have to do some conversions?

did i have to do some conversions?

Depends... If readPressure() will not return negative values, then you can use "uint32_t" instead of "long". No conversion is required. The uint32_t vaiable can be displayed by m2tklib.

Note: uint32_t identical to "unsigned long" on the AVR.

Oliver

I made changes from long to uint32_t but still get error.
In the following code i have the error:
cannot convert 'uint32_t*' to 'const char*' in initialization
Error compiling

#include "U8glib.h"
#include "M2tk.h"
#include "utility/m2ghu8g.h"
#include <Wire.h> //BMP085


//2.
U8GLIB_KS0108_128 u8g(22, 23, 24, 25, 26, 27, 28, 29, 37, 33, 34, 36, 35);


#define Image1_width 50
#define Image1_height 20

static unsigned char Image1_bits[] U8G_PROGMEM = {
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00,
	
	 };

#define BMP085_ADDRESS 0x77   // BMP085 - I2C address of BMP085
const unsigned char OSS = 3;  // BMP085 - Oversampling Setting

// BMP085 - Calibration values
int ac1;
int ac2;
int ac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
int b2;
int mb;
int mc;
int md;

long b5; // b5 is calculated in bmp085GetTemperature(...), this variable is also used in bmp085GetPressure(...)
// so ...Temperature(...) must be called before ...Pressure(...).


//3.
uint8_t uiKeySelectPin = 2;
uint8_t uiKeyDownPin = 3;
uint8_t uiKeyUpPin = 4;
uint8_t uiKeyExitPin = 5;

//4. 

#define MAIN_MENOU 1

//5
extern M2tk m2;

//6.
uint8_t state; 

//7.


void main_menu(){
	state = MAIN_MENOU;
	m2.clear();
}


uint32_t mesiPiesi = readPressure();
M2_LABEL(label,NULL,&mesiPiesi);

//8. 
M2tk m2(&label, NULL, NULL, m2_gh_u8g_bfs);

//9. 
void setup()
{
	introScreen();
	
	// Connect u8glib with m2tklib
  m2_SetU8g(u8g.getU8g(), m2_u8g_box_icon);

  // Assign u8g font to index 0
  m2.setFont(0, u8g_font_6x12r);

  
  m2.setPin(M2_KEY_SELECT, uiKeySelectPin);
  m2.setPin(M2_KEY_NEXT, uiKeyDownPin);
  m2.setPin(M2_KEY_PREV, uiKeyUpPin);
  m2.setPin(M2_KEY_EXIT, uiKeyExitPin);  
  
   
    
  state = MAIN_MENOU;
  
  Wire.begin(); // BMP085
  bmp085Calibration(); //BMP085
    
  }

//10.
void set_next_state(void) {
  switch(state) {
    case MAIN_MENOU:  break;
    }
}

//11. 
void draw(void) {
  m2.draw();
}

//12. 
void loop()
{
		
// menu management
  m2.checkKey();    /
  if ( m2.handleKey() != 0 ) { 
    u8g.firstPage();  
    do {
      draw();
    } while( u8g.nextPage() );
  }
set_next_state();
}

void introScreen() {    
    u8g.firstPage();  
    do {
        //u8g.drawBitmapP( 0, 0, 1, 8, rook_bitmap); //show image
        u8g.drawRFrame(0, 0, 128, 64, 10);
		 u8g.drawRFrame(1, 1, 126, 62, 10);
        u8g.setFont(u8g_font_7x13B);
        u8g.drawStr( 8, 40, "Project v1.0");
		u8g.drawXBMP( 38, 4, Image1_width, Image1_height, Image1_bits);
    } while( u8g.nextPage() );
   delay(5000);                          
}   

//BMP085 

void bmp085Calibration()
{
	ac1 = bmp085ReadInt(0xAA);
	ac2 = bmp085ReadInt(0xAC);
	ac3 = bmp085ReadInt(0xAE);
	ac4 = bmp085ReadInt(0xB0);
	ac5 = bmp085ReadInt(0xB2);
	ac6 = bmp085ReadInt(0xB4);
	b1 = bmp085ReadInt(0xB6);
	b2 = bmp085ReadInt(0xB8);
	mb = bmp085ReadInt(0xBA);
	mc = bmp085ReadInt(0xBC);
	md = bmp085ReadInt(0xBE);
}

// Calculate temperature in deg C
float bmp085GetTemperature(unsigned int ut){
	long x1, x2;

	x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
	x2 = ((long)mc << 11)/(x1 + md);
	b5 = x1 + x2;

	float temp = ((b5 + 8)>>4);
	temp = temp /10;

	return temp;
}

// Calculate pressure given up
// calibration values must be known
// b5 is also required so bmp085GetTemperature(...) must be called first.
// Value returned will be pressure in units of Pa.
long bmp085GetPressure(unsigned long up){
	long x1, x2, x3, b3, b6, p;
	unsigned long b4, b7;

	b6 = b5 - 4000;
	// Calculate B3
	x1 = (b2 * (b6 * b6)>>12)>>11;
	x2 = (ac2 * b6)>>11;
	x3 = x1 + x2;
	b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;

	// Calculate B4
	x1 = (ac3 * b6)>>13;
	x2 = (b1 * ((b6 * b6)>>12))>>16;
	x3 = ((x1 + x2) + 2)>>2;
	b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;

	b7 = ((unsigned long)(up - b3) * (50000>>OSS));
	if (b7 < 0x80000000)
	p = (b7<<1)/b4;
	else
	p = (b7/b4)<<1;

	x1 = (p>>8) * (p>>8);
	x1 = (x1 * 3038)>>16;
	x2 = (-7357 * p)>>16;
	p += (x1 + x2 + 3791)>>4;

	long temp = p;
	return temp;
}

// Read 1 byte from the BMP085 at 'address'
char bmp085Read(unsigned char address)
{
	unsigned char data;

	Wire.beginTransmission(BMP085_ADDRESS);
	Wire.write(address);
	Wire.endTransmission();

	Wire.requestFrom(BMP085_ADDRESS, 1);
	while(!Wire.available())
	;

	return Wire.read();
}

// Read 2 bytes from the BMP085
// First byte will be from 'address'
// Second byte will be from 'address'+1
int bmp085ReadInt(unsigned char address)
{
	unsigned char msb, lsb;

	Wire.beginTransmission(BMP085_ADDRESS);
	Wire.write(address);
	Wire.endTransmission();

	Wire.requestFrom(BMP085_ADDRESS, 2);
	while(Wire.available()<2)
	;
	msb = Wire.read();
	lsb = Wire.read();

	return (int) msb<<8 | lsb;
}

// Read the uncompensated temperature value
unsigned int bmp085ReadUT(){
	unsigned int ut;

	// Write 0x2E into Register 0xF4
	// This requests a temperature reading
	Wire.beginTransmission(BMP085_ADDRESS);
	Wire.write(0xF4);
	Wire.write(0x2E);
	Wire.endTransmission();

	// Wait at least 4.5ms
	delay(5);

	// Read two bytes from registers 0xF6 and 0xF7
	ut = bmp085ReadInt(0xF6);
	return ut;
}

// Read the uncompensated pressure value
unsigned long bmp085ReadUP(){

	unsigned char msb, lsb, xlsb;
	unsigned long up = 0;

	// Write 0x34+(OSS<<6) into register 0xF4
	// Request a pressure reading w/ oversampling setting
	Wire.beginTransmission(BMP085_ADDRESS);
	Wire.write(0xF4);
	Wire.write(0x34 + (OSS<<6));
	Wire.endTransmission();

	// Wait for conversion, delay time dependent on OSS
	delay(2 + (3<<OSS));

	// Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
	msb = bmp085Read(0xF6);
	lsb = bmp085Read(0xF7);
	xlsb = bmp085Read(0xF8);

	up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);

	return up;
}

void writeRegister(int deviceAddress, byte address, byte val) {
	Wire.beginTransmission(deviceAddress); // start transmission to device
	Wire.write(address);       // send register address
	Wire.write(val);         // send value to write
	Wire.endTransmission();     // end transmission
}

int readRegister(int deviceAddress, byte address){

	int v;
	Wire.beginTransmission(deviceAddress);
	Wire.write(address); // register to read
	Wire.endTransmission();

	Wire.requestFrom(deviceAddress, 1); // read a byte

	while(!Wire.available()) {
		// waiting
	}

	v = Wire.read();
	return v;
}

float calcAltitude(float pressure){

	float A = pressure/101325;
	float B = 1/5.25588;
	float C = pow(A,B);
	C = 1 - C;
	C = C /0.0000225577;

	return C;
}

uint32_t readPressure(){
	
	
	uint32_t sortedValues[100];
	
	
	memset(sortedValues,0,sizeof(sortedValues));
	
	
	for(int i=0;i<100;i++){
		uint32_t value = bmp085GetPressure(bmp085ReadUP());
		int j;
		if(value < sortedValues[0] || i==0){
			j=0; //insert at first position
		}
		else{
			for(j=1;j<i;j++){
				if(sortedValues[j-1]<=value && sortedValues[j]>=value){
					// j is insert position
					break;
				}
			}
		}
		for(int k=i;k>j;k--){
			//      // move all values higher than current reading up one position
			sortedValues[k]=sortedValues[k-1];
		}
		
		
		sortedValues[j]=value; //insert current reading
	}
	
	
              //return scaled mode of 10 values
	uint32_t returnval = 0;
	for(int i=45;i<(55);i++){
		returnval +=sortedValues[i];
	}
	returnval = returnval/10;
	return returnval;
}

Hi

Your initial question referes to a problem with M2_U32NUM(). To my best knowledge, i gave you all information to fix this.
In your last post M2_U32NUM is not included at all.

The new code and the related error is completly different. M2_LABEL expects a string pointer (as described by the error message). M2_LABEL can not show a value. It can only display a string. You must use M2_U32NUM to display (and optionally update) a number.

You could use

M2_U32NUM(el_u8_cb, "c6r1", &global_value);

to make the field read only.

Note: Once use see a message like cannot convert 'type A' to 'type B', then consult the documentation why type B is expected and think about how to convert it. Conversion between numbers (long to unsigned long) usually is easy, but conversion between 'long *' and 'char *' can be very complicated.

Oliver

Thank you oliver for the answers, you are very kind.
In the following code, i have no errors but nothing show in lcd.
I thing the problem may be in lines:

uint32_t temperature = bmp085GetTemperature(bmp085ReadUT()); //MUST be called first
uint32_t mesiPiesi = readPressure();
M2_U32NUM(el_u8_cb, "c6r1", &mesiPiesi);

Is there an opinion what goes wrong?

//1.
#include "U8glib.h"
#include "M2tk.h"
#include "utility/m2ghu8g.h"
#include <Wire.h> //BMP085


//2. constructor
U8GLIB_KS0108_128 u8g(22, 23, 24, 25, 26, 27, 28, 29, 37, 33, 34, 36, 35);

#define Image1_width 50
#define Image1_height 20

static unsigned char Image1_bits[] U8G_PROGMEM = {
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f,
	 };

#define BMP085_ADDRESS 0x77   // BMP085 - I2C address of BMP085
const unsigned char OSS = 3;  // BMP085 - Oversampling Setting

// BMP085 - Calibration values
int ac1;
int ac2;
int ac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
int b2;
int mb;
int mc;
int md;

uint32_t b5; // b5 is calculated in bmp085GetTemperature(...), this variable is also used in bmp085GetPressure(...)
// so ...Temperature(...) must be called before ...Pressure(...).



//3.
uint8_t uiKeySelectPin = 2;
uint8_t uiKeyDownPin = 3;
uint8_t uiKeyUpPin = 4;
uint8_t uiKeyExitPin = 5;

//4. 

#define MAIN_MENOU 1

//5.
extern M2tk m2;

//6.
uint8_t state; 

//7.

void main_menu(){
	state = MAIN_MENOU;
	m2.clear();
}


uint32_t temperature = bmp085GetTemperature(bmp085ReadUT()); //MUST be called first
uint32_t mesiPiesi = readPressure();
M2_U32NUM(el_u8_cb, "c6r1", &mesiPiesi);

//8. ????? ??? constructor ??? m2tklib
M2tk m2(&el_u8_cb, NULL, NULL, m2_gh_u8g_bfs);



//9. 
void setup()
{
	introScreen();
		// Connect u8glib with m2tklib
  m2_SetU8g(u8g.getU8g(), m2_u8g_box_icon);

  // Assign u8g font to index 0
  m2.setFont(0, u8g_font_6x12r);

  //????? ?? ???? ??? ???????? ?? ??? ?????? setPin
  m2.setPin(M2_KEY_SELECT, uiKeySelectPin);
  m2.setPin(M2_KEY_NEXT, uiKeyDownPin);
  m2.setPin(M2_KEY_PREV, uiKeyUpPin);
  m2.setPin(M2_KEY_EXIT, uiKeyExitPin);  
  
   
    
  state = MAIN_MENOU;
  
  Wire.begin(); // BMP085
  bmp085Calibration(); //BMP085
       
  }

//10.
void set_next_state(void) {
  switch(state) {
    case MAIN_MENOU:  break;
    }
}

//11. 
void draw(void) {
  m2.draw();
 }

//12. 
void loop()
{
  // menu management
  m2.checkKey();    
  if ( m2.handleKey() != 0 ) { 
    u8g.firstPage();  
    do {
      draw();
    } while( u8g.nextPage() );
  }
set_next_state();

}

void introScreen() {    
    u8g.firstPage();  
    do {
        u8g.drawRFrame(0, 0, 128, 64, 10);
		u8g.drawRFrame(1, 1, 126, 62, 10);
        u8g.setFont(u8g_font_7x13B);
        u8g.drawStr( 8, 40, "Project v1.0");
		u8g.drawXBMP( 38, 4, Image1_width, Image1_height, Image1_bits);
    } while( u8g.nextPage() );
   delay(5000);
                         
}   

//BMP085 SYNARTHSEIS

void bmp085Calibration()
{
	ac1 = bmp085ReadInt(0xAA);
	ac2 = bmp085ReadInt(0xAC);
	ac3 = bmp085ReadInt(0xAE);
	ac4 = bmp085ReadInt(0xB0);
	ac5 = bmp085ReadInt(0xB2);
	ac6 = bmp085ReadInt(0xB4);
	b1 = bmp085ReadInt(0xB6);
	b2 = bmp085ReadInt(0xB8);
	mb = bmp085ReadInt(0xBA);
	mc = bmp085ReadInt(0xBC);
	md = bmp085ReadInt(0xBE);
}

// Calculate temperature in deg C
float bmp085GetTemperature(unsigned int ut){
	long x1, x2;

	x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
	x2 = ((long)mc << 11)/(x1 + md);
	b5 = x1 + x2;

	float temp = ((b5 + 8)>>4);
	temp = temp /10;

	return temp;
}

// Calculate pressure given up
// calibration values must be known
// b5 is also required so bmp085GetTemperature(...) must be called first.
// Value returned will be pressure in units of Pa.
long bmp085GetPressure(unsigned long up){
	long x1, x2, x3, b3, b6, p;
	unsigned long b4, b7;

	b6 = b5 - 4000;
	// Calculate B3
	x1 = (b2 * (b6 * b6)>>12)>>11;
	x2 = (ac2 * b6)>>11;
	x3 = x1 + x2;
	b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;

	// Calculate B4
	x1 = (ac3 * b6)>>13;
	x2 = (b1 * ((b6 * b6)>>12))>>16;
	x3 = ((x1 + x2) + 2)>>2;
	b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;

	b7 = ((unsigned long)(up - b3) * (50000>>OSS));
	if (b7 < 0x80000000)
	p = (b7<<1)/b4;
	else
	p = (b7/b4)<<1;

	x1 = (p>>8) * (p>>8);
	x1 = (x1 * 3038)>>16;
	x2 = (-7357 * p)>>16;
	p += (x1 + x2 + 3791)>>4;

	long temp = p;
	return temp;
}

// Read 1 byte from the BMP085 at 'address'
char bmp085Read(unsigned char address)
{
	unsigned char data;

	Wire.beginTransmission(BMP085_ADDRESS);
	Wire.write(address);
	Wire.endTransmission();

	Wire.requestFrom(BMP085_ADDRESS, 1);
	while(!Wire.available())
	;

	return Wire.read();
}

// Read 2 bytes from the BMP085
// First byte will be from 'address'
// Second byte will be from 'address'+1
int bmp085ReadInt(unsigned char address)
{
	unsigned char msb, lsb;

	Wire.beginTransmission(BMP085_ADDRESS);
	Wire.write(address);
	Wire.endTransmission();

	Wire.requestFrom(BMP085_ADDRESS, 2);
	while(Wire.available()<2)
	;
	msb = Wire.read();
	lsb = Wire.read();

	return (int) msb<<8 | lsb;
}

// Read the uncompensated temperature value
unsigned int bmp085ReadUT(){
	unsigned int ut;

	// Write 0x2E into Register 0xF4
	// This requests a temperature reading
	Wire.beginTransmission(BMP085_ADDRESS);
	Wire.write(0xF4);
	Wire.write(0x2E);
	Wire.endTransmission();

	// Wait at least 4.5ms
	delay(5);

	// Read two bytes from registers 0xF6 and 0xF7
	ut = bmp085ReadInt(0xF6);
	return ut;
}

// Read the uncompensated pressure value
unsigned long bmp085ReadUP(){

	unsigned char msb, lsb, xlsb;
	unsigned long up = 0;

	// Write 0x34+(OSS<<6) into register 0xF4
	// Request a pressure reading w/ oversampling setting
	Wire.beginTransmission(BMP085_ADDRESS);
	Wire.write(0xF4);
	Wire.write(0x34 + (OSS<<6));
	Wire.endTransmission();

	// Wait for conversion, delay time dependent on OSS
	delay(2 + (3<<OSS));

	// Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
	msb = bmp085Read(0xF6);
	lsb = bmp085Read(0xF7);
	xlsb = bmp085Read(0xF8);

	up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);

	return up;
}

void writeRegister(int deviceAddress, byte address, byte val) {
	Wire.beginTransmission(deviceAddress); // start transmission to device
	Wire.write(address);       // send register address
	Wire.write(val);         // send value to write
	Wire.endTransmission();     // end transmission
}

int readRegister(int deviceAddress, byte address){

	int v;
	Wire.beginTransmission(deviceAddress);
	Wire.write(address); // register to read
	Wire.endTransmission();

	Wire.requestFrom(deviceAddress, 1); // read a byte

	while(!Wire.available()) {
		// waiting
	}

	v = Wire.read();
	return v;
}

float calcAltitude(float pressure){

	float A = pressure/101325;
	float B = 1/5.25588;
	float C = pow(A,B);
	C = 1 - C;
	C = C /0.0000225577;

	return C;
}

uint32_t readPressure(){
	
	long sortedValues[100];
	
	memset(sortedValues,0,sizeof(sortedValues));
	
	
	for(int i=0;i<100;i++){
		long value = bmp085GetPressure(bmp085ReadUP());
		int j;
		if(value < sortedValues[0] || i==0){
			j=0; //insert at first position
		}
		else{
			for(j=1;j<i;j++){
				if(sortedValues[j-1]<=value && sortedValues[j]>=value){
					// j is insert position
					break;
				}
			}
		}
		for(int k=i;k>j;k--){
			//      // move all values higher than current reading up one position
			sortedValues[k]=sortedValues[k-1];
		}
		
		
		sortedValues[j]=value; //insert current reading
	}
	
	
	//return scaled mode of 10 values
	uint32_t returnval = 0;
	for(int i=45;i<(55);i++){
		returnval +=sortedValues[i];
	}
	returnval = returnval/10;
	return returnval;
}

Hi

One reason could be, that some parameters for the m2tk are missing. Try this:

M2tk m2(&el_u8_cb,m2_es_arduino, m2_eh_4bs, m2_gh_u8g_bfs);

Oliver

Hello, i solved the problem.
I used a callback procedure.
Here is the code:

uint32_t global_value = 0;

uint32_t u32_cb(m2_rom_void_p element, uint8_t msg, uint32_t val)
{
	if ( msg == M2_U32_MSG_GET_VALUE )
	float temperature = bmp085GetTemperature(bmp085ReadUT()); //MUST be called first
	float pressure = bmp085GetPressure(bmp085ReadUP());
	float atm = pressure / 101325; // "standard atmosphere"
	float altitude = calcAltitude(pressure); //Uncompensated caculation - in Meters
	float mesiPiesi = readPressure();
	
	global_value = mesiPiesi;
	return global_value;
}

M2_U32NUMFN(el_u8_cb, "c6r1", u32_cb);

The only thing is that is very slow (about 2 minutes) the show of the numbers.
Perhaps something goes wrong with the calculation of the middle value with the procedure readPressure(), without that procedure the values show immediately.

Can you give as some extra information about the uint32_t u32_cb procedure.
Can you explain the arguments (m2_rom_void_p element, uint8_t msg, uint32_t val).

The callback procedure is called very often. It should be as fast as possible. Also: "{" and "}" are missing.

uint32_t global_value = 0;

uint32_t u32_cb(m2_rom_void_p element, uint8_t msg, uint32_t val)
{
	if ( msg == M2_U32_MSG_GET_VALUE )
        {
		float temperature = bmp085GetTemperature(bmp085ReadUT()); //MUST be called first
		float pressure = bmp085GetPressure(bmp085ReadUP());
		float atm = pressure / 101325; // "standard atmosphere"
		float altitude = calcAltitude(pressure); //Uncompensated caculation - in Meters
		float mesiPiesi = readPressure();
	
		global_value = mesiPiesi;
        }
	return global_value;
}

What i also do not understand: tmeperature, pressure, atm and altitude are not used at all. The code can be similified to

uint32_t global_value = 0;

uint32_t u32_cb(m2_rom_void_p element, uint8_t msg, uint32_t val)
{
	if ( msg == M2_U32_MSG_GET_VALUE )
        {
		float mesiPiesi = readPressure();
	
		global_value = mesiPiesi;
        }
	return global_value;
}

This should be faster.

Oliver

I thing the problem with the slow show of the numbers is that float numbers slow down arduino calculations, and my procedure readPressure do some calculations to find the middle value of the sensor.
The strange thing is that the same procedure show quite fast data in serial monitor.
Is there any hack in M2_U32NUMFN to manipulate float data faster.

The initial question of the topic solved. Thanks

Is there any hack in M2_U32NUMFN to manipulate float data faster.

Do the calculation outside the picture loop, that means, do not do any large calculation withint the callback. Instead to the calculation once, outside of M2tklib, store the result in a global variable and just return the value of that variable in the callback procedure.

Oliver