Разместить данные в EEPROM, чтобы Сэкономить FLASH

b612
Offline
Зарегистрирован: 12.03.2017

Logik пишет:
Но тем не менее сочетание WiFi, низкой цены и простоты вхождения для 8266 почитай уникально. И часики на нем и WS2812B выглядят заманчиво за счет исключения RTC. Про нормальный звук с него - тоже сомневаюсь. Хотя ШИМ для движка в Н-мосте сделал.
я ничего против не имею, замечательная штука.
Даже уже почти портировал на неё свой проект. Правда пока без звука получается, потому, что не хочу городить внешний АЦП
Приедет 32-ая и наверно всё будет Ок.

b707
Offline
Зарегистрирован: 26.05.2017

Logik пишет:

Но тем не менее сочетание WiFi, низкой цены и простоты вхождения для 8266 почитай уникально. И часики на нем и WS2812B выглядят заманчиво за счет исключения RTC.

на 8266 нет своего RTC. а рассчитывать только на инет не стоит.

Собственно, в своих простых часах, упомянутых выше - я взял две дешевых платы, СТМ32 за 100 рублей

 

и ESP-01 за 70

в первой есть встроенный RTc и куча периферии, во второй WiFi

Logik
Offline
Зарегистрирован: 05.08.2014

Это 01,  моя любимая! Кроме неё только 06 пользовал один раз.

 

Logik
Offline
Зарегистрирован: 05.08.2014

b612 пишет:

Вообщем на данном этапе мне показалось проще выкинуть несколько массивов в еепром, тем более что им там самое место.

 

Так какие там сложности, я так обычно пишу. В ресурсах, они могут быть общими для нескольких проектов

#define EEPROM_STUCT_DEV_ID_NUMBER                         3
#define EEPROM_STUCT_TIMER_INTERVALS_NUMBER      8
#define EEPROM_STUCT_EXT_OUT_NUMBER   8


typedef struct  EEPROM_STUCT
{
     OneWareDevID DevID[EEPROM_STUCT_DEV_ID_NUMBER];
 
     TimerInterval TimerIntervals[EEPROM_STUCT_TIMER_INTERVALS_NUMBER];
     byte ExtOutValueON[EEPROM_STUCT_EXT_OUT_NUMBER];             //уровень ШИМ при включенном состоянии
     byte ExtOutTimersMask[EEPROM_STUCT_EXT_OUT_NUMBER];     
     byte ExtOutOptions[EEPROM_STUCT_EXT_OUT_NUMBER];               //набор флагов, определяющих специфику устройства
 } ;

/*  Флаги в ExtOutOptions */
#define EXT_OUT_OPT_SMOOTHLY  1     //плавное включение

#define offsetof(st, m) ((size_t)(&((st *)0)->m))

#define EEPROM(a)   ((byte)offsetof(EEPROM_STUCT,a))

#define EEPROM_WRITE(adr,val) WriteBlockToEEPROM(EEPROM(adr), &val, sizeof(val));
#define EEPROM_READ(adr,val)  ReadBlockFromEEPROM(EEPROM(adr), &val, sizeof(val)); 

 

А в коде гдето

       for(byte k=0;k<sizeof(ExtOutRegPositionSHIM);k++)
       {
            i=EXT_OUT_MAX_PWM;
            EEPROM_WRITE(ExtOutValueON[k], i);

 

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:
Собственно, в своих простых часах, упомянутых выше - я взял две дешевых платы, СТМ32 за 100 рублей
у меня тоже несколько валяются.
Заказывал для волшебного фонарика, поскольку там уж совсем с памятью ардуины не развернуться.
Так и лежат.
А фонарик так на ардуине и работает )

ДААА код фонарика тоже под 5000 строк ))

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

ДААА код фонарика тоже под 5000 строк ))

ну значит такой стиль... индусский.

Сколько писал проектов - и своих, и на заказ - больше 1000 строк не было ни в одном

все-таки очень хотелось бы глянуть. что можно накрутить на 6 тыс строк. Жалко что кода нет.

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:
Сколько писал проектов - и своих, и на заказ - больше 1000 строк не было ни в одном
я тоже на заказ вряд ли стал бы столько писать
но тут код ещё совсем не чищеный

//Декларации
#define Versiya 112 //при изменении версии прошивки в еепром прописываются дефолтные настройки
//чтобы была отладка нужно обязательно открыть строчку #define _otladkaUART
//#define _otladkaUART //всё что касается пина OUT_Pin - D0 - выход RX
//без UART-а вообще не будет никаких отладок
//#define _otladkaProchee //всякие разовые мелочи
//#define _otladkaKlava //
//#define _otladkaNastrojki
//#define _otladkaFonari 
//#define _otladkaDisplay
//#define _otladkaSon
//#define _otladkaTerm
#define _otladkaTimery

#include <CyberLib.h>
//#define _Display_TM1638
#define _Display_MAX7219
#define _DS18b20
#define __DS_RTC
#define __DS1307
//#define __DS3232
//#define _Klesh //14 (A0)
#define _Regulyator
#define _Dimmer
#ifdef _otladkaUART
  bool OUT_PinV = true;
#endif
#include <EEPROM.h>
#include <LowPower.h>
//#include <Time.h> // для работы с модулем часов реального времени
#include <TimeLib.h> // для работы с модулем часов реального времени
#ifdef _DS18b20
#include <OneWire.h>
OneWire oneWire(15);// вход датчиков 18b20
#include <DallasTemperature.h>
DallasTemperature ds(&oneWire);
#endif //#ifdef _DS18b20

//Про UART
bool UART_ON = true;//выводы D0 и D1 выведены на разъём, по этому могут быть использованы как входы или выходы
#define _UARTRejimDefoult 0
uint8_t UARTrejim = _UARTRejimDefoult;
volatile uint8_t incomingByte = 0;

//Режимы работы девайса
enum Rejimy {RejimTimer,// 0 //основной режим
  RejimSETUP,      // 1 //редактирование настроек
  RejimFonarik,    // 2 //фонарик
#ifdef _Dimmer  
  RejimDimmer,      //
#endif //#ifdef _Dimmer
  RejimZaryadMeter,// 3 //зарядка в кирпичах
  RejimTermoMeter, // 4 //градусник
  RejimHronoMeter, // 5 //часы
  RejimLuxMeter,   // 6 //освещенность
  RejimVoltMeter,  // 7 //питание в вольтах
#ifdef _Klesh
  RejimWattMeter,  // 8 //мощность в попугаях
#endif//#ifdef _Klesh   
  RejimLaser,      // 9 //лазер
  RejimUv};        // 10 //ультрафиолет
uint8_t Rejim = RejimTimer;

//Режимы питания
#define PowerJarim 0 //
#define PowerEco 1 //
#define PowerVykl 2 //
#define PowerOtSeti 3 //
uint8_t PowerRejim = PowerJarim;
uint8_t Palki = 6;

//Привязки
enum _privyazki {_privyazkaMelody0, _privyazkaMelody1, _privyazkaMelody2, _privyazkaMelody3, _privyazkaMelody4, _privyazkaMelody5, _privyazkaMelody6, //_privyazkaMelody7,//0-7 номера мелодий
                 _privyazkaRS_Melody0, _privyazkaRS_Melody1, _privyazkaRS_Melody2, _privyazkaRS_Melody3, _privyazkaRS_Melody4, _privyazkaRS_Melody5, _privyazkaRS_Melody6, //_privyazkaRS_Melody7,
                 _privyazkaMelodyOFF,    //14 а выключаются могут безусловно
                 _privyazkaRS_MelodyOFF, //15 а могут по триггеру
                 _privyazkaFonarON,      //16 включить фонарик
                 _privyazkaRS_FonarON,   //17 включить фонарик c триггером
                 _privyazkaFonarOFF,     //18 погасить фонарик
                 _privyazkaRS_FonarOFF,  //19 погасить фонарик c триггером
                 _privyazkaLaserON,      //20 включить лазер
                 _privyazkaRS_LaserON,   //21 включить лазер c триггером
                 _privyazkaLaserOFF,     //22 погасить лазер
                 _privyazkaRS_LaserOFF,  //23 погасить лазер c триггером
                 _privyazkaUvON,         //24 ультрафиолет
                 _privyazkaRS_UvON,      //25 ультрафиолет c триггером
                 _privyazkaUvOFF,        //26 ультрафиолет
                 _privyazkaRS_UvOFF,     //27 ультрафиолет c триггером
                 _privyazka_OUT_ON,    //28 установить выход
                 _privyazkaRS_OUT_ON,    //29 установить выход
                 _privyazka_OUT_OFF,   //30 сбросить выход
                 _privyazkaRS_OUT_OFF,   //31 сбросить выход
                 _privyazkaNETU          //32
                };        // привязка отсутствует
