Arduino i upotreba podataka sa SD kartice
1. Upis naredbi na Arduinu broj 1
Za
pripremu uslovljenih komandi koristimo već pripremljenu Megu iz
pomenutog članka. Uz par modifikacija, naravno, gde je samo dodat
prekidač na 5V liniju SD modula da bi se kartica mogla izvaditi i kada
je Mega upaljena.
Najveće
promene su u skeču. Imamo tri prekidača i u zavisnosti koji je
pritisnut na mikro SD karticu upisujemo neku vrednost u test.txt fajl. U
ovom slučaju neki od brojeva 1, 2 ili 3. Pri tom se prilikom svakog
upisa prethodno obriše sve da ne bi došlo do dupliranja unosa.
-----------------------------------------
#include <SD.h>
#include <SPI.h>
const int SD_CS = 10;
const int buttonPin = 2;
const int buttonPin2 = 3;
const int buttonPin3 = 4;
int buttonState = 0;
int buttonState2 = 0;
int buttonState3 = 0;
File dataFile;
void setup() {
Serial.begin(9600);
SD.begin(SD_CS);
pinMode(buttonPin, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(buttonPin3, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
buttonState2 = digitalRead(buttonPin2);
buttonState3 = digitalRead(buttonPin3);
if(buttonState == HIGH){
SD.remove("test.txt");
if(SD.exists("test.txt")){
Serial.println("Test.txt nije obrisan");
}else{
Serial.println("Fajl je obrisan");
Serial.println("........");
}
dataFile = SD.open("test.txt", FILE_WRITE);
if(dataFile){
dataFile.println("1");
delay(200);
dataFile.close();
Serial.println("Kreiran novi test.text fajl");
Serial.println("Uspešno uneta vrednost - 1");
delay(100);
}else{
Serial.println("Nema test.txt fajla");
}
}
if(buttonState2 == HIGH){
SD.remove("test.txt");
if(SD.exists("test.txt")){
Serial.println("Test.txt nije obrisan");
}else{
Serial.println("Fajl je obrisan");
Serial.println("........");
}
dataFile = SD.open("test.txt", FILE_WRITE);
if(dataFile){
dataFile.println("2");
delay(200);
dataFile.close();
Serial.println("Kreiran novi test.text fajl");
Serial.println("Uspešno uneta vrednost - 2");
delay(100);
}else{
Serial.println("Nema test.txt fajla");
}
}
if(buttonState3 == HIGH){
SD.remove("test.txt");
if(SD.exists("test.txt")){
Serial.println("Test.txt nije obrisan");
}else{
Serial.println("Fajl je obrisan");
Serial.println("........");
}
dataFile = SD.open("test.txt", FILE_WRITE);
if(dataFile){
dataFile.println("3");
delay(200);
dataFile.close();
Serial.println("Kreiran novi test.text fajl");
Serial.println("Uspešno uneta vrednost - 3");
delay(100);
}else{
Serial.println("Nema test.txt fajla");
}
}
}
----------------------------
2. Izvršenje na Arduinu broj 2
Ovde
je korišten Uno gde su dodata dva prekidača sa pull-down otpornikom od
10K i tri LED sa otpornicima od 220R. Povezujemo prema Fritzing šemi.
U
okviru skeča pritiskom na dugme čitamo sadržaj kartice i u zavisnosti
koja je vrednost uneta na Megi, palimo određenu LED. Drugi prekidač
služi da se LED ugase.
-------------------------------
#include <SD.h>
#include <SPI.h>
const int SD_CS = 10;
const int buttonPin = 7;
const int buttonPin2 = 8;
int buttonState = 0;
int buttonState2 = 0;
char c;
int ledPin1 = 4; //crvena LED
int ledPin2 = 5; //zuta LED
int ledPin3 = 6; //zelena LED
File dataFile;
void setup() {
Serial.begin(9600);
SD.begin(SD_CS);
pinMode(buttonPin, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
buttonState2 = digitalRead(buttonPin2);
if(buttonState == HIGH){
dataFile = SD.open("test.txt");
if(dataFile) {
while (dataFile.available()) {
c = dataFile.read();
if(c=='1'){
Serial.println("Imamo upisan broj 1");
digitalWrite(ledPin1,HIGH);
}else if(c=='2'){
Serial.println("Imamo upisan broj 2");
digitalWrite(ledPin2,HIGH);
}else if(c=='3'){
Serial.println("Imamo upisan broj 3");
digitalWrite(ledPin3,HIGH);
}else{
Serial.println("Sadrzaj fajla nije ono sto smo uneli u Megi");
}
}
dataFile.close();
} else {
Serial.println("Greska u otvaranju test.txt");
}
}//if buttonState
if(buttonState2 == HIGH){
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
Serial.println("LED su pogasene.");
}
delay(200);
}
-------------------------------
Sa
ovim, ali i sa prethodnim člankom sam pojasnio upotrebu osnovnih
funkcija u okviru SD.h biblioteke neophodne za rad sa SD modulom.
Prilikom testiranja ovog modula kao i nekoliko šildova, ova biblioteka
se pokazala dobro i od mene sve preporuke. Na kraju jedan mali rezime:
Funkcije
SD.begin() - pokreće SD slot
SD.open() - otvara SD slot
SD.remove() - briše određeni folder
SD.exists() - proverava postojanje određenog fajla
мyFile.print() - upis na SD karticu
мyFile.println() - upis na SD karticu i početak novog reda
мyFile.close() - zatvara prethodno otvorene foldere na kartici
мyFile.read() - čita sadržaj foldera
мyFile.available() - proverava da li određeni fajl postoji
Funkcija koju nisam upotrebljavao ali koja može biti od koristi
SD.mkdir() - za pravljenje foldera po potrebi i unutar foldera
Tu su još i seek(), position(), size(), isDirectory(), openNextFile() i name().
Prilikom
pravljenja naziva fajlova treba imati u vidu da SD.h biblioteka koristi
8.3 format (8 znakova u nazivu i 3 u ekstenziji). Takođe biblioteka ne
pravi razliku malih i veilikih slova pa će tako tEsT.txT biti isto što
test.txt ili TEST.TXT. Takođe, unosi na karticu neće biti po abecednom
redu već po redu vremena unosa.
Ovo je samo jedan od primera kako iskoristiti unete vrednosti na SD karticu. Pri tom ovde radimo samo sa test.txt fajlom dok će svi drugi fajlovi ostati netaknuti. Mogućnosti je puno a ograničenje može da bude samo vaša mašta.
Treba imati na umu da mikro SD kartice rade na isključivo 3,3V i da nisu tolerantne na 5V. Za slične projekte se mogu koristiti i SD slotovi ali u tom slučaju treba voditi računa o naponu izlaznih pinova ploče koju koristimo a najveći broj njih radi na 5V. Takođe treba dodati da se prilikom upisivanja na karticu vuče prilično jaka struja od preko 100mA. Da bi se izbeglo spaljivanje kartica i ploča a pri tom zadržale brzine prenosa potrebno je koristiti što kraće žice a po mogućstvu i bez njih i neki od level šiftera, poput 4050 (HEF, CD...). O "prelaženju" sa 5V na 3,3V i obrnuto biće reči nekom drugom prilikom.