Запись в EEPROM , формат float - прошу проверить
- Войдите на сайт для отправки комментариев
Чт, 10/03/2016 - 21:54
#include <OneWire.h> #include <EEPROM.h> #include "Struct.h" #define yes_Serial 1 #define yes_EEPROM 1 OneWire DS ( 6 ); byte data[ 12 ]; byte addr_OUT_heater[ 8 ] = { 0x28 , 0xFF , 0x80 , 0xB0 , 0x66 , 0x14 , 0x03 , 0x53 }; // датчик подачи byte addr_IN_heater[ 8 ] = { 0x28 , 0xFF , 0xF8 , 0x68 , 0x63 , 0x14 , 0x02 , 0x76 }; // датчик обратки byte addr_OUT_side[ 8 ] = { 0x28 , 0xFF , 0x86 , 0x69 , 0x63 , 0x14 , 0x02 , 0x36 }; // датчик уличный #define pin_Relay 4 // пин на реле управления котлом ( включить - LOW , выключить - HIGH ) #define pin_RF_air 5 // пин от реле управления котлом по воздуху ( LOW - включено , HIGH - выключено ) #define pin_Led_Green A0 // индикация опроса датчиков температуры ( включить - LOW , выключить - HIGH ) #define pin_Led_Blue A1 // индикация контроля по воде ( включить - LOW , выключить - HIGH ) #define pin_Led_Red A2 // индикация контроля по воздуху ( включить - LOW , выключить - HIGH ) #ifdef yes_EEPROM float Set_T[] = { 27.0 , 28.0 , 29.0 , 30.0 , 0.0 , -30.0 , 10.0 }; #endif //================================================================================== void setup() { #ifdef yes_Serial Serial.begin( 115200 ); #endif pinMode( pin_Relay , OUTPUT ); digitalWrite( pin_Relay , HIGH ); pinMode( pin_RF_air , INPUT ); digitalWrite( pin_RF_air , HIGH ); pinMode( pin_Led_Green , OUTPUT ); digitalWrite( pin_Led_Green , HIGH ); pinMode( pin_Led_Blue , OUTPUT ); digitalWrite( pin_Led_Blue , HIGH ); pinMode( pin_Led_Red , OUTPUT ); digitalWrite( pin_Led_Red , HIGH ); #ifdef yes_EEPROM Pre_load_set_EEPROM(); #endif } //================================================================================== // Предзагрузка установок в EEPROM ( float ) //================================================================================== void Pre_load_set_EEPROM() { for ( byte i = 0; i < 7; i++ ) { byte raw[ 4 ]; ( float&) raw = Set_T[ i ]; for ( byte n = 0; n < 4; n++) { EEPROM.write( n + i * 4 , raw[ n ] ); } } } //================================================================================== // Считывание температуры //================================================================================== float read_DS( byte *adress ) { unsigned int raw; DS.reset(); DS.select( adress ); DS.write( 0x44 , 1 ); // delay( 740 ); delay( 990 ); digitalWrite( pin_Led_Green , LOW ); delay( 10 ); digitalWrite( pin_Led_Green , HIGH ); DS.reset(); DS.select( adress ); DS.write( 0xBE ); for ( byte i = 0; i < 9; i++ ) { data[ i ] = DS.read(); } raw = ( data[ 1 ] << 8 ) | data[ 0 ]; float celsius = ( float ) raw / 16.0; return celsius; } //================================================================================== void loop() { // структура данных // struct Buffer // { // float t_OUT_heater; // float t_IN_heater; // float t_OUT_side; // float set_T_water_MIN; // float set_T_water_MAX; // float set_T_air_MIN; // float set_T_air_MAX; // float set_Curve_MIN; // float set_Curve_MAX; // float set_Curve_DELTA; // boolean status_KOTEL; // boolean status_KOTEL_ctrl; // boolean error_DALLAS; // } buffer_OUT; // заполнение структуры данных Buffer buffer_OUT; buffer_OUT.t_OUT_heater = read_DS( addr_OUT_heater ); // считываем buffer_OUT.t_IN_heater = read_DS( addr_IN_heater ); // считываем buffer_OUT.t_OUT_side = read_DS( addr_OUT_side ); // считываем buffer_OUT.set_T_water_MIN = 27.0; // из EEPROM buffer_OUT.set_T_water_MAX = 28.0; // из EEPROM buffer_OUT.set_T_air_MIN = 29.0; // из EEPROM buffer_OUT.set_T_air_MAX = 30.0; // из EEPROM buffer_OUT.set_T_curve_MIN = 0.0; // из EEPROM buffer_OUT.set_T_curve_MAX = -30.0; // из EEPROM buffer_OUT.set_T_curve_DELTA = 10.0; // из EEPROM buffer_OUT.status_KOTEL = 0; // вычисляем buffer_OUT.status_KOTEL_ctrl = ! digitalRead( pin_RF_air ); // считываем buffer_OUT.error_DALLAS = 0; // вычисляем // если авария датчика подачи if ( buffer_OUT.t_OUT_heater > 1000.0 ) { buffer_OUT.error_DALLAS = 1; digitalWrite( pin_Relay , HIGH ); digitalWrite( pin_Led_Green , HIGH ); digitalWrite( pin_Led_Blue , HIGH ); while( 1 ) { digitalWrite( pin_Led_Red , HIGH ); delay( 100 ); digitalWrite( pin_Led_Red , LOW ); delay( 100 ); #ifdef yes_Serial Serial.println( " Error DS18B20 " ); #endif } } // анализ для управления котлом if ( ! buffer_OUT.status_KOTEL_ctrl ) { if ( buffer_OUT.t_OUT_heater <= buffer_OUT.set_T_water_MIN ) { buffer_OUT.status_KOTEL = 1; } if ( buffer_OUT.t_OUT_heater >= buffer_OUT.set_T_water_MAX ) { buffer_OUT.status_KOTEL = 0; } } else { if ( buffer_OUT.t_OUT_heater <= buffer_OUT.set_T_air_MIN ) { buffer_OUT.status_KOTEL = 1; } if ( buffer_OUT.t_OUT_heater >= buffer_OUT.set_T_air_MAX ) { buffer_OUT.status_KOTEL = 0; } } // управление котлом digitalWrite( pin_Relay , ! buffer_OUT.status_KOTEL ); // индикация состояния системы if ( buffer_OUT.status_KOTEL && buffer_OUT.status_KOTEL_ctrl ) { digitalWrite( pin_Led_Blue , HIGH ); digitalWrite( pin_Led_Red , LOW ); } if ( buffer_OUT.status_KOTEL && ! buffer_OUT.status_KOTEL_ctrl ) { digitalWrite( pin_Led_Blue , LOW ); digitalWrite( pin_Led_Red , HIGH ); } if ( ! buffer_OUT.status_KOTEL ) { digitalWrite( pin_Led_Blue , HIGH ); digitalWrite( pin_Led_Red , HIGH ); } // вывод данных в сериал-монитор #ifdef yes_Serial Serial.print( " OUT = " ); Serial.print( buffer_OUT.t_OUT_heater , 1 ); Serial.print( " IN = " ); Serial.print( buffer_OUT.t_IN_heater , 1 ); Serial.print( " STREET = " ); Serial.println( buffer_OUT.t_OUT_side , 1 ); Serial.print( " Water Min = " ); Serial.print( buffer_OUT.set_T_water_MIN , 1 ); Serial.print( " Water Max = " ); Serial.println( buffer_OUT.set_T_water_MAX , 1 ); Serial.print( " Air Min = " ); Serial.print( buffer_OUT.set_T_air_MIN , 1 ); Serial.print( " Air Max = " ); Serial.println( buffer_OUT.set_T_air_MAX , 1 ); if ( buffer_OUT.status_KOTEL ) { Serial.print( "KOTEL >>> ON" ); if ( buffer_OUT.status_KOTEL_ctrl ) { Serial.println( " CONTROL >>> AIR" ); } else { Serial.println( " CONTROL >>> WATER" ); } } else { Serial.println( " KOTEL >>> OFF" ); } Serial.println( "=====================================================================" ); #endif } //==================================================================================
содержимое EEPROM
0 0 1 0 2 216 3 65 4 0 5 0 6 224 7 65 8 0 9 0 10 232 11 65 12 0 13 0 14 240 15 65 16 0 17 0 18 0 19 0 20 0 21 0 22 240 23 193 24 0 25 0 26 32 27 65 28 255 29 255 30 255 31 255 32 255 33 255 34 255
отправка структуры по RF на модуль отображения/управления - не сделано
приём установок по RF от модуля отображения/управления с записью в EEPROM - не сделано
поэтому сделал иммитацию считывания установок из EEPROM - ой ! не сделано !
для начала хочЮ записать в EEPROM принудительно данные с потолка , и от них грузить систему ( громко сказано ) :(
далее - сам вопрос-то....
правильно ли массив установок ( строки 16..18 ) запихнут в EEPROM ?
содержимое EEPROM этому соответствует ?
как понимать представление float в 4-ёх байтах ?
где там чё ?
где расположены - знак , мантисса , порядок ?
для float в представлении 4-мя байтами - нигде не нашёл :(
спасибо :)
правильно ли массив установок ( строки 16..18 ) запихнут в EEPROM ?
содержимое EEPROM этому соответствует ?
как понимать представление float в 4-ёх байтах ?
где там чё ?
где расположены - знак , мантисса , порядок ?
для float в представлении 4-мя байтами - нигде не нашёл :(
спасибо :)
Плохо искал: https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D1%81_%D0%...
float - число с одинарной точностью, сиречь четыре байта, по приведённой ссылке даже размеры полей указаны.
DIYMan , это я читал...
float в ардуине = 4 байта
32 бита...
а где и что в этих битах сидит - не вижу :(
по приведённой ссылке даже размеры полей указаны.
не нашёл там такого :(
под какое поле - сколько бит ?
DIYMan ,
понял , дурак , извини - хамил :)
SEF_4 >>> S - 1 E - 8 F - 23
СПАСИБО !!!!!