bool triggerMelody = false;
bool triggerFonar = false;
bool triggerLaser = false;
bool triggerUv = false;
bool triggerOUT = false;
//НАСТРОЙКИ
enum  Nastroyki  {//настройки привязок таймеров
  Nastr0,
  //важно, чтобы все 8 привязок шли подряд
  //поскольку их номера вычисляются как (NastrPrivyazka0+НомерТаймера)
  NastrPrivyazka0, NastrPrivyazka1, NastrPrivyazka2, NastrPrivyazka3, NastrPrivyazka4, NastrPrivyazka5, NastrPrivyazka6, NastrPrivyazka7,
  //настройки часиков
  NastrGod, NastrMesats, NastrDen, NastrDenNedeli, NastrChas, NastrMinuta, NastrSekunda,
  NastrPowerOtSeti, //0-питаемся от химии, 1-питаемся от сети
  //настройки интервалов, задаваемых кнопками
  NastrKey1m,//время, устанавливаемое правой кнопкой (1 минута)
  NastrKey5m,//...... 5-минутной кнопкой
  NastrKey20m,//...... 20-минутной кнопкой
  NastrKey1h,//...... 1-часовой кнопкой
  NastrFonarikovoyeVremya,//время, устанавливаемое на таймер при включении фонариков
  NastrKlesh,// 0 - клещ работает, 1 - клещ не работает
  //настройки палок питания
  NastrPorog50V, NastrPorog42V, NastrPorog40V, NastrPorog37V, NastrPorog35V, NastrPorog33V, NastrPorog30V,
  NastrKnopkaSbros, //0- кнопка "сброс" = "рестарт/сброс"
  //1- "пуск/стоп/recall"
  NastrUART_ON
#ifdef _Regulyator
  ,
  NastrTermH, NastrTermTrevogaH, NastrTermL, NastrTermTrevogaL,
  NastrOsveshennostH, NastrOsveshennostTrevogaH, NastrOsveshennostL, NastrOsveshennostTrevogaL,
  NastrINT1_DatchikRISING, NastrINT1_DatchikFALLING
#endif
  , KolichestvoNastroek //это не номер настройки а просто чтобы знать сколько их всего
};
enum NastroykiDop {//дополнительная инфа о двухбайтовых настройках
#ifdef _Regulyator
  NastrTermH2B, NastrTermL2B, //NastrOsveshennostH2B,NastrOsveshennostL2B,
#endif //#ifdef _Regulyator  
  NastrKey1m2B, NastrKey5m2B, NastrKey20m2B, NastrKey1h2B,
  NastrFonarikovoyeVremya2B,
  Kolichestvo2BNastroek
};
//#define Nastr0 0 //НЕ ИЗМЕНЯТЬ эта настройка соответствует надписи "SET"
bool MyVnutriNastrujki = false; //флажок обозначающий что мы в режиме изменения конкретной настройки
uint8_t SettingsIndex = 1;
int16_t SettingZnachenie;
uint8_t *ptrSettingZnachenie;
enum _podprogrammy {_ppGod, _ppMesyac, _ppDenNedeli, _ppDenMesyaca, _ppChas, _ppMinuta, _ppSekunda,
                    _ppEEPROM_1_Byte, _ppEEPROM_2_Byte,
                    _ppPrivyazka
#ifdef _Regulyator
, _ppTerm//, _ppNastrOsveshennost
#endif //#ifdef _Regulyator
                   };
const uint8_t NastrDef[KolichestvoNastroek][5] PROGMEM = {
  //[x][0]-адрес в EEPROM,для двухбайтовой 2 ячейки сначала младший потом старший байты
  //[x][1]-дефолтное значение, младший байт
  //[x][2]-для однобайтовых - минимальное значение, для двухбайтовых - старший байт дефолтного значения
  //[x][3]-для однобайтовых - максимальное значение, для двухбайтовых индекс массива допов
  //[x][4]-подпрограмма обработки enum _podprogrammy
  {0, Versiya, 0, 0, _ppEEPROM_1_Byte},//0 чтобы посмотреть версию прошивки
  //важно, чтобы 8 таймерных привязок шли в массиве настроек подряд
  {23, _privyazkaMelody2, 0, _privyazkaNETU, _ppPrivyazka}, // 1 NastrPrivyazka0
  {24, _privyazkaMelody1, 0, _privyazkaNETU, _ppPrivyazka}, // NastrPrivyazka1
  {25, _privyazkaMelody3, 0, _privyazkaNETU, _ppPrivyazka}, // NastrPrivyazka2
  {26, _privyazkaMelody6, 0, _privyazkaNETU, _ppPrivyazka}, // NastrPrivyazka3
  {27, _privyazkaMelody0, 0, _privyazkaNETU, _ppPrivyazka}, // NastrPrivyazka4
  {28, _privyazkaMelody5, 0, _privyazkaNETU, _ppPrivyazka}, // NastrPrivyazka5
  {29, _privyazkaMelody4, 0, _privyazkaNETU, _ppPrivyazka}, // NastrPrivyazka6
  {30, _privyazkaRS_OUT_OFF, 0, _privyazkaNETU, _ppPrivyazka}, // 8 NastrPrivyazka7
  {0, 49, 49, 99, _ppGod},   //9 NastrGod
  {0, 1, 1, 12, _ppMesyac},     //10 NastrMesats
  {0, 1, 1, 31, _ppDenMesyaca},     //11 NastrDen
  {0, 2, 1, 7, _ppDenNedeli},      //12 NastrDenNedeli
  {0, 0, 0, 23, _ppChas},     //13 NastrChas
  {0, 0, 0, 59, _ppMinuta},     //14 NastrMinuta
  {0, 1, 0, 1, _ppSekunda},      //15 NastrSekunda
  {9, 0, 0, 1, _ppEEPROM_1_Byte},      //16 NastrPowerOtSeti
  {31, 60, 0, NastrKey1m2B, _ppEEPROM_2_Byte}, //17 NastrKey1m
  {33, 44, 1, NastrKey5m2B, _ppEEPROM_2_Byte}, //18 NastrKey5m
  {35, 176, 4, NastrKey20m2B, _ppEEPROM_2_Byte}, //19 NastrKey20m
  {37, 0x10, 0x0E, NastrKey1h2B, _ppEEPROM_2_Byte}, //20 NastrKey1h
  {39, 44, 1, NastrFonarikovoyeVremya2B, _ppEEPROM_2_Byte}, //21 NastrFonarikovoyeVremya
  {1, 1, 0, 1, _ppEEPROM_1_Byte},      //22 NastrKlesh
  {2, 220, 0, 255, _ppEEPROM_1_Byte},  //23 NastrPorog50V выше этого считаем что питаемся от 5  240=5.0
  {3, 206, 0, 255, _ppEEPROM_1_Byte},  //24 NastrPorog42V 206=4.3
  {4, 190, 0, 255, _ppEEPROM_1_Byte},  //25 NastrPorog40V 190=4.0
  {5, 178, 0, 255, _ppEEPROM_1_Byte},  //26 NastrPorog37V 178=3.7
  {6, 167, 0, 255, _ppEEPROM_1_Byte},  //27 NastrPorog35V 167=3.5
  {7, 158, 0, 255, _ppEEPROM_1_Byte},  //28 NastrPorog33V 158=3.3 //ниже этого начинаем плакать
  {8, 143, 0, 255, _ppEEPROM_1_Byte},  //29 NastrPorog30V 143=3.0 //132=2.71
  {10, 0, 0, 1, _ppEEPROM_1_Byte},     //30 NastrKnopkaSbros
#ifdef _otladkaUART
  {41, 1, 0, 1, _ppEEPROM_1_Byte}      //31 NastrUART_ON
#else
  {41, 0, 0, 1, _ppEEPROM_1_Byte}      //31 NastrUART_ON
#endif //#ifdef _otladkaUART
#ifdef _Regulyator
  ,
  {11, 0, 0, 0, _ppTerm},     //32 NastrTermH 2B
  {13, _privyazkaNETU, 0, _privyazkaNETU, _ppPrivyazka},   //33 NastrTermTrevogaH
  {14, 0, 0, 1, _ppTerm},     //34 NastrTermL 2B
  {16, _privyazkaNETU, 0, _privyazkaNETU, _ppPrivyazka},   //35 NastrTermTrevogaL,
  {17, 80, 0, 255, _ppEEPROM_1_Byte},    //36 NastrOsveshennostH
  {19, _privyazkaNETU, 0, _privyazkaNETU, _ppPrivyazka},   //37 NastrOsveshennostTrevogaH
  {20, 60, 0, 255, _ppEEPROM_1_Byte},    //38 NastrOsveshennostL
  {22, _privyazkaNETU, 0, _privyazkaNETU, _ppPrivyazka},    //39 NastrOsveshennostTrevogaL
  {42, _privyazkaNETU, 0, _privyazkaNETU, _ppPrivyazka}, //40 NastrINT1_DatchikRISING
  {43, _privyazkaNETU, 0, _privyazkaNETU, _ppPrivyazka} //41 NastrINT1_DatchikFALLING

  //  {11, 0, 0, 0, _ppEEPROM_2_Byte},
  //  {14, 0, 0, 1, _ppEEPROM_2_Byte},
  //  {17, 0, 0, 2, _ppEEPROM_2_Byte},
  //  {20, 0, 0, 3, _ppEEPROM_2_Byte},

#endif //#ifdef _Regulyator
};
const uint8_t NastrDefDop[Kolichestvo2BNastroek][4] PROGMEM = {
  //дополнительная информация для двухбайтовых настроек
  //[x][0] младший байт минимального значения
  //[x][1] старший байт минимального значения
  //[x][0] младший байт максимального значения
  //[x][1] старший байт максимального значения
#ifdef _Regulyator
  {0x30, 0xF8, 0xE0, 0x2E}, //NastrTermH2B 
  {0x30, 0xF8, 0xE0, 0x2E}, //NastrTermL2B
  {1, 0, 0x9A, 0x7F}, //NastrKey1m 32666 чтобы на 100 меньше
  {1, 0, 0x9A, 0x7F}, //NastrKey5m иначе переполнение не сработает
  {1, 0, 0x9A, 0x7F}, //NastrKey20m
  {1, 0, 0x9A, 0x7F}, //NastrKey1h
  {1, 0, 0x9A, 0x7F} //NastrFonarikovoyeVremya
  //{0,0,255,0}//NastrOsveshennostL2B}
#endif //#ifdef _Regulyator  
};

