среда, 11 марта 2020 г.

Описание Data logging shield v.1 DS1307

Многие люди купили эти дешевые щиты, и у них возникли проблемы с тем, чтобы заставить их работать, а также отметили, что документации очень мало. У меня также были проблемы, и, наконец, после многих часов, я обнаружил, что проблема была скорее механической, чем электрической. Я подумал, что предложу некоторую документацию и некоторые соображения о совместимости с различными моделями Arduino: 

Спецификация: Щит Arduino UNO с полноразмерным устройством для чтения карт SD и часами DS1307 RTC с держателем батареи CR1220 на 3 В. 

Детали: 
1. Плата оснащена регулятором понижения напряжения 3,3 В, что обеспечивает безопасное использование 5 В. 
2. Рядом со штырьком A0 находится светодиод питания. 
3. В середине платы находится область прототипа для вашей собственной экспериментальной схемы.
4. Рядом с кнопкой сброса есть 2 дополнительных светодиода, которые вы можете использовать со своей пользовательской схемой, подключив их к отверстиям для выводов L1 и L2, отмеченным рядом с D4 и D3. 
5. Рядом с отверстием для булавки L1 находится отверстие для булавки Chip Select (CS), соединенное с D10 и используемое SD-картой. 
6. Рядом с A2-A3 имеются отверстия для выводов для 5 В и GND. 
7. Рядом с A4-A5 есть отверстия для выводов I2C SDA, подключенных к A4, и SCL, подключенных к A5, используемых RTC. 
8. Рядом с кристаллом есть 4 отверстия для контактов на 3,3 В, выход прямоугольной волны (SQ) от RTC, обнаружение защиты от записи (WP) от устройства чтения SD, которое будет НИЗКИМ, если на плате есть язычок защиты от записи. установите и, наконец, Обнаружение карты (CD), которая становится НИЗКОЙ, когда карта вставлена. 

Совместимость: 

Arduino UNO - если у вас UNO с разъемом USB типа B, этот экран может НЕ РАБОТАТЬ, потому что штырьки НЕ ДОЛГО ДОСТАТОЧНЫ . Вы можете доказать это, сдвинув кегли D10 - D13 при выполнении эскиза. Тогда вы можете обнаружить, что SD-карта работает, но как только вы отпустите ее, вы, вероятно, получите ошибку чтения / записи карты. Этот экран лучше всего работает на Arduino UNO с разъемом USB типа A или Micro USB. 

Arduino Leonardo - SD-карта является SPI-устройством, но экран не имеет разъема ICSP. На Arduino Leonardo SPI доступен только через разъем ICSP. Вам нужно будет подключить контакты D11 - D13 к соответствующим контактам на разъеме Leonardo ICSP, чтобы использовать этот экран. 

Мегапиксели Arduino Mega - SPI - это D50, D51 и D52, поэтому их необходимо сопоставить с выводами D11-D13 на экране. Также D53 обычно используется для SS, а не D10. На Mega A4 и A5 не используются для I2C, но экран должен отображать A4 и A5 на контакты I2C рядом с AREF. У вас также может быть такая же проблема с разъемом USB типа B. 

вторник, 10 марта 2020 г.

Моя записная книжка: Библиотека OLED_StatusIcons

Моя записная книжка: Библиотека OLED_StatusIcons: OLED_StatusIcons описание дополнения библиотеки OLED_I2C для отображения значков в строке состояния на русском языке Скачать:   на...

Arduino описание библиотеки DS1307

Библиотека DS1307

DS1307

описание библиотеки для использования в Arduino модуля реального времени DS3107 на русском языке





Введение: 

   Эта библиотека была написана для легкого взаимодействия и использования модуля на микросхеме DS1307 с Arduino или chipKit без необходимости использования библиотеки Wire.
   Данная библиотека использует по умолчанию режим Fast Mode (400 кГц) аппаратного интерфейса I2C.
    Работа этой библиотека не гарантируется в режиме одновременной работы с библиотекой Wire и совместного использования контактов. 

Структура:

Time;
Структура управления данными времени и даты.
Переменные
hour, min, sec: Для определения данных времени
date, mon, year: Для определения данных даты
dow: День недели, начиная с понедельника
Пример: Time t; // Определяем структуру с именем t класса "время"

DS1307_RAM;
Буфер для использования совместно с ReadBuffer () и WriteBuffer ().
Переменные: 
Cell [0-56]: Байт-массив для хранения данных, с возможностью чтения или записи в ОЗУ микросхемы.
Пример: DS1307_RAM ramBuffer; // Объявляем буфер для использования


