Запись в EEPROM , формат float - прошу проверить

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
#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

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

отправка структуры по RF на модуль отображения/управления  - не сделано
приём установок по RF от модуля отображения/управления с записью в EEPROM  - не сделано
поэтому сделал иммитацию считывания установок из EEPROM - ой ! не сделано !

для начала хочЮ записать в EEPROM принудительно данные с потолка , и от них грузить систему ( громко сказано ) :(

далее - сам вопрос-то....

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

правильно ли массив установок ( строки 16..18 ) запихнут в EEPROM ?
содержимое EEPROM этому соответствует ?

как понимать представление float в 4-ёх байтах ?
где там чё ?
где расположены - знак , мантисса , порядок ?
для float в представлении 4-мя байтами - нигде не нашёл :(

спасибо :)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

SU-27-16 пишет:

правильно ли массив установок ( строки 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 - число с одинарной точностью, сиречь четыре байта, по приведённой ссылке даже размеры полей указаны.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

DIYMan ,   это я читал...
float в ардуине = 4 байта
32 бита...
а где и что в этих битах сидит - не вижу :(
по приведённой ссылке даже размеры полей указаны.
не нашёл там такого :(

под какое поле - сколько бит ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

DIYMan ,  

понял , дурак , извини - хамил :)
SEF_4 >>> S - 1   E - 8   F - 23
СПАСИБО !!!!!