//Внешний датчик INT1
bool INT1_changed=false;
uint8_t oldINT1_Datchik; //старое состояние порта D ,пропущеное через маску B00000010
uint8_t newINT1_Datchik; //новое состояние порта D ,пропущеное через маску B00000010
uint8_t INT1_DatchikRISING = _privyazkaNETU; //хранение в оперативке привязки датчика
uint8_t INT1_DatchikFALLING = _privyazkaNETU; //хранение в оперативке привязки датчика

//Дисплеи и клавы
#ifdef _Display_TM1638
#include <TM1638.h>
TM1638 module(9, 7, 8);//подключение дисплея
//TM1638 module(x, y, z);
//Здесь:
//х номер контакта для сигнала DIO,
//у номер контакта для сигнала CLK,
//z номер контакта для сигнала STB.
//в нашем случае контакты ардуино
//x=7=DIO, y=6=CLK, z=5=STB
#define butNext 0
#define butReset 1
#define butIntens 2
#define but10sec 3
#define butHour 4
#define but20min 5
#define but5min 6
#define but1min 7
uint8_t buttons = 0;//введёные кнопки
#endif //#ifdef _Display_TM1638
#ifdef _Display_MAX7219
#include "LedControl.h"
/*
  Now we need a LedControl to work with.
 ***** These pin numbers will probably not work with your hardware *****
  pin 12 is connected to the DataIn
  pin 11 is connected to the CLK
  pin 10 is connected to LOAD
  We have only a single MAX72XX.
*/
LedControl lc = LedControl(12, 11, 10, 1);
uint16_t butIntervaly[7];//здесь копим временнЫе интервалы
bool buttonM[8];//здесь реальные состояния кнопок
uint8_t LastKey;//кнопка, нажатая реально перед отпусканием всех кнопок
unsigned long LooperMicros0;
unsigned long LooperMicros1;
//unsigned long LooperMicros2;
uint16_t KlKalibr0;//количество микросекунд в цикле дисплея 
uint16_t KlKalibr;//количество микросекунд в цикле дисплея деленное на 8
uint16_t KlKalibr2;//калибровочная константа
uint8_t KlIndex;//индекс в массиве butIntervaly
uint8_t KlIn;  //байт введёный из порта с двумя рабочими битами "маркер" и "кнопка"
bool KlF;//флажок триггер, что кнопка поднималась
bool KlF2;//флажок триггер, что маркер поднимался
#define butIntens 7
#define but10sec 6
#define butNext 5
#define butReset 4
#define butHour 3
#define but20min 2
#define but5min 1
#define but1min 0
#endif //#ifdef _Display_MAX7219

//про звук
#define buzzerPinGromkij 13 //куда подключен динамик
#define buzzerPinTihij 4 //куда подключен динамик
//про фонарик
#define fonarikPin 9
#define uvPin 6
#define laserPin 5
//#define OUT_Pin0 0 сейчас стоит ЦЫФРА
//#define OUT_Pin1 1
bool HotAirON=false;//для СИФУ
uint8_t HAPower=0;//для СИФУ
unsigned long ots=0;//для СИФУ
bool fonarikVklyuchen = false;
uint8_t fonarikYarkost = 7; //степень двойки в яркости фонарика
bool fonarikMigat = false; //флаг мигания фонарика
bool fonarikKnopka = false; //флаг эмуляция нажатой КНОПКИ фонарика
bool laserVklyuchen = false; //флаг лазер включен
bool laserMigat = false; //флаг мигания лазера
bool uvVklyuchen = false; //флаг ультрафиолет включен
bool PWMzanyat = false; //флаг работы ШИМ. учитывается при выяснении возможности уйти в сон

//про температуру
#ifdef _DS18b20
int16_t Term[5];
uint8_t TermStr[6];
byte qty; // количество градусников на шине
//  int16_t Term0 = 0; //температура
#ifdef _Regulyator
int16_t TermH = 3584; //верхний порог
int16_t TermL = 1280; //нижний порог
uint8_t TermTrevogaH = _privyazkaNETU; //что делать при достижении верхнего порога
uint8_t TermTrevogaL = _privyazkaNETU; //что делать при достижении нижнего порога
#endif
#endif //#ifdef _DS18b20

//про токовый клещ
#ifdef _Klesh
#define _pinKlesh 14
volatile uint8_t ramNastrKlesh = 0; //Режим работы клеща 0-рабочий режим
volatile bool KleshReady = false;//флаги готовности результатов АЦП
#define KleshMHCount 90 //длинна одной записи, количество выборок
volatile uint8_t KleshMH[KleshMHCount];//запись
volatile uint8_t KleshMIndex = 0; //индекс выборки
volatile uint8_t oldPower = 0; //старая мощность
volatile uint8_t newPower = 0; //новая мощность
volatile uint8_t newPowerStr[3];//новая мощность строкой
#endif //#ifdef _Klesh