Определенные литералы:

Дни недели
Используется совместно с setDOW() и Time.dow
MONDAY:          1
TUESDAY:         2
WEDNESDAY:  3
THURSDAY:      4
FRIDAY:             5
SATURDAY:      6
SUNDAY:           7

Длина названия
Используется совместно с getTimeStr(), getDateStr(), getDOWStr() and getMonthStr()
FORMAT_SHORT: 1 (полное название)
FORMAT_LONG:  2 (сокращенное (3 буквенное) название)


Формат даты
Используется совместно с getDateStr()
FORMAT_LITTLEENDIAN:    1  (дд.мм.гггг)
FORMAT_BIGENDIAN:          2  (гггг.мм.дд)
FORMAT_MIDDLEENDIAN:  3  (мм.дд.гггг)

Частота на выходе SQW
Используется совместно с setSQWRate()
SQW_RATE_1:     1  (1 Гц)
SQW_RATE_4K:  2  (4096 Гц)
SQW_RATE_8K:  3  (8192 Гц)
SQW_RATE_32K:  4  (32768 Гц)

Функции:

DS1307(SDA, SCL);
Инициализация библиотеки с помощью интерфейса I2C
Параметры:
SDA: Вывод подключения SDA-пина DS1307 (Вывод 5, данные)
SCL: Вывод подключения SCL-пина DS1307 (вывод 6, тактирование)
Пример: DS1307 rtc(SDA, SCL); // Инициализация библиотеки DS13071 с помощью  интерфейса I2C
Примечание: DS1307 можно подключать с любым свободным выводам Arduino. Если в схеме уже используется шина I2C и Вы попытаетесь подключиться к тем же выводам, то данная библиотека работать не будет, т.к. любой TWI-совместимый протокол требует исключительного доступа к пинам.

begin();
Инициализация подключения к DS1307
Параметры: Нет
Возврат: Нет

Пример:  rtc.begin(); //Инициализация подключения к DS1307

getTime();
Считать текущие данные из DS3231.
Параметры: Нет
Возврат: формат Time-structure
Пример: t = rtc.getTime(); // Считать текущую дату и время.

getTimeStr([format]);
Считать текущее время в виде строковой переменной.
Параметры:
format: <необязательный параметр>
     FORMAT_LONG "ЧЧ:ММ:СС" (По умолчанию)
     FORMAT_SHORT "ЧЧ:ММ"
Возврат: Строковое значение, содержащее текущее время с секундами или без них.
Пример: Serial.print(rtc.getTimeStr()); // Отправить текущее время через последовательный порт


getDateStr([slformat[, eformat[, divider]]]);
Считать текущую дату в виде строковой переменной.
Параметры: 
slformat: <необязательный параметр>
     FORMAT_LONG Год из 4х цифр (ГГГГ) (По умолчанию)
     FORMAT_SHORT Год из 2х цифр (ГГ)
eformat: <необязательный параметр>
     FORMAT_LITTLEENDIAN "ДД.ММ.ГГГГ" (По умолчанию)
     FORMAT_BIGENDIAN "ГГГГ.ММ.ДД"
     FORMAT_MIDDLEENDIAN "ММ.ДД.ГГГГ"
divider: <необязательный параметр>
Символ для разделения. По умолчанию '.'
Возврат: Строковое значение, содержащее текущую дату в указанном формате.
Пример: Serial.print(rtc.getDateStr()); // Отправить текущую дату через последовательный порт (В формате "ДД.ММ.ГГГГ")

getDOWStr([format]);
Считать текущий день недели в виде строковой переменной.
Параметры:
format: <необязательный параметр>
     FORMAT_LONG День недели на английском языке (По умолчанию)
     FORMAT_SHORT Сокращенное название дня недели на английском языке (3 символа)
Возврат: Строковое значение, содержащее текущий день день недели в полном или сокращенном формате.
Пример: Serial.print(rtc.getDOWStr(FORMAT_SHORT)); // Отправить сокращенное название текущего дня недели через последовательный порт

getMonthStr([format]);
Считать текущий месяц в виде строковой переменной.
Параметры: 
format: <необязательный параметр>
     FORMAT_LONG название месяца на английском языке (По умолчанию)
     FORMAT_SHORT Сокращенное название месяца на английском языке (3 символа)
Возврат: Строковое значение, содержащее текущий месяц в полном или сокращенном формате.
Пример: Serial.print(rtc.getMonthStr()); // Отправить название текущего месяца через последовательный порт

