Всем привет. В прошлый раз мы рассмотрели работу двух микроконтроллеров и карты памяти по интерфейсам TWI и SPI. Это был последний подготовительный этап для сборки контроллера сбора данных (логгера). Для сборки кода логгера просто берем ранее написанные алгоритмы и сводим в общий: датчик влажности DHT11 (Статья №20), датчики температуры DS18B20 (Статья №6 и №18),
На рисунке ниже приблизительный вид нашего устройства в протеусе (Proteus), где также визуально отображается порядок работы устройства. Работа устройства состоит в следующем: в опросе датчиков температуры (1), влажности(2), коррекции времени по нажатию копки(3) и считывание времени и даты (4), вывод значений на индикатор, передача информации на второй микроконтроллер по TWI (6) и далее на карту по SPI (7).
Ниже основной код отображающий работу устройства.
while (1){ /*Считываем температуру (шаг №6)*/
ds18b20_search (); /*поиск датчиков*/
read_ds18b20 (); /*считываем показания температуры*/
dtostrf (hg[0],5,1,&block[0]); /*преобразование данные температуры в строку*/
dtostrf (hg[1],5,1,&block[5]); /*датчика на шине 2*/
dhtread (); /*Считываем влажность и температуру датчика DHT11 (шаг №20)*/
do{ /*Цикл коррекции времени по нажатию на кнопку (шаг №33)*/
/*Настройки АЦП для кнопок*/
ADMUX = (0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)| (0<<MUX0);
ADCSRA = (1<<ADEN)|(1<<ADSC)|(0<<ADFR)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
/*Считываем минуты*/
i2cMasterSend (0xD0,1,&buf[0]); /*Обращение к часам и его регистру*/
i2cMasterReceive (0xD0,1,&m);
m = (((m & 0xF0) >> 4)*10)+(m & 0x0F);
_delay_ms (100);
/*Считываем часы*/
i2cMasterSend (0xD0,1,&buf[1]);
i2cMasterReceive (0xd0,1,&h);
h = (((h & 0xF0) >> 4)*10)+(h & 0x0F);
i=h+(m*0.01); /*Формат времени*/
/*Коррекция времени по нажатию кнопки*/
if (i_h==1) /*Часы*/
{
h++;
if (h >= 24)
h=0;
h = ((h/10)<<4) + h%10;
uint8_t bl[2]={0×02,h};
i2cMasterSend (0xD0,2,&bl[0]);
i_h=0;
}
if (i_m==1) /*Минуты*/
{
m++;
if (m >= 60)
m=0;
m = ((m/10)<<4) + m%10;
uint8_t bl[2]={0×01,m};
i2cMasterSend (0xD0,2,&bl[0]);
i_m=0;
}
Display (i);
_delay_ms (2000);
}while ((i_m>=1)||(i_h>=1));
/*Сбрасываем настройки и выключаем прерывание*/
ADMUX=0;
ADCSRA=0;
dtostrf (i,6,2,&block[10]); /*записываем время*/
_delay_ms (50); /*задержка для стабилизации напряжения*/
/*Считываем день, месяц год*/
i2cMasterSend (0xD0,1,&buf[2]); /*Работа с функциями TWI (шаг34)*/
i2cMasterReceive (0xD0,1,&m);
m = (((m & 0xF0) >> 4)*10)+(m & 0x0F);
_delay_ms (100);
i2cMasterSend (0xD0,1,&buf[3]);
i2cMasterReceive (0xd0,1,&h);
h = (((h & 0xF0) >> 4)*10)+(h & 0x0F);
i=h+(m*0.01); /*день и месяц записываем в том же формате что и время */
dtostrf (i,6,2,&block[16]);
Display (i);
_delay_ms (1000);
i2cMasterSend (0xD0,1,&buf[4]); /*Считываем год*/
i2cMasterReceive (0xD0,1,&m);
m = (((m & 0xF0) >> 4)*10)+(m & 0x0F);
itoa (m, &block1, 10); /*преобразовываем число(год) в строку*/
strlcat (block,".",30); /*добавляем в конец строки*/
strlcat (block,block1,30);
itoa (dh[0], &block1, 10); /*выше считанную влажность преобразовываем в строку*/
strlcat (block," H",30);
strlcat (block,block1,30);
i2cSetLocalDeviceAddr (LOCAL_ADDR, TRUE);
i2cMasterSend (TARGET_ADDR,30,&block[0]);/*Передача ведомому и на карту (шаг38)*/
}
На рисунке ниже отображается передача уже преобразованных значений в строку ведомому микроконтроллеру . А именно температура, время, дата и год и влажность. К сожалению в версии протеуса 7.6 датчика DHT11 нет и его библиотеки на поддерживаются, необходима версия 8.0. поэтому у меня все время h0. Также в симуляторе сказывается не стабильная работа интерфейса TWI. Но данная программа позволила отладить все тонкости для запуска в железе.
Результат записи ведомым на карту SD в файл data.txt:
Как вы помните в статье №23 мы рассмотрели файловую систему и научились до записывать в файл информацию, поэтому 1 – это номер сектора в который записываются данные.
На рисунке ниже вид нашего устройства и результат его работы в текстовом файле.
Что ж подведем итог. Используя ранее написанные и рассмотренные коды в статьях (выше) мы с Вами собрали самый простой логгер. Конечно важный момент наладки и связки кода но это дело индивидуальное и каждый подходит к нему по своему. Как видите для логгера необходимо брать “камень” побольше. Такое решение в большой мере было выбрано в учебных целях, хотя и в таком соединении есть свои плюсы. Следующим шагом будет рассмотрение протокола UART, рассмотрим передачу данных на персональный компьютер, протестируем в симуляторе и железе. Экспериментируйте, пробуйте, критикуйте. На этом все. Всем пока.
Интересное решение. Я так пониаю все это можно перенести на один контроллер, без использования TWI. Но все равно спасибо автору за материал.
Да так и есть. Это больше для учебных целей.