//про вольтметр
#define VoltPin 8 //пин источник напряжения для вольтметра
#define ZaryadPin 7 //сигнал полной зарядки
volatile uint8_t Voltmeter[2];//старший и младший байты сырого АЦП
uint8_t VoltmeterStr[3];//напряжение строкой в сотых долях вольта
volatile bool VoltmeterReady = false; //флаг измерение закончено сброс этого флага вызывает новое измерение
volatile uint8_t Voltmeter8 = 0; //8-битное сырое значение напряжения
volatile uint8_t currentSensorValueH = 0;//буфер для хранения результатов АЦП
volatile uint8_t currentSensorValueL = 0;//--
volatile uint8_t Tormozz = 0; //число в пределах 0-8 цикличность прерываний для АЦП
volatile uint8_t bylRyvok = 0; //флаг для обзвона клавы
//в оперативе храним только значимые для работы девайса
//пороги 3вольта(смерть)
//5вольт(ништяк)-признак внешнего питания
//3.3 вольта - плач
volatile uint8_t ramNastrPorog50V;//если выше, считаем что 5.0
//volatile uint8_t ramNastrPorog42V;//5 палок
//volatile uint8_t ramNastrPorog40V;//4 палки
//volatile uint8_t ramNastrPorog37V;//3 палки
//volatile uint8_t ramNastrPorog35V;//2 палки
volatile uint8_t ramNastrPorog33V;//1 палка. Если ниже, плачем
volatile uint8_t ramNastrPorog30V;//0 палок умираем

//про датчик света
uint16_t Osveshennost = 0; //16-битное сырое значение освещенности
uint8_t Osveshennost8;//8-битное сырое значение освещенности
bool OsveshennostReady = false; //флаг завершенности измерения. если сбросить это вызовет новое измерение
uint8_t OsveshennostStr[3];//строка в попугаях
#ifdef _Regulyator
int8_t OsveshennostH = 0; //верхний порог
int8_t OsveshennostL = 0; //нижний порог
uint8_t OsveshennostTrevogaH = _privyazkaNETU; //что делать при достижении верхнего порога
uint8_t OsveshennostTrevogaL = _privyazkaNETU; //что делать при достижении нижнего порога
#endif

//Про клавиатуру
#define _pinKlavaKnopki 17
#define _pinKlavaMarker 16
#define _pinKlavaINT 2
bool AnyKeyDown;//нажата хоть одна кнопка
bool OldAnyKeyDown = false; //флаг,смена которого означает событие нажатия или отпускания кнопки
bool NomerAvtopovtora = 0; //при первом нажатии на кнопку будет 0 при автоповторе будет увеличиваться
bool DlitelnoeNajatieObrabotano = true; //флаг устанавливается после прохода в котором обнаружено длительное нажатие
unsigned long nextPressTime = 0;//время когда включится чувствительность клавиатуры 200мс после нажатия
unsigned long endTimeDlitelnoeNajatie = 0; //эндтайм м.сек для длительного нажатия
unsigned long endTimeDlitelnoeNajatie2 = 0; //эндтайм м.сек для длительного нажатия
bool DlitelnoeNajatie = false; //флажок длительного нажатия
bool DlitelnoeNajatie2 = false; //флажок длительного нажатия
#define ccendTimeDlitelnoeNajatie 1000 //м.сек
#define ccendTimeDlitelnoeNajatie2 3000 //м.сек
bool KlavaBlokirovana=false;
//про время
unsigned long LooperTime = 0; //копия системного времени, не изменяется в течение одного цикла loop
uint8_t *ptrMillis8;//8-битный указатель на младший Millis
uint16_t *ptrMillis16;//16-битный указатель на Millis
uint8_t oldMillis;//старое значение младшего байта счетчика millis
uint8_t oldMillis20;//старое значение младшего байта счетчика millis для периода 20мс
uint8_t oldMillis32;//старое значение младшего байта счетчика millis для периода 20мс
uint8_t oldMillis50;//старое значение младшего байта счетчика millis для периода 50мс
uint16_t oldMillis500;//старое значение младшего байта счетчика millis для периода 500мс
uint16_t oldMillis1000;//старое значение младшего байта счетчика millis для периода 1000мс
bool Polsekundy = true; // флажок устанавливается на половине секунды и сбрасывается в конце главного цикла
bool Sekunda = true; // флажок устанавливается на целой секунде и сбрасывается в конце главного цикла
bool mSekunda = true; // флажок устанавливается при изменении счетчика millis
bool mSekunda20 = true; // флажок устанавливается при изменении счетчика millis на 20
bool mSekunda50 = true; // флажок устанавливается при изменении счетчика millis на 100
time_t Vremya_t = 0; //текущее время

//Про RTC
bool EstRTC = false; //есть датчик времени
#ifdef __DS_RTC
#include <DS3232RTC.h> // для работы с модулем часов реального времени
tmElements_t Vremya;
#endif //#ifdef __DS_RTC

//Про таймеры
uint8_t running[8] = {200, 200, 200, 200, 200, 200, 200, 200};//статусы таймеров
#define _runningVykluchen 200 //-выключен,
#define _runningSchitaet  1 //отсчитывает,
#define _runningTrevojit  2 //тревожит,
#define _runningTerpit    3 //терпит,
#define _runningTrevojit2 4 //тревожит2,
#define _runningTerpit2   5 //терпит2,
#define _runningTrevojit3 6 //тревожит3
#define _runningJdet      7 //выключен, но набрано число и таймер ждёт от пользователя отмены или добавления
uint8_t CurrentTimer = 0; //текущий отображаемый таймер
//bool CurrentTimerMokryj = false; //показывает, что с момента создания таймера кнопка отпущена не была
//и значит длительное нажатие в праве отменить/изменить CurrentTimer
time_t endTime[8] = {0, 0, 0, 0, 0, 0, 0, 0}; //эндтаймы отсчетов, тревог и терпелок
#define _endTimeDisplay 20 //таймаут настроек таймеров
#define _endTimeDisplay2 5 //прочие короткие таймауты
#define _endTimeDisplay3 60 //длинный таймаут для наблюдением за измерениями
uint8_t tempTimeOutDisplay = 5;//дежурка для повторной зарядки endTimeDisplay
time_t endTimeDisplay = _endTimeDisplay; //в секундах. эндтайм для дисплея
//после которого нужно выключить дисплей
time_t endTimeVanTach = 20;/*для обеспечения режима вантач.
  Пользователю даётся 20 секунд настроить и полюбоваться таймером,
  после чего прибор готов с первого тыка начать настраивать новый таймер */
bool estjyvye = false; //есть активные таймеры
time_t Times[8] = {0, 0, 0, 0, 0, 0, 0, 0}; //таймы. здесь помним сколько было засечено
time_t zapuski[8] = {0, 0, 0, 0, 0, 0, 0, 0}; //здесь будем хранить моменты запусков таймеров
uint8_t privyazka[8] = {_privyazkaNETU, _privyazkaNETU, _privyazkaNETU, _privyazkaNETU, _privyazkaNETU, _privyazkaNETU, _privyazkaNETU, _privyazkaNETU}; //Привязка мелодий, фонарика и т.п к таймерам
time_t alarm1 = 60; //пищать будем минуту
time_t terpelka1 = 240; //первая терпелка 4 минуты (вместе с первым писком будет 5)
time_t alarm2 = 60; //пищать будем минуту
time_t terpelka2 = 840; //первая терпелка 12 минут (вместе с двумя писками и первой терпелкой 20 минут)
time_t alarm3 = 60; //пищать будем минуту
time_t blijaishij = 4102444800;//01.01.2100 время ближайшего события, чтобы не проспать

//про работу девайса
byte Plachem = false; //признак истощение аккумулятора
byte Vopim = false; //признак полного истощения аккумулятора
byte PlachemCounter = 0; //задержка в секундах между всхлипами
bool PlachVremennoBlokirovan = false; //признак временной блокировки плача
byte Kipish = false; //признак потери датчика при регулировании
byte KipishCounter = 0; //задержка в секундах между кипишами
byte KipishVremennoBlokirovan = false; //признак блокировки кипишей

