USB-хост Arduino и SD-карта

Когда я использую SD-карту на Mega или Arduino Uno, все работает. Всё хорошо. Однако когда я использую его в сочетании с хостом USB Shield, он не работает. Я знаю, что хост USB Shield работает, потому что работает ЖК-дисплей и считыватель штрих-кода. Это не SD-карта, потому что SD-карта работает только с платами. Проблемы с подключением возникают только тогда, когда я добавляю экран.

Я получаю сообщение об ошибке: Не удалось инициализировать последовательный монитор. Я пробовал писать высоко, но не получилось.

Есть идеи?

///////////////////////////////////////////// //////////////////////
// Простой регистратор данных Arduino v1.03 //
// Получите последнюю версию кода здесь: //
// http://educ8s.tv/arduino-data-logger-project


// RTC: контакт scl-scl, контакт sda-sda, vcc-5v, контакт gnd-gnd
// SD: vcc-5v, grnd-grnd, mosi-pin 11, miso-pin 12, sck-13 pin, CS (выбор чипа)-10
// измените на CSV, если хотите открыть в Excel. файл журнала.

/////////////////////////////////////////////////// ///////////////

#include <Wire.h>
#include "ds3231.h"
#include <SD.h>
#include <SPI.h>
#include <stdint.h> // добавляем эту и следующие 2 строки

#define BUFF_MAX 128
#define DS3231_INTCN 0x4
#define DS3231_A1IE 0x1
#define DS3231_A2IE 0x2

int CS_PIN = 4;

File file;

String timeString;
String dateString;

int entryId = 0;

uint8_t time[8];
char recv[BUFF_MAX];
unsigned int recv_size = 0;
unsigned long prev = 0, interval = 1000;

void setup()
{

    Serial.begin(9600);
    Wire.begin();

    initializeSD();

    DS3231_init(DS3231_INTCN);
    memset(recv, 0, BUFF_MAX);

    parse_cmd("T302410401112018",16); //Установить время
}

void loop()
{
    String logEntry;
    char in;
    char buff[BUFF_MAX];
    unsigned long now = millis();

    // Регистрируем данные время от времени
    if ((now - prev > interval) && (Serial.available() <= 0)) {
        getTime();
        logEntry = createLogEntry();
        writeEntryToFile(logEntry);
        prev = now;
    }

    if (Serial.available() > 0) {
        in = Serial.read();

        if ((in == 10 || in == 13) && (recv_size > 0)) {
            parse_cmd(recv, recv_size);
            recv_size = 0;
            recv[0] = 0;
        } else if (in < 48 || in > 122) {
            ;       // игнорировать ~[0-9A-Za-z]
        } else if (recv_size > BUFF_MAX - 2) {   // удаляем слишком длинные строки
            // уронить
            recv_size = 0;
            recv[0] = 0;
        } else if (recv_size < BUFF_MAX - 2) {
            recv[recv_size] = in;
            recv[recv_size + 1] = 0;
            recv_size += 1;
        }

    }
}