getUnixTime(time);
Преобразование значения времени и даты в формат Unix Time (UNIX-время).
Параметры: 
Время: Переменная, содержащее дату и время для преобразования
Возврат: Unix Time для предоставленного значения времени
Пример: Serial.print(rtc.getUnixTime(rtc.getTime())); // Отправить текущее значение Unixtime через последовательный порт
Примечание: UNIX-время (англ. Unix time) или POSIX-время — система описания моментов во времени, принятая в UNIX и других POSIX-совместимых операционных системах. Определяется как количество секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года (четверг); время с этого момента называют «эрой UNIX» (англ. Unix Epoch).

setTime(hour, min, sec);
Установка времени.
Параметры:
hour: Часы (0-23)
min: Минуты (0-59)
sec: Секунды (0-59)
Пример: rtc.setTime(23, 59, 59); // Установка времени 23:59:59

setDate(date, mon, year);
Установка даты.
Параметры:
date: День (1-31)
mon:  Месяц (1-12)
year: Год (2000-2099)
Пример: rtc.setDate(16, 5, 2016); // Установка даты 16 мая 2016г.
Примечание: Защиты от ввода неправильной даты нет. Т.е., возможно ввести 31 февраля, но результат будет не предсказуем

setDOW(dow);
Установка дня недели.
Параметры: 
dow:  <необязательный параметр> День недели (1-7)
Если параметр не задан, значение параметра будет рассчитываться на основе данных, хранящихся в настоящее время в DS3231.
Пример: rtc.setDOW(FRIDAY); // Установить день недели - Пятница
Примечание: Устанавливаются от понедельника (1) до воскресенья (7).

halt(value);
Установка или сброс флага запуска часов.
Параметры: 
value: true: Установить CH флаг
            false: Сбросить  CH флаг
Возврат: Нет
Пример: rtc.halt(false); // Запустить часовой модуль в работу

setOutput(enable);
Установка на выводе SQW/OUT (вывод 7) микросхемы DS1307 высокого или низкого уровня. Данная команда не работает, если enableSQW() имеет значение TRUE.
Параметры: 
enable: TRUE: Установить на выводе высокий уровень
                FALSE: Установить на выводе низкий уровень.
Возврат: Нет
Пример: rtc.setOutput(true); // Установить на выводе SQW/OUT высокий уровень

enableSQW(enable);
Разрешение или запрет вывода прямоугольных импульсов заданной частоты на выводе SQW/OUT.
Параметры: 
enable: TRUE: Разрешить прямоугольные импульсы на выводе
                FALSE: Запретить прямоугольные импульсы на выводе
Возврат: Нет
Пример: rtc.enableSQW(true); // Использовать вывод SQW/OUT в качестве генератора прямоугольных импульсов

setSQWRate(rate);
Задание частоты прямоугольных импульсов на выводе SQW.
Параметры: 
     rate: SQW_RATE_1 - частота 1Гц
               SQW_RATE_4K - частота 4.096кГц
               SQW_RATE_8K - частота 8.192кГц
               SQW_RATE_32K - частота 32.768кГц
Возврат: Нет
Пример: rtc.setSQWRate(SQW_RATE_1); // Задать частоту на выводе SQW равной 1Гц


writeBuffer(buffer);
Записать данные из буфера в ОЗУ микросхемы.
Параметры: 
buffer: DS1307_RAM буфер
Возврат: Нет
Пример: rtc.writebuffer(ramBuffer); // Записать 56 байт из переменной ramBuffer в ОЗУ микросхемы

readBuffer();
Считать данные из ОЗУ микросхемы в буфер.
Параметры: Нет
Возврат: DS1307_RAM буфер
Пример: ramBuffer=rtc.readBuffer(); // Считать все 56 bytes из ОЗУ микросхемы в переменную ramBuffer

poke(address, value);
Записать 1 байт в ОЗУ микросхемы
Параметры: 
address: Адрес для записи байта (0-55)
value : Значение для записи по адресу <address> (0-255)
Возврат: Нет
Пример: rtc.poke(15, 160); // Записать 160 по адресу 15

peek(address);
Считать 1 байт из ОЗУ микросхемы
Параметры: 
address: Адрес для чтения байта (0-55)
Возврат: 1 байт данных, считанных из ОЗУ микросхемы
Пример: b=rtc.peek(18); // Считать 1 байт по адресу 18 и записать значение в переменную b

Ardruino