byte ledy = 0;//переменная для рассчета светодиодного байта
char buff[20]; //буфер для преобразования числа в строку
uint8_t  intensity = 2;//яркость дисплея по умолчанию
bool dblres = false;//флаг устанавливается после первого нажатия кнопки сброса. используется чтобы констатировать повторное нажатие
bool nettrevog = true; //на данный момент нет активных тревог
bool repeat = true; //бесконечное повторение мелодии
time_t dispTime = 0; //некое значение(время) для показа на дисплее
unsigned long ms50n = 0; //число 0-7 увеличивается каждые 50мс
uint8_t Term4Polsec = 0; //счетчик для интервала измерения температуры
#define separator '-' //разделитель разрядов на дисплее
#ifdef _Klesh
volatile bool SosnaKlesh = true; //клещ только проснулся и ещё не обновился
#endif
volatile bool SosnaVoltmeter = true; //вольтметр только проснулся и ещё не обновился
volatile bool DisplayPogashen = true; //флажок указывает на необходимость раскочегаривать дисплей
volatile bool waked0 = false;//только что проснулись и надо инициировать дисплей и клаву
volatile bool spim = false;//устанавливается перед погружением в спячку
//про музыку
uint8_t nomerMelodii = 100; //100 это заведомо несуществующая мелодия ибо их всего 8
//номер воспроизводимой мелодии
uint8_t nomerNoty = 0; //номер ноты
uint8_t metronom = 0; //метроном
int melodii0[8] = {0, 26, 198, 374, 486, 510, 578, 0}; //Началы мелодий
int melodii1[8] = {13, 86, 88, 56, 12, 34, 33, 13}; //длины мелодий в зависимости от их расположения в большом массиве
//uint8_t melodii2[8] = {2, 1, 3, 6, 0, 5, 4, 4}; //раскладка мелодий по порядковым номерам
const uint8_t melodiya010[] PROGMEM =
  //Говорите тише
{ 41, 8, 46, 8, 49, 8, 48, 8, 46, 8, 49, 8, 46, 8, 48, 8, 46, 8, 42, 8, 44, 8, 41, 8, 255, 8,
  //Чунга чанга
  53, 6, 255, 2, 56, 6, 255, 2, 59, 1, 60, 4, 255, 2, 59, 1, 60, 4, 255, 2, 255, 16,
  59, 1, 60, 8, 255, 2, 58, 4, 60, 6, 255, 2, 60, 1, 61, 6, 255, 2, 60, 16, 255, 32,
  65, 6, 255, 2, 56, 6, 255, 2, 54, 1, 55, 4, 255, 2, 54, 1, 55, 4, 255, 2, 255, 8, 55, 6, 255, 2, 255, 4, 56, 4,
  58, 6, 255, 2, 60, 6, 255, 2, 56, 16, 255, 32,
  53, 6, 255, 2, 56, 6, 255, 2, 59, 1, 60, 4, 255, 2, 59, 1, 60, 4, 255, 2, 255, 16,
  59, 1, 60, 8, 255, 2, 58, 4, 60, 6, 255, 2, 60, 1, 61, 6, 255, 2, 60, 32, 255, 16,
  65, 6, 255, 2, 56, 6, 255, 2, 54, 1, 55, 4, 255, 2, 54, 1, 55, 4, 255, 2, 255, 8, 55, 6, 255, 2, 255, 4, 56, 4,
  58, 6, 255, 2, 60, 6, 255, 2, 53, 16, 255, 32,
  //яблочко
  62, 4, 255, 12, 62, 4, 255, 12, 57, 4, 255, 4, 60, 16, 57, 8, 58, 2, 255, 2, 57, 2, 255, 2, 58, 2, 255, 2, 60, 2, 255, 2, 62, 4, 255, 4, 60, 2, 255, 2, 58, 2, 255, 2,
  57, 2, 255, 2, 55, 2, 255, 2, 53, 8, 255, 8, 53, 8, 55, 4, 54, 4, 55, 4, 57, 4, 55, 4, 255, 4, 53, 4, 52, 2, 53, 1, 52, 1,
  50, 2, 255, 2, 52, 2, 255, 2, 53, 8, 255, 8, 53, 6, 255, 1, 55, 2, 53, 1,
  52, 4, 255, 4, 50, 4, 255, 4, 52, 4, 255, 4, 53, 4, 255, 4,
  50, 4, 255, 4, 50, 8, 52, 8, 53, 8,
  55, 4, 54, 4, 55, 4, 57, 4, 55, 4, 255, 4, 53, 4, 52, 4,
  50, 4, 52, 4, 53, 4, 255, 8, 53, 6, 255, 1, 55, 2, 53, 1,
  52, 4, 255, 4, 50, 4, 255, 4, 52, 4, 255, 4, 53, 4, 255, 4, 50, 8, 255, 24,
  //5*8+3*7+2*4+18=87
  //коробейники
  52, 12, 53, 6, 55, 8, 57, 8, 53, 8, 50, 8, 57, 8, 55, 4, 53, 4, 52, 12, 53, 4, 55, 8, 57, 8,
  53, 8, 50, 7, 255, 1, 50, 8, 255, 8,
  58, 12, 55, 4, 62, 8, 60, 4, 58, 4, 57, 12, 58, 4, 57, 8, 55, 4, 53, 4,
  52, 12, 53, 4, 55, 8, 57, 8, 53, 8, 50, 6, 255, 2, 50, 8, 255, 8,
  58, 12, 55, 4, 62, 8, 60, 4, 58, 4, 57, 12, 58, 4, 57, 8, 55, 4, 53, 4,
  52, 12, 53, 4, 55, 8, 57, 8, 53, 8, 50, 6, 255, 2, 50, 8, 255, 8,
  //5*6+3*5+10
  //ёлочка
  49, 8, 58, 7, 255, 1, 58, 7, 255, 1, 56, 8, 58, 8, 54, 8, 49, 7, 255, 1 , 49, 7, 255, 1,
  //кузнечик
  57, 8, 52, 8, 57, 8, 52, 8, 57, 8, 56, 7, 255, 1, 56, 8, 255, 8, 56, 8, 52, 8, 56, 8, 52, 8, 56, 8, 57, 7, 255, 1, 57, 8, 255, 8,
  57, 8, 52, 8, 57, 8, 52, 8, 57, 8, 56, 7, 255, 1, 56, 8, 255, 8, 56, 8, 52, 8, 56, 8, 52, 8, 56, 8, 57, 8, 255, 16,
  //гуси
  53, 8, 52, 8, 50, 8, 48, 8, 55, 12, 255, 4, 55, 12, 255, 4,
  53, 8, 52, 8, 50, 8, 48, 8, 55, 12, 255, 4, 55, 12, 255, 4,
  53, 8, 57, 7, 255, 1, 57, 8, 53, 8, 52, 8, 55, 7, 255, 1, 55, 8, 52, 8, 50, 8, 53, 8, 52, 8, 50, 8, 48, 12, 255, 2, 48, 16
}; //нота
int Noty[] = {
  31, 33, 35, 37, 39, 41, 44, 46, 49, 52, 55, 58, 62,
  65, 69, 73, 78, 82, 87, 93, 98, 104, 110, 117, 123,
  131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247,
  262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494,
  523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988,
  1047, 1109, 1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760, 1865,
  1976, 2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 3520,
  3729, 3951, 4186, 4435, 4699, 4978
};

