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


1 комментарий:

  1. RNG Casinos & Slot Machines, & Casino Games at The Best - DrmCD
    Top 10 best casino 거제 출장마사지 games to play, and some of the best RNG slot machines 군포 출장안마 for 상주 출장안마 sale online. Find 광명 출장샵 the best list of free casino games to play 광명 출장샵 on your mobile device.

    ОтветитьУдалить