Вангу, что пины SPI выведены не на ICSP, а на гребенки. У меги SPI на других пинах.
нето гуглите.... SPI интерфейс погуглите
смотрю на сайте http://arduino.cc/en/Reference/SPI
http://arduino.ru/forum/obshchii/podklyuchenie-neskolkikh-ustroistv-po-spi
https://jeelabs.org/forum/node/1531.html

SS на 10(uno) и 53(mega) ... таки это можно как-то поменять или
53 пин это что бы сказать меге что она будет подчиненой на SPI и зачем его куда то менять?
могу я подключить SS на:
2. sd module - 3 pin
3. nrf21 - 4 pin
4. lcd 5110 - 5 pin
5. enc28j60 - 6 pin
SPI есть железный, есть софтверный
все перечисленные вами устройства отлично работают и так и так.
смотрите не только на модули, но и на библиотеки, которые есть - некоторые библиотеки работают только по железному SPI, некоторые только по софтверному. В случае с жедезным SPI цепляться нужно обязательно на выводы MISO/MOSI/SCK которые обозначены на MCU (и привязаны к конктртеным выводам ардуино). В случае софтверного SPI в качестве MISO/MOSI/SCK можно назначить практически любые порты ввода-вывода, в этом случае при необходимости разные устройства можно подключать к разным выводам MCU
наиболее правильный вариант вам уже порекомендовали - MISO/MOSI/SCK всех устройств подключить паралелльно к MCU, выводы Chip Select к каждому устройству - отдельный вывод MCU

------------------
У шилда есть особенность, связанная общим управлением кардридером и сетевой частью и тем, что у меги и у остальных Ардуин в этой части различная распиновка (53 и 10 пины соответственно).  Поэтому, опуская детали, следует явно устанавливать режим работы с сетевым интерфейсом и с кардридером
1digitalWrite(  4, HIGH); // SD disabled
2digitalWrite( 10, LOW ); // LAN enabled
или
1digitalWrite( 10, HIGH ); // LAN disabled
2digitalWrite(  4, LOW  ); // SD enabled
======================
https://www.arduino.cc/en/Tutorial/ReadWrite
======================
01#include <SD.h>
02#include <Wire.h>
03#include <RTClib.h>
04
05
06RTC_DS3231 RTC;  // define the Real Time Clock object
07//------------------------------------------------------------------------------
08// call back for file timestamps
09void cb_dateTime(uint16_t* date, uint16_t* time) {
10  DateTime now = RTC.now();
11
12  // return date using FAT_DATE macro to format fields
13  *date = FAT_DATE(now.year(), now.month(), now.day());
14  // return time using FAT_TIME macro to format fields
15  *time = FAT_TIME(now.hour(), now.minute(), now.second());
16}
17//------------------------------------------------------------------------------
18void setup() {
19  Serial.begin(9600);
20  Wire.begin();
21  if (!RTC.begin()) {
22    Serial.println("RTC failed");
23    while(1);
24  };
25  // set date time callback function
26  SdFile::dateTimeCallback(cb_dateTime);
27 //теперь все операции с файлами должны брать время с RTC
28}
29
30
31//------------------------------------------------------------------------------
32void loop() {}
============================

поискать библиотеку DS1307
01#include <SD.h>
02#include <Wire.h>
03#include <DS3231.h>
04Time  t;
05DS3231  rtc(SDA, SCL);
06File myFile;
07//------------------------------------------------------------------------------
08// call back for file timestamps
09void cb_dateTime(uint16_t* date, uint16_t* time) {
10 t = rtc.getTime();
11  // return date using FAT_DATE macro to format fields
12  *date = FAT_DATE(t.year, t.mon, t.date);
13  // return time using FAT_TIME macro to format fields
14  *time = FAT_TIME(t.hour, t.min, t.sec);
15}
16//------------------------------------------------------------------------------
17void setup() {
18  Serial.begin(9600);
19  Wire.begin();
20  rtc.begin();
21  t = rtc.getTime();
22  pinMode(53, OUTPUT);// change this to 53 on a mega
23  if (!SD.begin(53)) {
24    Serial.println("initialization failed!");
25  }  else {
26    Serial.println("initialization done.");
27}
28  // set date time callback function
29  SdFile::dateTimeCallback(cb_dateTime);
30 //теперь все операции с файлами должны брать время с RTC
31//создаем тестовый файл для проверки
32 myFile = SD.open ("Test1.txt", FILE_WRITE);
33  Serial.println("file created !");
34 myFile.close();
35}
36
37
38//------------------------------------------------------------------------------
39void loop() {}
 =============
