Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!

Какое отношение имеют обитатели аквариума к управляющему контроллеру?
По поводу влажности — 2 кулера, периодически выгоняющих воздух из крышки, вполне достаточно.

struct sDateTime
{
uchar sec;
uchar min;
uchar hour;
uchar wday;
uchar mday;
uchar mon;
uchar year;
uchar timeFlag;
};
sDateTime now, newTime;
…
GetDateTimeFromRTC(&now);
…
if (now.sec == 0)
{
…
}
…
void SetDateTimeToRTC(const sDateTime * _time)
{
uchar tmp[9];
tmp[0] = CHIP_RTC; // Set TWI RTC address
tmp[1] = 0; // Set «0» addres in RTC
tmp[2] = (_time->sec & 0x7F);
tmp[3] = (_time->min & 0x7F);
tmp[4] = (_time->hour & 0x3F);
tmp[5] = (_time->wday & 0x07);
tmp[6] = (_time->mday & 0x3F);
tmp[7] = (_time->mon & 0x1F);
tmp[8] = _time->year;
TWIWriteBlock(9, tmp);
}
// делаем стрктуру с данными для работы
struct sWorkData
{
ulong k1; // коэффициент 1 для каллибровки PH-электрода
…
uchar cooler_start_pulse[4]; // отсчет интервалов времени для формирования стартовых импульсов кулеров
…
uint devSetFlags;
//uint crc16; — не участвует в стркуктуре для экономии ОЗУ но есть во флеш
};
// делаем объединение для возможности работы с блоком памяти как с массивом и структурированными данными
union
{
uchar byte[sizeof(sWorkData)];
sWorkData st;
} WorkDatablock;
// когда нужно, например, считать настройки, обращаемся к блоку памяти как к массиву, пример моего кода:
// читаем таблицу размещения настроек режимов всегда по адресу «0»
if (!GetMemBlock((ulong)WORK_MODE_TABLE_START_ADR, (uint)sizeof(sWorkData), WorkDatablock.byte))
{
// ошибка при чтении блока, аварийный выход
LCD_send(0x0E,'r',0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0,0);
return false;
}
// когда нужно работать со структурированными данными:
WorkDatablock.st.k1 = 1000;
…
if (WorkDatablock.st.cooler_start_pulse[0] > 0)…
…
bool GetMemBlock(ulong start, uint dataSize, uchar * data)
{
uchar tmpData;
uint s, memCrc, crc = 0xFFFF;
// записываем команду непрерывного чтения
memStart();
SPIRW(0x03); // непрерывное чтение
memSetAdr(start);
for(s = 0; s < dataSize; s++)
{
// читаем байт из флешки
tmpData = SPIRW(0);
data[s] = tmpData;
// считаем crc
crc = crc16update(tmpData, crc);
}
// читаем значение CRC16
memCrc = SPIRW(0);
memCrc |= (SPIRW(0) << 8);
memStop();
// проверяем
if (crc == memCrc)
{
return true;
}
else
{
return false;
}
}
Реализация универсального аквариумного контроллера