void parse_cmd(char *cmd, int cmdsize)
{
    uint8_t i;
    uint8_t reg_val;
    char buff[BUFF_MAX];
    struct ts t;

    // TssmmhhWDDMMYYYY или установка времени
    if (cmd[0] == 84 && cmdsize == 16) {
        //T355720619112011
        t.sec = inp2toi(cmd, 1);
        t.min = inp2toi(cmd, 3);
        t.hour = inp2toi(cmd, 5);
        t.wday = inp2toi(cmd, 7);
        t.mday = inp2toi(cmd, 8);
        t.mon = inp2toi(cmd, 10);
        t.year = inp2toi(cmd, 12) * 100 + inp2toi(cmd, 14);
        DS3231_set(t);
        //Serial.println("ОК");
    } else if (cmd[0] == 49 && cmdsize == 1) {  // "1" получаем сигнал тревоги 1
        DS3231_get_a1(&buff[0], 59);
        //Serial.println(бафф);
    } else if (cmd[0] == 50 && cmdsize == 1) {  // "2" получаем сигнал тревоги 1
        DS3231_get_a2(&buff[0], 59);
        // Serial.println(бафф);
    } else if (cmd[0] == 51 && cmdsize == 1) {  // "3" получаем регистр устаревания
        //Serial.print("Устаревшая регистрация");
        //Serial.println(DS3231_get_aging(), DEC);
    } else if (cmd[0] == 65 && cmdsize == 9) {  // "A" установил сигнал тревоги 1
        DS3231_set_creg(DS3231_INTCN | DS3231_A1IE);
        //АССММХЖД
        for (i = 0; i < 4; i++) {
            time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // сс, мм, чч, дд
        }
        byte flags[5] = { 0, 0, 0, 0, 0 };
        DS3231_set_a1(time[0], time[1], time[2], time[3], flags);
        DS3231_get_a1(&buff[0], 59);
        // Serial.println(бафф);
    } else if (cmd[0] == 66 && cmdsize == 7) {  // "B" устанавливает сигнал тревоги 2
        DS3231_set_creg(DS3231_INTCN | DS3231_A2IE);
        //БММХЖД
        for (i = 0; i < 4; i++) {
            time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // мм, чч, дд
        }
        byte flags[5] = { 0, 0, 0, 0 };
        DS3231_set_a2(time[0], time[1], time[2], flags);
        DS3231_get_a2(&buff[0], 59);
        //Serial.println(бафф);

    } else if (cmd[0] == 68 && cmdsize == 1) {  // "D" - сброс флагов тревоги регистра состояния
        reg_val = DS3231_get_sreg();
        reg_val &= B11111100;
        DS3231_set_sreg(reg_val);
    } else if (cmd[0] == 70 && cmdsize == 1) {  // "F" — пользовательская функция
        reg_val = DS3231_get_addr(0x5);
        // Serial.print("оригинал");
        //Serial.print(reg_val,DEC);
        //Serial.print("месяц");
        //Serial.println(bcdtodec(reg_val & 0x1F),DEC);
    } else if (cmd[0] == 71 && cmdsize == 1) {  // "G" - установить регистр статуса устаревания
        DS3231_set_aging(0);
    }
}


void getTime()
{
    String minute;
    String hour;
    struct ts t;

    DS3231_get(&t);

    if(t.min<10)
    {
        minute = "0"+String(t.min);
    } else
    {
        minute = String(t.min);
    }

    timeString = String(t.hour)+":"+minute;
    dateString = String(t.mon)+"/"+t.mday;
}

String createLogEntry()
{
    String logEntry;
    entryId ++;
    logEntry = String(entryId)+","+dateString+","+timeString;
    return logEntry;
}

void writeEntryToFile(String entry)
{
    openFileToWrite("Olirians.csv");
    Serial.println(entry);
    writeToFile(entry);
    closeFile();
}

void initializeSD()
{
    pinMode(CS_PIN, OUTPUT);

    if (SD.begin())
    {
    } else
    {
        return;
    }
}

int openFileToWrite(char filename[])
{
    file = SD.open(filename, FILE_WRITE);

    if (file)
    {
        return 1;
    } else
    {
        return 0;
    }
}

int writeToFile(String text)
{
    if (file)
    {
        file.println(text);
        return 1;
    } else
    {
        return 0;
    }
}

void closeFile()
{
    if (file)
    {
        file.close();
    }
}

, 👍0


2 ответа


0

И USB-хост-шилд, и SD-карта используют интерфейс SPI. Вы используете их на разных чипах? Шилд хоста использует контакт 10 в качестве CS.

,

1

USB Host Shield использует контакт 10 в качестве CS. Используйте контакт 4 в качестве CS для модуля SD.

Чтобы установить вывод CS в библиотеку SD, установите его как параметр SD.begin:

SD.begin(CS_PIN);

Примечание: ИС преобразования уровня на некоторых дешевых модулях SD нарушают работу шины SPI, и модуль нельзя использовать с другими устройствами SPI.

,