Подписаться на получение новых статей на почту:

Контроллер сбора данных на AVR ( логгер ). Шаг №39

Всем привет. В прошлый раз мы рассмотрели работу двух микроконтроллеров и карты памяти по интерфейсам TWI и SPI. Это был последний подготовительный этап для сборки контроллера сбора данных (логгера). Для сборки кода логгера просто берем  ранее написанные алгоритмы и сводим в общий: датчик влажности DHT11 (Статья №20), датчики температуры DS18B20 (Статья №6 и №18),

 часы реального времени DS1307 (Статья №29 и №30), коррекция времени кнопками на АЦП(Статья №32 и №33), семи сегментный индикатор (Статья №5), работа с файловой системой Petit FatFs (Статья №22 и №23) и SD-картой (Статья №19 и №24) , интерфейс TWI (Статья №28, №34, №35), SPI (Статья №19) и спящий режим микроконтроллера (Статья №36 и № 37). Также можно посмотреть визуальную карту данного устройства. 

На рисунке ниже приблизительный вид нашего устройства в протеусе (Proteus), где также визуально отображается порядок работы устройства. Работа устройства состоит в следующем: в опросе датчиков температуры (1), влажности(2), коррекции времени по нажатию копки(3) и считывание времени и даты (4), вывод значений на индикатор, передача информации на второй микроконтроллер по TWI (6) и далее на карту по SPI (7).

Логгер на AVR в Proteus

Ниже основной код отображающий работу устройства.

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. Но данная программа позволила отладить все тонкости для запуска в железе.

Логгер на AVR передача данных

Результат записи ведомым на карту SD в файл data.txt:

Логгер запись данных в Proteus

Как вы помните в статье №23 мы рассмотрели файловую систему и научились до записывать в файл информацию, поэтому 1 – это номер сектора в который записываются данные.

На рисунке ниже вид нашего устройства и результат его работы в текстовом файле.

контроллер сбора данных на AVR или логгер

Логгер запись данных

Что ж подведем итог. Используя ранее написанные и рассмотренные коды в статьях (выше) мы с Вами собрали самый простой логгер. Конечно важный момент наладки и связки кода но это дело индивидуальное и каждый подходит к нему по своему. Как видите для логгера необходимо брать “камень” побольше. Такое решение в большой мере было выбрано в учебных целях, хотя  и в таком соединении есть свои плюсы. Следующим шагом будет рассмотрение протокола  UART, рассмотрим передачу данных на персональный компьютер, протестируем в симуляторе и железе. Экспериментируйте, пробуйте, критикуйте. На этом все. Всем пока.

Просмотрено 2906 раз.

Я на Google+

Контроллер сбора данных на AVR ( логгер ). Шаг №39: 2 комментария

  1. Интересное решение. Я так пониаю все это можно перенести на один контроллер, без использования TWI. Но все равно спасибо автору за материал.

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting