milli() est bien sûr la première optimisation à faire.
Néanmoins, à terme mon code devra à la fois (en tâches principales) :
- interpréter les commandes du clavier.
- lire la température de 1 ou 2 capteurs DS1820
- communiquer via CAN ou RS485 vers d'autres cartes.
Donc je m'interroge sur l'organisation de mon code, car les séquences de
lecture OneWire et lecture/écriture RS485 ne doivent pas être interrompues.
En même temps, je dois garder une réactivité du clavier.
Sur mon ancien µ Motorola, je bouclais en continue sur une lecture clavier,
et je lançais régulièrement des routines de scrutation des entrées via la RTI
(toutes les xx ms).
Avec la durée de lecture DS1820 et RS485, je suis un peu perdu...
Mon code pas optimisé du tout :-[
void loop()
{
//---------------------------------------------------------------------------//
// ONEWIRE DS1820 read
byte i, sensor;
byte present = 0;
byte data[12];
for (sensor=0;sensor<MAX_DS1820_SENSORS;sensor++)
{
if ( OneWire::crc8( addr[sensor], 7) != addr[sensor][7])
{
GLCD.GotoXY(60, 40);
GLCD.Puts("CRC is not valid"); // print a text string
return;
}
if ( addr[sensor][0] != 0x10)
{
GLCD.GotoXY(60, 40);
GLCD.Puts("Device is not a DS18S20 family device."); // print a text string
return;
}
ds.reset();
ds.select(addr[sensor]);
ds.write(0x44,1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr[sensor]);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++)
{ // we need 9 bytes
data[i] = ds.read();
}
LowByte = data[0];
HighByte = data[1];
TReading = (HighByte << 8) + LowByte;
SignBit = TReading & 0x8000; // test most sig bit
if (SignBit) // negative
{
TReading = (TReading ^ 0xffff) + 1; // 2's comp
}
Tc_100 = (TReading*100/2);
Whole = Tc_100 / 100; // separate off the whole and fractional portions
Fract = Tc_100 % 100;
// sprintf(buf, "%d:%c%d.%d\337C",sensor,SignBit ? '-' : '+', Whole, Fract < 10 ? 0 : Fract);
sprintf(buf, "%c%d.%d\337",SignBit ? '-' : '+', Whole, Fract/10);
//---------------------------------------------------------------------------//
// DISPLAY DS1820 temp
GLCD.CursorToXY(40, 40);
GLCD.Puts("T= "); // print a text string
GLCD.Puts(buf); // print a number
GLCD.CursorToXY(94, 40);
GLCD.Puts("C");
}
//---------------------------------------------------------------------------//
// KEYPAD read
char customKey = customKeypad.getKey();
if (customKey != NO_KEY){
Serial.println(customKey);
}
}
)