Запись в 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
СПАСИБО !!!!!