void NastrojkiDefoult() { //перенос в EEPROM дефолтных настроек
  for (byte j = 0; j < KolichestvoNastroek; j++)  {
    switch (pgm_read_byte(&NastrDef[j][4]) ) {
      case _ppPrivyazka: //однобайтовые настройки
      case _ppEEPROM_1_Byte: {
          EEPROM.write(pgm_read_byte(&NastrDef[j][0]), pgm_read_byte(&NastrDef[j][1]));
          break;
        }
#ifdef _Regulyator
      case _ppTerm:
      //case _ppNastrOsveshennost:
      case _ppEEPROM_2_Byte:
        { EEPROM.write(pgm_read_byte(&NastrDef[j][0]), pgm_read_byte(&NastrDef[j][1]));
          EEPROM.write(pgm_read_byte(&NastrDef[j][0]) + 1, pgm_read_byte(&NastrDef[j][2]));
          break;
        }
#endif
    }
  }
  //EEPROM.write(Nastr0, Versiya);
}
void NastrojkiRead() { //считывание в оперативу нужных настроек из EEPROMа
#ifdef _otladkaUART
  uartToON();
  OUT_PinV = false;
#else//#ifdef _otladkaUART
  if (EEPROM.read(pgm_read_byte(&NastrDef[NastrUART_ON][0])) == 1) {uartToON();}
  else {
    uartToOFF();
  }
#endif//#ifdef _otladkaUART
  ramNastrPorog50V = EEPROM.read(pgm_read_byte(&NastrDef[NastrPorog50V][0]));
  //промежуточные значения не будем хранить в памяти будем считывать по необходимости
  //   ramNastrPorog42V= EEPROM.read(NastrPorog42V);
  //   ramNastrPorog40V= EEPROM.read(NastrPorog40V);
  //   ramNastrPorog37V= EEPROM.read(NastrPorog37V);
  //   ramNastrPorog35V= EEPROM.read(NastrPorog35V);
  ramNastrPorog33V = EEPROM.read(pgm_read_byte(&NastrDef[NastrPorog33V][0]));
  ramNastrPorog30V = EEPROM.read(pgm_read_byte(&NastrDef[NastrPorog30V][0]));
  if (EEPROM.read(pgm_read_byte(&NastrDef[NastrPowerOtSeti][0])) == 1) {
    PowerRejim = PowerOtSeti;
  }
  else {
    PowerRejim = PowerJarim;
  }

 

b707
Offline
Зарегистрирован: 26.05.2017

это не индусский - это индусский в квадрате. Можете больше не выкладывать, свое любопытство я удовлетворил. Очень напоминает код, сгенерированный программой FLProg

Такое нет смысла "оптимизировать", это проще просто выкинуть и написать заново.

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:
просто выкинуть и написать заново.

я выложил не чтобы похвалиться а чтобы вы хоть маленько могли чему-то меня научить
Хотелось бы по пунктам.

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

]я выложил не чтобы похвалиться а чтобы вы хоть маленько могли чему-то меня научить

Хотелось бы по пунктам.

сорри, вы ответили раньше я не успел дописать.

Более подробно сказать - надо видеть больше кода. У вас в этом куске, собственно, ничего не происходит, почти одно обьявление переменных. Как я могу тут что-то посоветоывать, если я не вижу, как эти переменные используются. Например, зачем столько миллисов и указателей на них? Или почему такая сложная система настроек через кучу enum. По-моему., использование enum - это ошибка. они затрудняют итерацию по настройкам. Ниже мы видим начало работы с настройками - и мои предположегния подтверждаются. Тут нет "дестких ошибок", это просто очень корявый неэффективный код. Например, чтение настроек из ЕЕПРОМ  по адресу, который хранится в многомерном массиве во флеш, который в свою очередь вычисляется по ссылке из другого массива. Это даже не удаление гланд через задницу, это хуже.

но на этом код обрывается и что там дальше - непонятно.

Если хотите - можете прислать мне код целиком на почту. Обещаю никуда не выкладывать и не показывать в конференции

Хотя нет, не надо. Ваш стиль кода таков, что, повторюсь. тут не получится что-то изменить в одном месте, тут надо просто переписывать с чистого листа.

 

Logik
Offline
Зарегистрирован: 05.08.2014

Да, b707, жги напалмом, не стесняйся! 

b707
Offline
Зарегистрирован: 26.05.2017

вот, например, про миллисы. Можно предположить, что у вас для каждого таймера свой миллис. Зачем так сделано? - если у вас в каждый момент работы имеется только один таймер - для всех таймеров хватит одного миллиса. Если у вас много таймеров - то организуйте таймеры в виде массива или оформите в виде класса. чтобы у вас в коде быа одна процедура. работающая с текущим сработавшим таймером.

А сейчас - я код не видел - но предполагаю что у вас для работы с каждым этим миллисом свое условие в коде

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

почему у меня "иоптваюмать"  на языке вертица?  И левая ладошка хочет закрыть всё лицо? 

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

почему у меня "иоптваюмать"  на языке вертица?  И левая ладошка хочет закрыть всё лицо? 

посоветуй автору свою библиотеку таймеров. это избавит его от кучи "байтовых указателей на миллис" - даж не знаю, что это такое :)

Logik
Offline
Зарегистрирован: 05.08.2014

DetSimen пишет:

почему у меня "иоптваюмать"  на языке вертица?  

Не парся, оно у тя всегда вертится.

b707
Offline
Зарегистрирован: 26.05.2017

Logik пишет:

Да, b707, жги напалмом, не стесняйся! 

да ладно, какое там "жечь". а то вы не знаете, как я пишу. когда "жгу"

Я в высшей степени терпимо и благожелательно комментирую код автора.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Logik пишет:

DetSimen пишет:

почему у меня "иоптваюмать"  на языке вертица?  

Не парся, оно у тя всегда вертится.

Ну да, пока я трезвый.  

Наданапица. 

Если автору поможет, вэлкам   https://github.com/DetSimen/Arduino_TimerList

О, надо кстати, под Леонарду настройки выкласть.  Вчера поправил.  Спасибо

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:

вот, например, про миллисы. Можно предположить, что у вас для каждого таймера свой миллис. Зачем так сделано? - если у вас в каждый момент работы имеется только один таймер - для всех таймеров хватит одного миллиса. Если у вас много таймеров - то организуйте таймеры в виде массива или оформите в виде класса. чтобы у вас в коде быа одна процедура. работающая с текущим сработавшим таймером.

А сейчас - я код не видел - но предполагаю что у вас для работы с каждым этим миллисом свое условие в коде

все интервалы 1,20,32,50,500 и 1000 используются одновременно и всегда и для совершенно разнородных целей, набор которых зависит от вариантов сборки.

и жалко времени на вытаскивание цифр из каки-либо массивов
рисовать класс из за одного "if" не вижу смысла.

Пользовательские таймеры оформлены в массив. 

либу Timer-master я видел но к тому моменту у меня уже было написано и я не увидел повода переделывать.

Logik
Offline
Зарегистрирован: 05.08.2014

b707 пишет:

Logik пишет:

Да, b707, жги напалмом, не стесняйся! 

да ладно, какое там "жечь". а то вы не знаете, как я пишу. когда "жгу"

Я в высшей степени терпимо и благожелательно комментирую код автора.

А хотелось бы обективного коментария. Например почему декларативный подход , примененный в коде для описания настроек и их ограничений это "удаление гланд через задницу".  Можно на примере считывания всех настроек и выводе их, ну в сириал к примеру, и обратной загрузки из сириала с проверкой диапазона. Интересно Ваше виденье, очевидно без массивов и минимальных и максимальных значений в прогмеме.

Logik
Offline
Зарегистрирован: 05.08.2014

DetSimen пишет:

 

Ну да, пока я трезвый.  

Наданапица. 

Полюбому. Пятница же. К тому же тут и "апоговорить" наметилось.

b707
Offline
Зарегистрирован: 26.05.2017

Logik пишет:

А хотелось бы обективного коментария. Например почему декларативный подход , примененный в коде для описания настроек и их ограничений это "удаление гланд через задницу".

проверки настроек на ограничения в коде не увидел. А почему "через задницу" - поясню. У нас уже есть индексы настроек, сохраняемые в монструозных enumaх.  Эти индексы, в свою очередь указывают на индексы ЕЕПРОМ через не менее монструозные массивы во флеш. И окончательный апофеоз - все эти индексы и массивы используются, чтобы читать настройки в отдельно именованные переменные. с которыми потом не напишешь нормального структурированного кода.

Вот пример:

ramNastrPorog50V = EEPROM.read(pgm_read_byte(&NastrDef[NastrPorog50V][0]));
 ramNastrPorog33V = EEPROM.read(pgm_read_byte(&NastrDef[NastrPorog33V][0]));
 ramNastrPorog30V = EEPROM.read(pgm_read_byte(&NastrDef[NastrPorog30V][0]));

 

