snažím se o docházkový systém,kde Nextion odesílá data na UNO(přes SoftwareSerial),ten je ukládá na SD kartu
a po druhé lince(0,1) je případně načítám z SD karty do PC,kde mám vytvořenou aplikaci ve vb NET a s daty pracuji dále.
Celkem to chodí...,ale!!!!
1.První co mě zarazilo je,že zápis na kartu funguje i když mám CS pin zapojený na jiný pin v arduinu než je deklarovaný!?!?
Omylem jsem ho zapojil na jiný pin a přesto to fungovalo... co vlastně CS pin dělá...??
2.Před zápisem na kartu musím nejdříve kartu zavřít ( myFile.close()) ,jinak mi karta pravidelně po 12-ti zápisech
zůstávala(zřejmě) otevřená a další zápisy prostě nefungovali! A to zřejmě způsobilo,že veškerá data do té doby uložené na kartě byli zničené
viz.příloha... Pokud tam mám ještě před zápisem zavření karty,tak je to OK.
Ale proč je tohle potřeba?? Co dělám špatně??
3.Potřeboval bych ošetřit jeden výpis,který odesílá Nextion pokaždé na linku,když jde do režimu "spánku".
Když ho probudím,tak to jsem schopen ošetřit,ale při přechodu do spánku odesílá data v HEX 0x68 a tam je příkazem
readString() nejsem schopen ošetřit.Je nějaký způsob jakým to udělat příkazem readString...?
4.Když odesílám data na Nextion,tak zároveň odesílám kontrolní zprávu i na druhou linku(PC),která mi vlastně vypíše,zda se zápis podařil.
Pokud ovšem tuto linku(do PC) mám vypnutou,tak mi na arduinu TX led svítí při každém zápisu z displeje na kartu snad 8sec.
Pokud mám linku PC-UNO spuštěnou tak jen TX problikne a hotovo. To samé pokud ty kontrolní výpisy smáznu.Proč tak dlouho??
5.Použitím funkce substring kontroluji poslední znak při příjmu zprávy(ID10 P02 R 04 06/02/20 17:58 L0 K),tím znakem je "K" a je na pozici 32
a dalším parametrem je počet znaků,tím by měla být přeci 1,ale mě to funguje pokud mu dám 33 !!!????
Proč??
Trošku jsem se rozepsal,ale snad srozumitelně
Děkuji....
Kód: Vybrat vše
/* SD KARTA
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 10
*/
#include <SPI.h>
#include <SD.h>
//komunikace Nextion-UNO
#include <SoftwareSerial.h>
SoftwareSerial swSerial(6, 7);//RX-pin=6 TX-pin=7
File myFile;
File myFile_1;
String slozka="";
String zprava_1 ="";
void setup() {
pinMode(10, OUTPUT);
Serial.begin(9600);//komunikace UNO-PC
swSerial.begin(9600);//komunikace Nextion-UNO
while (!Serial) {;}
if (!SD.begin(10)) {//CS na SD čtečce - na pinu 10 arduino
Serial.println("Inicializace SD karty neuspesna");
while (1);
}else {Serial.println("Inicializace SD karty uspesna");}
}
void loop() {
while(swSerial.available()>0) {
zprava_1 ="";
zprava_1 = swSerial.readString();
myFile.close(); // musí být, jinak po 12-ti zápisech se to sekne...!!
if (zprava_1.substring(0,2)=="DO"){slozka=(zprava_1);} //pokud jsou jsou první dva znaky "DO"
if(!SD.exists(slozka + String("test.txt"))){SD.mkdir(slozka); Serial.println(" slozka vytvorena");}//když uvedená složka neexistuje tak ji vytvoří
myFile = SD.open(slozka + String("test.txt"), FILE_WRITE);//otevře kartu
if (myFile) { // zapíše data
if (zprava_1.substring(0,2)=="ID" && zprava_1.substring(32,33)=="K"){//pokud zprava_1 obsahuje zadaná kritéria zapíše je
myFile.println(zprava_1); //zapíše na SD kartu
Serial.println(zprava_1 + String(" karta ulozena"));/po zápisu na kartu odesláno potvrzení na PC
swSerial.print(F("page1.n2.val="));swSerial.print(1);SerialFFF();//kontrola příjmu zprávy odeslaná na displej
swSerial.print(F("page0.n0.val="));swSerial.print(1);SerialFFF();
myFile.close();//zavře SD kartu
}else if(zprava_1==slozka){;
}else if(zprava_1.substring(0,1)=="h"){Serial.println("display-rezim probuzeni");
} else { //vše ostatní při zápisu na SD kartu ignoruje
} } }
while(Serial.available()>0) {
zprava_1 = Serial.readString();
slozka=zprava_1.substring(0,18);
if (zprava_1.substring(18)=="n1") {SD.remove(slozka + String("test.txt"));} //vymaže data v uvedené složce na SD kartě
if (zprava_1.substring(0,5)=="karta") {nacti_kartu();}
} zprava_1="";
} //konec loop
void nacti_kartu() { //načte data z SD karty
slozka=zprava_1.substring(5);
myFile_1 = SD.open(slozka + String("test.txt"),FILE_READ);
if (myFile_1) { //když je SD karta otevřená pro čtení
while (myFile_1.available()) {
Serial.write(myFile_1.read());
// Serial.println(slozka + String(" karta nactena"));
}
myFile_1.close();
}else if(SD.exists(slozka)==false){ Serial.println("slozka neexistuje");
}else if(myFile_1==0){ Serial.println("karta je prazdna");
} else {Serial.println("karta je prazdna"); //pokud je při čtení z SD karty problém
} myFile_1.close(); zprava_1=""; }
void SerialFFF(void) {
swSerial.write(0xff);
swSerial.write(0xff);
swSerial.write(0xff);
//swSerial.println("");
delay(5);
}