вторник, 7 июня 2016 г.

Ардуино подключаем ЧРВ и SD карту


Постепенно приближаемся к реализации нашего нового проекта. Но пока приходиться все делать по шагам. Сегодня мы сделаем еще один шаг вперед: научимся подключать к ардуино часы реального времени и SD карту. И более того будем записывать данные на карту памяти. А начнем с подключения отдельных блоков.

Первый блок это ЧРВ (часы реального времени). На этот раз мы подключим пины следующим образом:  GND-GND, VCC-+5V, RST-5, CLK-7, DAT-6. При этом указанные пины (5,6,7) в скетче можно всегда заменить на другие.  Итак, модуль ЧРВ мы подключили…

Теперь давайте подключим SD карту. Для этого проще всего воспользоваться схемой, и тогда точно не запутаетесь в куче проводов идущего от модуля SDкарты. На всякий случай на схеме отобразим подключения обоих модулей.  Итак схему собрали, но перед тем как переходить к скетчу давайте установим библиотеки:   <SPI.h>, <SD.h>, и  <RTC.h>. Все эти библиотеки можно загрузить с Яндекс диска (по отдельности) или сразу общимархивом.

Теперь что будет собственно делать скетч. В нашем проекте мы будем вести несколько логов (общий и отдельные логии для записи времени и случайных чисел) на карте памяти. Кстати не забудьте сразу же на компьютере отформатировать карту в FAT32 (FAT16). По сути дела мы будем (в следующем проекте подключать датчики) записывать на карту памяти время, и случайные числа (пока еще не подключили датчик атмосферного давления). Скетч можно так же загрузить с Яндекс диска жми сюда....

#include <SPI.h>
#include <SD.h>
#include <RTC.h>
RTC    time;
//Set by default for the SD card library
//MOSI = Pin 11
//MISO = Pin 12
//SCLK = PIN 13
//We always need to set the CS Pin
const int CS_PIN  =10;
long datet;
//We set this high to provide power
const int POW_PIN =8;

void setup()
{
   time.begin(RTC_DS1302,5,7,6);
  Serial.begin(9600);
  Serial.println("Initializing Card");
  //CS pin is an output
  pinMode(CS_PIN, OUTPUT);

  //Card will draw power from pin 8, so set it high
  pinMode(POW_PIN, OUTPUT);
  digitalWrite(POW_PIN, HIGH);

  if (!SD.begin(CS_PIN))
  {
    Serial.println("Card Failure");
    return;
  }
  Serial.println("Card Ready");
}

void loop()
{
    int dataString = random (1000);
    // datet
  // time.gettime("d-m-Y, H:i:s, D");
    //Open a file and write to it.
  File dataFile = SD.open("log.csv", FILE_WRITE);
  if (dataFile)
  {
    dataFile.print(time.gettime("H:i"));
    dataFile.print(",");
    dataFile.println(dataString);
    dataFile.close();
  }
       
 // отделный лог для случ чисел

 dataFile = SD.open("ran.csv", FILE_WRITE);
  if (dataFile)
  {
        dataFile.println(dataString);
    
   dataFile.close();
 
  }

 // отдельный лог для времени
 dataFile =SD.open("tame.csv", FILE_WRITE);
  if (dataFile)
  {
        dataFile.println(time.gettime("H:i"));
    
   // dataFile.flush();
    
  }
       dataFile.close();
  delay(5000);
}


воскресенье, 5 июня 2016 г.

Начинаем работать с часами реального времени


С одной стороны вроде как все и не так сложно. Но с другой есть один момент (такая маленькая хитрость, к которой мы еще вернемся) который нужно будет  учесть при установки точной даты и времени. Это придеться сделать пока в ручную, после чего сразу же закомментировать пару строчек в скетче….

Начнем пожалуй с подключения ЧРВ (часы реального времени) к ардуино. Это как раз несложно. У меня оказался модуль DS1302 и вот как нужно будет подключить выводы:  GND-GND, VCC-+5V, RST-10, CLK-13, DAT-12. При этом указанные пины (10,12,13) в скетче можно всегда заменить на другие.  Итак, модуль ЧРВ мы подключили…

Теперь шаг второй – это скетч. Скетч простой, и первым делом нужно будет в нем вручную изменить (поставить или снять //) в зависимости от модуля чипа. Выбирайте тот модуль который у вас и закомментируйте строчку с ненужным модулем, и раскоментируйте с вашим. Для информации: я использую модуль DS1302.

А вот теперь нам нужно установить точное время. Для начала обратим внимание (это важно!) на следующие две строки в программном коде:
  time.settime(35,10,20);// 35 сек, 10 мин, 20 час, дату оставить без изменений
  time.settime(-1,-1,-1,31,12,15);    // 31, декабря, 2015 года, время и день недели оставить без изменений}

Вот здесь и нужно сначала установить точную дату и время. Причем сделать это нужно заранее перед самой компиляцией. Так же обратите что компиляция и запись скетча в МК тоже займет некоторое время что тоже желательно учесть. Скажем у меня это занимает порядка 20 секунд. Все что мне нужно сделать : синхронизировать время на компьютере, установить время и за 20 секунд  начать компиляцию. После компиляции обязательно (не забудьте это важно!) закомментируйте эти две строчки. Вот и все. Можете пользоваться. Да и еще чуть не забыл: библиотеку RTC.h можно загрузить с Яндекс диска. 

#include <RTC.h>
RTC    time;
void setup() {
    delay(300);
    Serial.begin(9600);
//    инициализация модуля RTC
    // time.begin(RTC_DS3231);// на базе чипа DS3231модуль подключается к аппаратным выводам I2C
  //  time.begin(RTC_DS1307);// на базе чипа DS1307модуль подключается к аппаратным выводам I2C
    time.begin(RTC_DS1302,10,13,12);    // на базе чипа DS1302, вывод RST, вывод CLK, вывод DATдоступны любые выводы
//    запись даты и времени
// time.settime(0,51,21,27,10,15,2);    // 0  сек, 17 мин, 15 час, 1, октября, 2015 года, четверг
  time.settime(35,10,20);// 35 сек, 10 мин, 20 час, дату оставить без изменений
  time.settime(-1,-1,-1,31,12,15);    // 31, декабря, 2015 года, время и день недели оставить без изменений
}
void loop(){
    if(millis()%1000==0){ // если прошла 1 секунда
      Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
      delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
    }