b707
Offline
Зарегистрирован: 26.05.2017

"А поговорить" - я тут вижу яркий пример, когда неэффективный код усугубляется желанием обьять необьятное - таким как 10 термометров в часах или 20 миллис-таймеров... или 78 настроек... В ЧАСАХ?

b612 - интересно, сколько из 20 повторивших ваши часы поменяли хотя бы пять настроек из доступных 78?

 

 

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:

Logik пишет:

А хотелось бы обективного коментария. Например почему декларативный подход , примененный в коде для описания настроек и их ограничений это "удаление гланд через задницу".

проверки настроек на ограничения в коде не увидел. А почему "через задницу" - поясню. У нас уже есть индексы настроек, сохраняемые в монструозных enumaх.  Эти индексы, в свою очередь указывают на индексы ЕЕПРОМ через не менее монструозные массивы во флеш. И окончательный апофеоз - все эти индексы и массивы используются, чтобы читать настройки в отдельно именованные переменные. с которыми потом не напишешь нормального структурированного кода.

Вот пример:

ramNastrPorog50V = EEPROM.read(pgm_read_byte(&NastrDef[NastrPorog50V][0]));
 ramNastrPorog33V = EEPROM.read(pgm_read_byte(&NastrDef[NastrPorog33V][0]));
 ramNastrPorog30V = EEPROM.read(pgm_read_byte(&NastrDef[NastrPorog30V][0]));

 

Прогмемовый массив 

//[x][0]-адрес в EEPROM,для двухбайтовой 2 ячейки сначала младший потом старший байты

  //[x][1]-дефолтное значение, младший байт
  //[x][2]-для однобайтовых - минимальное значение, для двухбайтовых - старший байт дефолтного значения
  //[x][3]-для однобайтовых - максимальное значение, для двухбайтовых индекс массива допов
  //[x][4]-подпрограмма редактор данной настройки
 
Есть меню настроек, пункты которого не обязаны совпадать с адресами настроек в Еепроме и вообще могут никак не относиться к переменным, например регулировка времени.
Можно было бы оформить не как двумерный а как массив структур. Вроде разница только в читаемости кода.
Logik
Offline
Зарегистрирован: 05.08.2014

Использовать индексы сразу напрямую не получится, настройки имеют разную длину, читай разный тип. При чтении/записи это придется откуда то узнавать. Информацию о типе и хранит последнее поле NastrDef.

// Вот пример:

Продолжайте, не останавливайтесь на 3-х. Их там всего пол сотни )))

Уверены что 5 таймеров на миллис через массив обязательно, а пол сотни настроек вот так линейно - оно лучше?

Я бы как раз наоборот утверждал.

Видите, b612, а вы думали у Вас код непонятный ;)

Logik
Offline
Зарегистрирован: 05.08.2014

b612 пишет:

Можно было бы оформить не как двумерный а как массив структур. Вроде разница только в читаемости кода.

Я бы туда скорей указатели на переменные с вычитаными настройками добавлял. Но не факт, надо смотреть и  думать подробней как эти настройки использовать.

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

Прогмемовый массив 

//[x][0]-адрес в EEPROM,для двухбайтовой 2 ячейки сначала младший потом старший байты

  //[x][1]-дефолтное значение, младший байт
  //[x][2]-для однобайтовых - минимальное значение, для двухбайтовых - старший байт дефолтного значения
 
почему дефолтное значение не хранится на месте основного, это было бы логично
 
 
Цитата:
  //[x][4]-подпрограмма редактор данной настройки
 
подпрограмма в каком виде? - указатель на функцию?

 

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:
- интересно, сколько из 20 повторивших ваши часы поменяли хотя бы пять настроек из доступных 78?
согласен большинство настроек нафиг не нужны

Примеры:
Подруга попросила чтобы время было розовеньким
Один попросил отключить "зайчиков"
Другой изменить яркость, поскольку у него был менее прозрачный рассеиватель
Мама и бабушка попросили чтобы время показывалось подольше
Сестрёнка - изменить громкость и раскладку мелодий по часам
Почти у всех пожелания к набору показателей
Почти все настраивают порог сработки освещенности под свою комнату

Сначала настроек стало 12, а когда под них был сделан механизм редактирования и хранения, то пришел злобный АППЕТИТ )) 
И почти все параметры, которые имело хоть какой-то смысл настраивать, оказались в настройках

 

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:
почему дефолтное значение не хранится на месте основного, это было бы логично

....
Цитата:
  //[x][4]-подпрограмма редактор данной настройки
 
подпрограмма в каком виде? - указатель на функцию?
если дефолтное хранить на месте рабочего тогда где хранить рабочее ?
 
Не указатель, а некое число, по которому уж потом select-ы выбирают нужную подпрограмму.
Не сделал указатели потому, что для конкретной настрйки может использоваться несколько подпрограмм.
wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

случайно заглянул.

Я правильно понял, что дискуссия о качестве кода новичка и его пример выше по тексту?

"Новичек" отстаивает право писать херню, а Б707 с ним дискутирует, так? Я встряну нахально? Спасибо!

Ну что сказать. Код написан старым программистом. Так писали промышленные проекты в 80ые и начало 90-ых годы.  Отличительный признак - куча дефайнов, условная компиляция, полный горшок глобальных переменных, "магические массивы" настроек. Функции - без параметров (а и правда - нахуа? - если всё в глобалах?!) Короче  - всё как мы "любим"! ;)))))

Я не стану говорить, что код - плохой. В этом стиле написаны миллионы строк, некоторые до сих пор работают. Читать, править, поддерживать такое невозможно совсем и категорически. Просто тихо пришел 21 век, с контроллерами, в которых вдруг стало хватать памяти для удобно структурированных данных. Выяснилось, что надежность памяти много выше надежности механических частей изделий и можно не экономить ее. И наконец стали уходить на пенсию бывшие "фортранщики" и пррограммисты, пишущие на Си, как на Фортране! ;)))) Неожиданно оказалось, что можно писать на С++ даже для контроллеров и код это можно прочесть, понять и поддерживать, даже если ты его увидел два часа назад.

Повторю: мы живем в 21 веке. Мне (к примеру) 50 и от привычек трудно отказываться, но надо. Не нужно так писать, как в приведенном фрагменте. Или и правда никому не показывать! ;))))

b707
Offline
Зарегистрирован: 26.05.2017

Logik пишет:

Продолжайте, не останавливайтесь на 3-х. Их там всего пол сотни )))

Уверены что 5 таймеров на миллис через массив обязательно, а пол сотни настроек вот так линейно - оно лучше?

я вижу только три, дальше код обрывается. Насчет задания полсотни настроек линейно - я именно об этом и писал, что это неэффективно даже для трех.

В этом коде очевидно всплывает другая проблема - и я уже о ней писал. Очень много усилий потрачено на то, чтобы дать пользователям возможность настраивать программу, не давая доступ к коду. Если бы мы распространяли блинк в HEX и нужно было дать возможность юзерам задавать свои пины и интервалы - код наверно тоже получился бы в 500 строк :)

В нормальной жизни программа пишется под некий набор параметров, кому надо другое - открывают исходник и настраивают под себя. Так что эти 6000 строк кода вместо нормальных 1000 - это цена за параною

 

b612
Offline
Зарегистрирован: 12.03.2017

Logik пишет:
Я бы туда скорей указатели на переменные с вычитаными настройками добавлял. Но не факт, надо смотреть и  думать подробней как эти настройки использовать.
указатели вроде больше чем один байт занимают.

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:
я вижу только три, дальше код обрывается. Насчет задания полсотни настроек линейно

....

В этом коде очевидно всплывает другая проблема - и я уже о ней писал. Очень много усилий потрачено на то, чтобы дать пользователям возможность настраивать программу, не давая доступ к коду.

да согласен,меню из 77 пунктов это перебор. Но с таким скромным таблом лучше ничего не придумалось.
Ну и самые основные настройки поместил на самый верх, а в глубине уже для особо дотошных.

