Посмотрим как записывать данные в файл на SD карточке, установленной в картридере Ethernet W5100 Shield Network Expansion Board w/ Micro SD Card Slot.
Для этого напишем простой скетч, который будет принимать по com-порту строку, выводить ее на экран 1602 вместе с количеством принятых строк, делать эхо этой строки в com-порт, и записывать ее в текстовый файл на карте памяти SD.
Т.к. шилд использует digital пины 4 (низкий уровень – выбор картридера на шилде), 10 (низкий уровень – выбор ethernet на шилде), 11 (SPI bus – MOSI), 12 (SPI bus – MISO), 13 (SPI bus – CLK), а в наших ранних примерах эти пины использовал дисплей, то придется переподключить дисплей на другие цифровые выходы.
Скетч с кучей комментариев, надеюсь, не требует дополнительных пояснений:
/*
Баловство с w5100 и com-портом
Будем принимать по com-порту строку, выводим ее на экран и
записывать в файл на SD карте
Оборудование:
- дисплей 1602, потенциометр для подсветки дисплея
- Ethernet W5100 Shield Network Expansion Board w/ Micro SD Card Slot
- SD карточка
Подключение дисплея 1602:
Контакт дисплея Контакт Arduino Значение
1 GND Vss
2 5V Vdd
3 GND Vo (контрастность)
4 digital 9 RS
5 digital 8 R/W
6 digital 7 ENABLE
11 digital 6 DB4
12 digital 5 DB5
13 digital 3 DB6
14 digital 2 DB7
15 5V LED+
16 GND LED-
Подключение W5100:
Обмен данными между Ардуиной и Шилдом происходит по SPI.
Низким уровнем на digital выводе выбирает ведомое устройство на шине SPI:
выбор SD - digital 4
выбор ethernet - digital 10
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
*/
// подключаем библиотеки
#include <LiquidCrystal.h> // для работы с LCD
#include <SPI.h> // для работы с SPI
#include <SD.h> // для работы с SD
// #include <Ethernet.h> // для работы с Ethernet
// инициализируем LCD, указывая контакты данных
LiquidCrystal lcd(9, 8, 7, 6, 5, 3, 2);
// задаем переменные
boolean receiveFlag = false; // флаг что было что-то принято через com-порт
String myString; // строка
char* FileName = "testfile.txt"; // имя файла с которым будем работать
File myFile; // класс File
int Count = 1; // счетчик
int selectEthernet = 10; // выбор ведомого на шилде - Ethernet
int selectSd = 4; // выбор ведомого на шилде - SD
// включим Ethernet
#define SWITCH_TO_W5100 digitalWrite(selectSd,HIGH); digitalWrite(selectEthernet,LOW);
// включим SD
#define SWITCH_TO_SD digitalWrite(selectEthernet,HIGH); digitalWrite(selectSd,LOW);
// выключим и SD и Ethernet
#define ALL_OFF digitalWrite(selectEthernet,HIGH); digitalWrite(selectSd,HIGH);
void setup() {
// красивая "загрузка" программы при старте :)
lcd.begin(16, 2);
lcd.print("Loading");
delay(500); // ждем 0.5 секунды
lcd.print(".");
delay(500); // ждем 0.5 секунды
lcd.print(".");
delay(1000); // ждем 1 секунду
lcd.clear(); //очистка экрана
Serial.begin(9600); // инициализируем передачу данных по COM-порту
// на скорости 9600 бод
Serial.println("Start "); //
// Задаем режим работы портов
pinMode(selectEthernet, OUTPUT);
pinMode(selectSd, OUTPUT);
// высокий уровень на обоих - не выбран ведомый на SPI
digitalWrite(selectEthernet, HIGH);
digitalWrite(selectSd, HIGH);
// инициализация SD
if (!SD.begin(selectSd)) Serial.println("initialization SD failed!");
}
void loop() {
// проверяем буфер com-порта - было ли что-то принято
if (Serial.available() > 0) //если есть доступные данные считываем строку
{
while (Serial.available() > 0)
{
int inChar = Serial.read(); // считываем символ
myString += (char)inChar; // формируем строку
}
// устанавливаем флаг что нужно обработать принятые данные
receiveFlag = true;
// Serial.flush(); // очистим буфер
}
// если флаг receiveFlag установлен - значит что-то приняли. Обработаем:
if (receiveFlag == true)
{
// выводим принятую переменную на экран
lcd.clear(); //очистка экрана
lcd.setCursor(13, 0); // устанавливаем курсор в 12-ом столбце, 1 строке
lcd.print(Count); // выводим кол-во итераций
lcd.setCursor(0, 1); // устанавливаем курсор в 0-ом столбце, 2 строке
lcd.print(myString); // выводим myString на экран
// эхо в com-порт
Serial.print("String: "); //
Serial.println(myString); // эхо myString в com-порт
// записываем в файл
// выберем ведомого SPI = включим SD
SWITCH_TO_SD;
// Откроем файл на запись
myFile = SD.open(FileName, FILE_WRITE);
// если файл открылся - запишем в него данные
if (myFile)
{
myFile.println(myString);
// закроем файл
myFile.close();
} else {
// если файл не открылся - рапортуем об ошибке
Serial.println("error opening file");
}
// отключим SD (отключим все)
ALL_OFF;
// подотрем за собой :)
receiveFlag = false; // сбрасываем флаг
myString = ""; // очистка строки
Count++; // инкремент счетчика
}
delay(1000); // задержка перед повторением
}
Com-порт, переданные строки:
Тестовый файл на SD карте - те же самые строки:
Тестовый стенд на макетке:
Тестовый стенд на макетке - arduino + w5100 shield + LCD1602 Обратите внимание на первую строку - цифра 8 - это количество принятых строк.