#include <Wire.h> //Подключаем библиотеку для использования I2C интерфейса с модулем RTC
#include <RTClib.h> //Подключаем библиотеку для использования модуля часов реального времени RTC

RTC_DS1307 RTC; //Создаем переменную класса - для использования RTC

//----------Объявляем разные переменные------------
const int RelayChn1 = 6; //Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля
const int RelayChn2 = 7; //Используем цифровой ПОРТ 7 для ВТОРОГО канала релейного модуля
//----------Настройки времени и продолжительности включения реле

//----------ПЕРВЫЙ канал----------------------------
const int StartRelCn_1 = 25200; //Время срабатывания в ПЕРВОМ канале релейного модуля (в секундах от начала суток)
//в данном случае 25200 - это 7 часов 00 минут = ( 60секунд *60 минут *7 = 25200)
const int DurationCh_1 = 28800; //ДЛИТЕЛЬНОСТЬ срабатывания реле в ПЕРВОМ канале (в секундах)

//----------ВТОРОЙ канал----------------------------
const int StartRelCn_2 = 32400; //Время срабатывания во ВТОРОМ канале релейного модуля (в секундах от начала суток)
//В данном случае 10 часов 30 минут = (60 секунд * 60 минут * 10 часов + 60сек*30мин = 37800)
const int DurationCh_2 = 37800; //ДЛИТЕЛЬНОСТЬ срабатывания реле во ВТОРОМ канале (в секундах)

//----------Модуль инициализации setup() - выполняется один раз при инициализации платы при подаче напряжение (и аналогичных событиях)
void setup(){

Serial.begin(9600);

Serial.println(0);

pinMode(RelayChn1,OUTPUT); //Инициализируем порт для ПЕРВОГО канала как ВЫХОД
pinMode(RelayChn2,OUTPUT); //Инициализируем порт для ВТОРОГО канала как ВЫХОД

digitalWrite(RelayChn1,HIGH); //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень
digitalWrite(RelayChn2,HIGH); //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой

Serial.println(1);

Wire.begin(); //Инициируем I2C интерфейс
Serial.println(2);
RTC.begin(); //Инициирум RTC модуль
Serial.println(3);
// RTC.adjust(DateTime(__DATE__, __TIME__)); //С этой строки необходимо убрать комментарии один раз в начале,
//для того, чтобы загрузить в RTC дату и время на момент компиляции программы
//Иногда необходимо заливать СКЕТЧ на плату со снятым комментарием - для поправки
//времени в RTC, НО оставлять такой СКЕТЧ в работе НЕЛЬЗЯ !!!!!!!!!!!!!

} // КОНЕЦ ИНИЦИАЛИЗАЦИИ

//--------------------------------------------------
void loop() // ПРОГРАММЫй безусловный ЦИКЛ
{
DateTime myTime = RTC.now(); //Читаем данные времени из RTC при каждом выполнении цикла

//----------Раздел обработки реле по времени —--
long utime = myTime.unixtime(); //сохраняем в переменную - время в формате UNIX
Serial.println(utime);
utime %= 86400; //Сохраняем в этой же переменной остаток деления на кол-во секнд в сутках,
//Это дает количество секунд с начала текущих суток

//------------КАНАЛ 1------------------------------
if ((utime >= StartRelCn_1) &&
(utime < (StartRelCn_1+DurationCh_1)))
//Если секунд с начала суток больше, чем задано для включения
//Но, одновременно и меньше, чем задано для включения + длительность
{

digitalWrite(RelayChn1,LOW); //Устанавливаем на ПЕРВОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else //во всех остальных случаях
{
digitalWrite(RelayChn1,HIGH); //Устанавливаем на ПЕРВОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}

//------------КАНАЛ 2 - все аналогично —---------
if ((utime >= StartRelCn_2) &&
(utime < (StartRelCn_2+DurationCh_2)))
{
digitalWrite(RelayChn2,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else
{
digitalWrite(RelayChn2,HIGH); //Устанавливаем на ВТОРОМ входе релейно


=================================================================
Решил проблему следующим образом:
- строчку  #include <SD.h> заменил на  #include <SdFat.h>
- добавил строчку SdFat sd;
- в тексте программы сочетание "SD" заменил на "sd".  Например:
File dataFile = SD.open("datalog.txt", FILE_WRITE);  заменил на
File dataFile = sd.open("datalog.txt", FILE_WRITE);
 Теперь все SD-карты определяются и на них файлы создаются. 
============================================================