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

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-карты определяются и на них файлы создаются. 
============================================================