Я делал часики не для программистов, а в основном для себя, а потом уж для родственников

b707
Offline
Зарегистрирован: 26.05.2017

wdrakula пишет:

"Новичек" отстаивает право писать херню, а Б707 с ним дискутирует, так? Я встряну нахально? Спасибо!

я уже чувствую. что зря ввязался. Должен признаться, что код оказался не такой новичковый. как я предполагал сначала. Он больше всего напоминает код FLProg. Ведь никто не скажет, что ФЛПРОГ делает детские ошибки в коде... но нормальные живые программисты такого кода никогда не напишут :)

b612
Offline
Зарегистрирован: 12.03.2017

wdrakula пишет:
"Новичек" отстаивает право писать херню, а Б707 с ним дискутирует, так
Да уж.
Мы выросли из синклеровского ассемблера MONS и GENS
Теперь вот переучиваемся помаленьку.

До сих пор удивляюсь, как в 48К вписывались такие объёмные игры ?! Шахматы, Элита...

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Вывсеврети!!!   Я тоже из Gensa и Monsa вырос, но такое даже с жестокого пахмелья не напишу. 

b612
Offline
Зарегистрирован: 12.03.2017

DetSimen пишет:

Вывсеврети!!!   Я тоже из Gensa и Monsa вырос, но такое даже с жестокого пахмелья не напишу. 

ок. давайте по пунктам

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Я на свой дедакод ссылку давал, выше. 

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

если дефолтное хранить на месте рабочего тогда где хранить рабочее ?

зачем хранить и то и то? Дефолтное - значение, которое используется. если юзер не задал своего. как только юзер его задал - дефолтное больше не нужно.

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:
зачем хранить и то и то? Дефолтное - значение, которое используется. если юзер не задал своего. как только юзер его задал - дефолтное больше не нужно.
всегда должна быть кнопка
"вернуть как было"

b612
Offline
Зарегистрирован: 12.03.2017

DetSimen пишет:

Я на свой дедакод ссылку давал, выше. 

Отличная либа ! Высший сорт !
на мой взгляд даже лучше чем таймер-мастер

похоже вы росли на на 1С

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

всегда должна быть кнопка
"вернуть как было"

пусть зальет исходную прошивку заново

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:
пусть зальет исходную прошивку заново
сомневаюсь, что бабушка правильно поймёт это словосочетание

)))

К стати столкнулся с проблемкой когда поставил сенсорные кнопки.

Если раньше для возврата к дефолтам можно было при включении удерживать кнопки, то сенсоры не удерживаются при включении.

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

сомневаюсь, что бабушка правильно поймёт это словосочетание

ну это мне вообще не понятно. Для мамы. бабушки. сестренки - наверняка вы сами и настраиваете. а значит любой метод подходит, в том числе и параметры прямо в коде.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

b612 пишет:

похоже вы росли на на 1С

А вот щас обидно было. Если ты мня оскорбить хотел, у тебя получилось. Потому, больше сюда не лезу. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Да ладно, главное что не на LSD... В конце-концов всякие там Рапиды были же. 

PS. Рапида из другой оперы, оказывается. А какой же язык язык был с русскоименными операторами...

b612
Offline
Зарегистрирован: 12.03.2017

DetSimen пишет:
А вот щас обидно было. Если ты мня оскорбить хотел, у тебя получилось. Потому, больше сюда не лезу.
оскорбить упаси Бог .
Просто я работал в основном на 1С. Нормальные программисты не считают её за среду программирования.

А нормальные языки я только в качестве хобби ковырял.

b612
Offline
Зарегистрирован: 12.03.2017

ой

b612
Offline
Зарегистрирован: 12.03.2017

b612 пишет:

DetSimen пишет:
А вот щас обидно было. Если ты мня оскорбить хотел, у тебя получилось. Потому, больше сюда не лезу.
оскорбить упаси Бог .
Просто я работал в основном на 1С. Нормальные программисты не считают её за среду программирования.

Хотя я на счет неё ничего плохого сказать совершенно не хочу.

А нормальные языки я только в качестве хобби ковырял.

Feofan
Offline
Зарегистрирован: 28.05.2017
sadman41 пишет:
А какой же язык язык был с русскоименными операторами...
ЯМБ, к примеру.
Logik
Offline
Зарегистрирован: 05.08.2014

Ну и где пятничный срачь, я вас спрашиваю? Тока же отлучился пивка хлебнуть...

b612 пишет:

Logik пишет:
Я бы туда скорей указатели на переменные с вычитаными настройками добавлял. Но не факт, надо смотреть и  думать подробней как эти настройки использовать.
указатели вроде больше чем один байт занимают.

Да. Два. Но потеря одного байта на параметр компенсируется отсутствием необходимости еще разбирать куда сохранять данные для соответствующего id или откуда их брать. Но указатели не всегда востребованы просто по стилю и  задаче.  Например параметр - время планировщика с точностью до минуты. Нахрена его вооще в ОЗУ держать? Началась новая минута - прочитал куда либо в временную локальную переменную параметр, сравнил с текущим временем и можно переменную похерить. Указатель ненужен. Другое дело прерывание по просадке питания, и надо срочно пока на электролите работает сохранить параметры которые могли менятся как раз. Тут указатель очень выручит.

b707 пишет:

В этом коде очевидно всплывает другая проблема - и я уже о ней писал. Очень много усилий потрачено на то, чтобы дать пользователям возможность настраивать программу, не давая доступ к коду. 

хмм... во всех случаях где я пользователь каких то чужих прог - именно так. Я вобще себе не представляю иначе. Это типа на телике громкость убавить - правь исходник ? 8))))  А чем в этом плане часы на стене от ТВ отличаются?

b707 пишет:

 Так что эти 6000 строк кода вместо нормальных 1000 - это цена за параною

Вы  не о тех масштабах цифр говорите.

Примеры[править | править код]

Размеры исходных кодов операционных систем семейства Microsoft Windows NT точно не известны, но, согласно источнику[4], они составляют:

Год Версия Строк кода, млн.
1993 Windows NT 3.1 4-5
1994 Windows NT 3.5 7-8
1996 Windows NT 4.0 11-12
2000 Windows 2000 >29
2001 Windows XP 45

Размеры исходных кодов ядра Linux вместе с включёнными туда драйверами устройств можно посчитать точно:

Год Версия Строк кода
1991 Ядро Linux 0.1 10 239
1994 Ядро Linux 1.0.0 176 250
1995 Ядро Linux 1.2.0 310 950
1996 Ядро Linux 2.0.0 777 956
1999 Ядро Linux 2.2.0 1 800 847
2001 Ядро Linux 2.4.0 3 377 902
2003 Ядро Linux 2.6.0 5 929 913
2009 Ядро Linux 2.6.32 12 606 910[5]
2012 Ядро Linux 3.6 15 868 036[6]
2017 Ядро Linux 4.11.7 18 373 471[7]

Размеры других систем:

Год Версия Строк кода
- PostgreSQL 775 000
- 1C 3 000 000
2008 1С-Битрикс 762 854
 

Просто большие и сложные программы имеют много строк. Это аксиома, запомните. Это потому что в большой горе много камней, а в большом океане - много воды, в большом лесу - много деревьев. Иначе просто не бывает. И Ваш ужас от 3-6 тыс. строк просто означает что Вам не приходилось работать над большими и сложными проектами, тут нечего и обсуждать особо. Я же, например, много лет работал с проектом в несколько млн. строк, (по правде кто их там считал те строки, но с репозитория полторы сотни мегабайт тянулось вот и прикинуть не сложно). И это все для маленького терминальчика на кассе. Ниче так, привыкли. И это вполне 21век, и именно так, на чистом Си потому что так лучше ;) У этой беды есть обратная сторона, таким разрабам платят не по расценкам из "Ищу исполнителя" за 1000 строк. Так что все факты сходятся.

ПС. Представляете наскоко мне пофиг 1000 там строк или 3000 или 6000. А вот размер скомпилированого -  совсем не пофиг?