#include //knihovna pro SPI #include //knihovna pro SD kartu #include //knihovna pro I2C char znak; //načtený znak z klávesnice char INklav[100]; //pole max. 100 znaků načtených z klávesnice String INklavesnice; //řetězec znaků načtených z klávesnice boolean stavSD; int promenne[25]; //řetězec proměnných String BASICpole[100]; //pole 100 řádků int q; Sd2Card card; SdVolume volume; SdFile root; const int chipSelect = 4; //CS SD karty TwoWire WIRE2 (2,I2C_FAST_MODE); //I2C port 2 #define Wire WIRE2 //I2C port 2 #define LED 0x22 //I2C adresa LED #define RTC 0x68 //I2C adresa RTC /////////////////////////////po spuštění/////////////////////////////////////////////////////////////////////////////////////// void setup() { pinMode(LED_BUILTIN, OUTPUT); //zabudovaná LED jako výstup digitalWrite(LED_BUILTIN, HIGH); //zhasni LED Serial.begin(115200); //nastavení sériového portu Wire.begin(); //start I2C Wire.beginTransmission(LED); //zhasni LED Wire.write(0x00); //zhasni LED Wire.endTransmission(); //zhasni LED Wire.beginTransmission(0x20); //vynuluj porty LPT Wire.write(0x00); //vynuluj porty LPT Wire.endTransmission(); //vynuluj porty LPT Wire.beginTransmission(0x21); //vynuluj porty LPT Wire.write(0x00); //vynuluj porty LPT Wire.endTransmission(); //vynuluj porty LPT if (!SD.begin(chipSelect)) { stavSD = false; //není vložena } stavSD = true; //je vložena info(); //vypiš informace o systému klavesnice(); //vstup z klávesnice - čekání na enter smaz(); //smaž obrazovku } ///////////////////////hlavní smyčka/////////////////////////////////////////////////////// void loop() { Serial.print("?: "); klavesnice(); //vstup z klávesnice vyber(); //výběr příkazu } //////////////////////výběr příkazu////////////////////////////////////////////////////////// void vyber() { if(INklavesnice == "help") { help(); //help } else if(INklavesnice == "info") { info(); //info } else if(INklavesnice == "i2c scan") { i2c_scan(); //i2c scan } else if(INklav[0] == 'o' && INklav[1] == 'u' && INklav[2] == 't') { out(); //výstup na port } else if(INklav[0] == 'i' && INklav[1] == 'n' && INklav[2] == ' ') { in(); //vstup z portu } else if(INklavesnice == "sd ls") { SDvypis(); //výpis z SD karty } else if(INklavesnice == "sd info") { SDinfo(); //info o SD kartě } else if(INklav[0] == 'c' && INklav[1] == 'e' && INklav[2] == 'k') { cekej(); //čekání } else if(INklavesnice == "clr") { smaz(); //smaž obrazovku } else if(INklav[0] >= 97 && INklav[0] <= 122 && INklav[1] == '=' && INklav[2] != '=') { vytvorPROMENOU(); //zapíše proměnnou } else if(INklav[0] >= 97 && INklav[0] <= 122 && INklav[1] == '=' && INklav[2] == '=') { vypisPROMENOU(); //vypíše proměnnou } else if(INklav[1] == '+' && INklav[3] == '=') { secti(); //sčítání proměnných } else if(INklav[1] == '-' && INklav[3] == '=') { odecti(); //odčítání proměnných } else if(INklav[1] == '*' && INklav[3] == '=') { nasob(); //násobení proměnných } else if(INklav[1] == '/' && INklav[3] == '=') { vydel(); //dělení proměnných } else if(INklav[1] == '&' && INklav[3] == '=') { AND(); //AND proměnných } else if(INklav[1] == '|' && INklav[3] == '=') { OR(); //AND proměnných } else if(INklav[1] == '~') { NOT(); //NOT proměnných } else if(INklav[1] == '^' && INklav[3] == '=') { XOR(); //XOR proměnných } else if(INklav[1] == '>' && INklav[2] == '>' && INklav[4] == ' ') { posunVPRAVO(); //bitový posun vpravo } else if(INklav[1] == '<' && INklav[2] == '<' && INklav[4] == ' ') { posunVLEVO(); //bitový posun vlevo } else if(INklavesnice == "ret") { ret(); //návrat do hlavní smyčky } else if(INklav[0] >= 48 && INklav[0] <= 57 && INklav[1] >= 48 && INklav[1] <= 57 && INklav[2] == ' ') { ulozPRIKAZ(); //pokud jsou napsána 2 čísla a pak mezera tak ulož příkaz do pole } else if(INklav[0] >= 48 && INklav[0] <= 57 && INklav[1] >= 48 && INklav[1] <= 57 && INklav[2] == '=' && INklav[3] == '=') { nactiPRIKAZ(); //pokud jsou napsána 2 čísla a pak 2 = tak načti a zobraz příkaz z pole } else if(INklavesnice == "list") { list(); //vypiš paměť příkazů } else if(INklavesnice == "del") { del(); } else if(INklavesnice == "run") { beh(); //běh programu z paměti příkazů } else if(INklavesnice == "") { //pokud byl smazaný řádek v paměti programů a nic neobsahuje tak nic nedělej } else if(INklav[0] == '/' && INklav[1] == '/') { // pokud začíná řádek // pak jde o komentář, nedělej nic } else if(INklav[0] == 'j' && INklav[1] == 'm' && INklav[2] == 'p') { jump(); //skok v programu na řádek - jmp XX } else if(INklav[0] == 'i' && INklav[1] == 'f') { podminenySKOK(); } else if(INklav[0] == 'p' && INklav[1] == 'r' && INklav[2] == 'i' && INklav[3] == 'n' && INklav[4] == 't') { print(); } else if(INklav[0] == 's' && INklav[1] == 'd' && INklav[2] == ' ' && INklav[3] == 's' && INklav[4] == 'a' && INklav[5] == 'v' && INklav[6] == 'e') { SDsave(); //uložení programu na SD kartu - sd save xxxxxxxxxx } else if(INklav[0] == 's' && INklav[1] == 'd' && INklav[2] == ' ' && INklav[3] == 'l' && INklav[4] == 'o' && INklav[5] == 'a' && INklav[6] == 'd') { SDload(); //načtení programu z SD karty - sd load xxxxxxxxxx } else if(INklav[0] == 's' && INklav[1] == 'd' && INklav[2] == ' ' && INklav[3] == 'd' && INklav[4] == 'e' && INklav[5] == 'l') { SDdel(); //smazání souboru na SD kartě - sd del xxxxxxxxxx } else if(INklavesnice == "sload") { Sload(); //načtení programu ze sériového portu } else { Serial.println("Mé možnosti jsou omezené, musíš použít správný příkaz"); } } ///////////////////////podprogram vstupu z klávesnice////////////////////////// void klavesnice() { int x = 0; //proměnná počtu znaků z klávesnice znak = 0; //vynuluj znak do{ if(Serial.available() > 0) //pokud jsou dostupná data { znak = Serial.read(); //načti data do proměnné znak INklav[x] = znak; //ulož znak do pole x++; //zvyš proměnnou počtu znaků } }while(znak != 0x0D); //opakuj pokud nebyl stisknut enter x--; while(x < 21) { INklav[x] = 0; //smaž enter z řetězce x++; } INklavesnice = INklav; //převeď obsah pole do řetězce Serial.print(INklavesnice); Serial.println(" "); } /////////////////////podprogram čtení času/////////////////////////////////////////////////////////////////////// //void nactiRTC /////////////////////////////////podprogram help////////////////////////////////////// void help() { smaz(); //smaž obrazovku Serial.println(F("####################################################################################################")); Serial.println(F("# #")); Serial.println(F("# # # #### # ### #")); Serial.println(F("# # # # # # # #")); Serial.println(F("# ##### #### # ### #")); Serial.println(F("# # # # # # #")); Serial.println(F("# # # #### #### # #")); Serial.println(F("# #")); Serial.println(F("####################################################################################################")); Serial.println(F("# #")); Serial.println(F("# Seznam příkazů: #")); Serial.println(F("# --------------- #")); Serial.println(F("# help - tato nápověda #")); Serial.println(F("# info - informace o systému #")); Serial.println(F("# i2c scan - skenování a výpis zařízení na I2C sběrnici #")); Serial.println(F("# sd del - smaže soubor na sd kartě - sd del 8.3 (8 znaků název . 3 znaky přípona #")); Serial.println(F("# sd ls - výpis souborů na SD kartě #")); Serial.println(F("# sd info - informace o SD kartě #")); Serial.println(F("# out x y - zapiš data v proměnné x na adresu v proměnné y #")); Serial.println(F("# in x y - čti data z adresy v proměnné x do proměnné y #")); Serial.println(F("# cek x - čekej x = 1 - 99999 ms #")); Serial.println(F("# clr - smaž obrazovku #")); Serial.println(F("# x=y - zapiš celé číslo y do proměnné x, x je libovolné malé písmeno #")); Serial.println(F("# x== - vypiš obsah proměnné x #")); Serial.println(F("# x+y=z - sečti proměnné x a y a ulož do z #")); Serial.println(F("# x-y=z - odečti proměnné x a y a ulož do z #")); Serial.println(F("# x*y=z - vynásob proměnné x a y a ulož do z #")); Serial.println(F("# x/y=z - vyděl proměnné x a y a ulož do z #")); Serial.println(F("# ret - návrat do hlavní smyčky #")); Serial.println(F("# xx - uloží příkaz do paměti příkazů, xx je 2cif. číslo příkazu, pak mezera a příkaz #")); Serial.println(F("# xx== - vypíše příkaz z paměti příkazů, xx je dvouciferné číslo příkazu #")); Serial.println(F("# list - vypíše všechny příkazy z paměti příkazů #")); Serial.println(F("# run - spustí provedení příkazů v paměti příkazů #")); Serial.println(F("# jmp xx - skočí na příkaz číslo xx #")); Serial.println(F("# sd save - uloží příkazy v paměti na SD kartu do souboru - sd save 8.3 #")); Serial.println(F("# sd load - načte příkazy z SD karty ze souboru - sd save 8.3 do paměti programu #")); Serial.println(F("# #")); Serial.println(F("####################################################################################################")); Serial.println(F("# Strana 1/2 # Pro pokračování stiskni Enter #")); Serial.println(F("####################################################################################################")); klavesnice(); smaz(); Serial.println(F("####################################################################################################")); Serial.println(F("# #")); Serial.println(F("# # # #### # ### #")); Serial.println(F("# # # # # # # #")); Serial.println(F("# ##### #### # ### #")); Serial.println(F("# # # # # # #")); Serial.println(F("# # # #### #### # #")); Serial.println(F("# #")); Serial.println(F("####################################################################################################")); Serial.println(F("# #")); Serial.println(F("# Seznam příkazů: #")); Serial.println(F("# --------------- #")); Serial.println(F("# // - pokud řádek začíná // jde o komentář k programu který nic nevykoná #")); Serial.println(F("# if a b c d - podmíněný skok, a=proměnná, b=porovnání, c=proměnná, d=řádek skoku při splnění #")); Serial.println(F("# print XXX - vypíše text XXX #")); Serial.println(F("# del - vymaže paměť programu #")); Serial.println(F("# x&y=z - AND proměnných X a Y a ulož do Z #")); Serial.println(F("# x|y=z - OR proměnných X a Y a ulož do Z #")); Serial.println(F("# x^y=z - XOR proměnných X a Y a ulož do Z #")); Serial.println(F("# x~z - NOT proměnné X ulož do Z #")); Serial.println(F("# x>>z a - bitový posun X o počet bitů A vpravo a ulož do Z #")); Serial.println(F("# x< 0) //pokud jsou dostupná data { promenne[b] = Wire.read(); //načti je do proměnné b Serial.print("Načteno = "); Serial.println(promenne[b]); } } /////////////////////////////////////////////čekání//////////////////////////////////////////////////////////////////// void cekej() { char pole[5]; pole[0] = INklav[4]; pole[1] = INklav[5]; pole[2] = INklav[6]; pole[3] = INklav[7]; pole[4] = INklav[8]; int a = atoi(pole); delay(a); } ///////////////////////////////////////////návrat do hlavní smyčky///////////////////////////////////////////////////// void ret() { loop(); } ///////////////////////////////vytvoř proměnnou//////////////////////////////////////////////////////////////////////// void vytvorPROMENOU() { char pole[12]; int x = INklav[0]; //načti název proměnné x = x - 97; //převeď proměnnou na pozici v poli pole[0] = INklav[2]; pole[1] = INklav[3]; pole[2] = INklav[4]; pole[3] = INklav[5]; pole[4] = INklav[6]; pole[5] = INklav[7]; pole[6] = INklav[8]; pole[7] = INklav[9]; pole[8] = INklav[10]; pole[9] = INklav[11]; pole[10] = INklav[12]; pole[11] = INklav[13]; int a = atoi(pole); //převeď číslo z pole do int promenne[x] = a; //zapiš proměnnou do pole } /////////////////////////////////vypiš proměnnou//////////////////////////////////////////////////////////////////// void vypisPROMENOU() { Serial.print(INklav[0]); Serial.print("="); int x = INklav[0]; //načti název proměnné x = x - 97; //převeď proměnnou na pozici v poli Serial.println(promenne[x]); } ///////////////////////////////////sčítání/////////////////////////////////////////////////////////////////////////// void secti() { int x = INklav[0]; //načti název proměnné pro první číslo int y = INklav[2]; //načti název proměnné pro druhé číslo int z = INklav[4]; //načti název proměnné pro součet x = x - 97; //převeď proměnnou na pozici v poli y = y - 97; //převeď proměnnou na pozici v poli z = z - 97; //převeď proměnnou na pozici v poli promenne[z] = promenne[x] + promenne[y]; //sečti a ulož proměnné } ///////////////////////////////////odčítání/////////////////////////////////////////////////////////////////////////// void odecti() { int x = INklav[0]; //načti název proměnné pro první číslo int y = INklav[2]; //načti název proměnné pro druhé číslo int z = INklav[4]; //načti název proměnné pro součet x = x - 97; //převeď proměnnou na pozici v poli y = y - 97; //převeď proměnnou na pozici v poli z = z - 97; //převeď proměnnou na pozici v poli promenne[z] = promenne[x] - promenne[y]; //odečti a ulož proměnné } ///////////////////////////////////násobení/////////////////////////////////////////////////////////////////////////// void nasob() { int x = INklav[0]; //načti název proměnné pro první číslo int y = INklav[2]; //načti název proměnné pro druhé číslo int z = INklav[4]; //načti název proměnné pro součet x = x - 97; //převeď proměnnou na pozici v poli y = y - 97; //převeď proměnnou na pozici v poli z = z - 97; //převeď proměnnou na pozici v poli promenne[z] = promenne[x] * promenne[y]; //vynásob a ulož proměnné } ///////////////////////////////////dělení/////////////////////////////////////////////////////////////////////////// void vydel() { int x = INklav[0]; //načti název proměnné pro první číslo int y = INklav[2]; //načti název proměnné pro druhé číslo int z = INklav[4]; //načti název proměnné pro součet x = x - 97; //převeď proměnnou na pozici v poli y = y - 97; //převeď proměnnou na pozici v poli z = z - 97; //převeď proměnnou na pozici v poli promenne[z] = promenne[x] / promenne[y]; //vyděl a ulož proměnné } /////////////////////////////////////////////////AND//////////////////////////////////////////////////////////////////// void AND() { int x = INklav[0]; //načti název proměnné pro první číslo int y = INklav[2]; //načti název proměnné pro druhé číslo int z = INklav[4]; //načti název proměnné pro výsledek x = x - 97; //převeď proměnnou na pozici v poli y = y - 97; //převeď proměnnou na pozici v poli z = z - 97; //převeď proměnnou na pozici v poli promenne[z] = promenne[x] & promenne[y]; //vypočti a ulož proměnné } /////////////////////////////////////////////////OR////////////////////////////////////////////////////////////////////// void OR() { int x = INklav[0]; //načti název proměnné pro první číslo int y = INklav[2]; //načti název proměnné pro druhé číslo int z = INklav[4]; //načti název proměnné pro výsledek x = x - 97; //převeď proměnnou na pozici v poli y = y - 97; //převeď proměnnou na pozici v poli z = z - 97; //převeď proměnnou na pozici v poli promenne[z] = promenne[x] | promenne[y]; //vypočti a ulož proměnné } /////////////////////////////////////////////////NOT - negace//////////////////////////////////////////////////////////////////// void NOT() { int x = INklav[0]; //načti název proměnné pro první číslo int z = INklav[2]; //načti název proměnné pro výsledek x = x - 97; //převeď proměnnou na pozici v poli z = z - 97; //převeď proměnnou na pozici v poli promenne[z] = ~ promenne[x]; //vypočti a ulož proměnné } /////////////////////////////////////////////////XOR//////////////////////////////////////////////////////////////////// void XOR() { int x = INklav[0]; //načti název proměnné pro první číslo int y = INklav[2]; //načti název proměnné pro druhé číslo int z = INklav[4]; //načti název proměnné pro výsledek x = x - 97; //převeď proměnnou na pozici v poli y = y - 97; //převeď proměnnou na pozici v poli z = z - 97; //převeď proměnnou na pozici v poli promenne[z] = promenne[x] ^ promenne[y]; //vypočti a ulož proměnné } ////////////////////////////////////////////////bitový posun vpravo/////////////////////////////////////////////////////// void posunVPRAVO() { int x = INklav[0]; //načti název proměnné pro první číslo int z = INklav[3]; //načti název proměnné pro výsledek int a = INklav[5]; //načti počet bitů posuvu x = x - 97; //převeď proměnnou na pozici v poli z = z - 97; //převeď proměnnou na pozici v poli a = a - 48; //převeď proměnnou na počet bitů promenne[z] = promenne[x] >> a; } ////////////////////////////////////////////////bitový posun vlevo/////////////////////////////////////////////////////// void posunVLEVO() { int x = INklav[0]; //načti název proměnné pro první číslo int z = INklav[3]; //načti název proměnné pro výsledek int a = INklav[5]; //načti počet bitů posuvu x = x - 97; //převeď proměnnou na pozici v poli z = z - 97; //převeď proměnnou na pozici v poli a = a - 48; //převeď proměnnou na počet bitů promenne[z] = promenne[x] << a; } ////////////////////////////////////////////ulož příkaz do pole/////////////////////////////////////////////////////////// void ulozPRIKAZ() { char cislo[2]; cislo[0] = INklav[0]; cislo[1] = INklav[1]; int a = atoi(cislo); //převeď číslo z pole do int BASICpole[a] = INklavesnice; //ulož zadaný příkaz do pole příkazů } /////////////////////////////////////////načti příkaz z pole//////////////////////////////////////////////////////////// void nactiPRIKAZ() { char cislo[2]; cislo[0] = INklav[0]; cislo[1] = INklav[1]; int a = atoi(cislo); //převeď číslo z pole do int Serial.println(BASICpole[a]); //vypiš uložený příkaz z pole příkazů } ///////////////////////////////////////////výpis paměti příkazů/////////////////////////////////////////////////////////// void list() { int x; //proměnná čísla řádku z příkazu char cislo[2]; //pole pro číslo řádku z příkazu for(int a=0; a<100; a++) //opakuj pro všech 100 řádků { String radek = BASICpole[a]; //načti řádek číslo a cislo[0] = radek[0]; cislo[1] = radek[1]; x = atoi(cislo); //převeď číslo z pole do int if(x != 0) //pokud číslo řádku není 0 { Serial.println(radek); //vypiš řádek } } } /////////////////////////////////////////////běh programu z paměti příkazů//////////////////////////////////////////////////// void beh() { int x; //proměnná čísla řádku z příkazu char cislo[2]; //pole pro číslo řádku z příkazu for(q=0; q<100; q++) //opakuj pro všech 100 řádků { String radek = BASICpole[q]; //načti řádek číslo q cislo[0] = radek[0]; cislo[1] = radek[1]; x = atoi(cislo); //převeď číslo z pole do int if(x != 0) //pokud číslo řádku není 0 { int c=3; //počítadlo znaků čtení int d=0; //počítadlo znaků zápis for(int b=0; b<100; b++) { INklav[d] = radek[c]; //zkopíruj načtený řádek do proměnné klávesnice posunutý o 3 znaky - smaže označení řádku c++; //zvyš počítadlo d++; //zvyš počítadlo } INklavesnice = INklav; //zkopíruj do druhé proměnné vyber(); //proveď příkaz } } } ////////////////////////////////////////////skok na adresu//////////////////////////////////////////////////////////// void jump() { char cislo[2]; cislo[0] = INklav[4]; cislo[1] = INklav[5]; q = atoi(cislo); //převeď číslo z pole do int q = q-1; } ///////////////////////////////////////////podmíněný skok/////////////////////////////////////////////////////////////// void podminenySKOK() { int a; //první proměnná char b; //porovnávací znak int c; //druhá proměnná int d; //číslo řádku skoku char cislo[2]; //pole pro číslo řádku skoku a = INklav[3]; //načti název proměnné b = INklav[5]; //načti porovnávací znak c = INklav[7]; //načti název proměnné cislo[0] = INklav[9]; cislo[1] = INklav[10]; d = atoi(cislo); //převeď číslo z pole do int d = d-1; a = a - 97; //převeď proměnnou na pozici v poli c = c - 97; //převeď proměnnou na pozici v poli if(b == '<') //pokud je porovnávací znak < { if(promenne[a] < promenne[c]) //pokud je první proměnná menší než druhá { q = d; //proveď skok } } else if(b == '>') //pokud je porovnávací znak > { if(promenne[a] > promenne[c]) //pokud je první proměnná větší než druhá { q = d; //proveď skok } } else if(b == '=') //pokud je porovnávací znak = { if(promenne[a] == promenne[c]) //pokud je první proměnná a druhá proměnná stejná { q=d; //proveď skok } } } /////////////////////////////////////////////výpis textu////////////////////////////////// void print() { char text[50]; int c = 6; int d = 0; for(int b=0; b<50; b++) { text[d] = INklav[c]; //zkopíruj načtený řádek z proměnné klávesnice posunutý o 6 znaků příkazu do pole text c++; //zvyš počítadlo d++; //zvyš počítadlo } String text2 = text; Serial.println(text2); for (int i = 0; i < sizeof (text); ++ i) text [i] = (char) 0; //vymaž pole nact } //////////////////////////////////////////vymaž paměť programu///////////////////////////////////////////////////////////////// void del() { for(q=0; q<100; q++) //opakuj pro všech 100 řádků { for (int i = 0; i < sizeof (BASICpole[q]); ++ i) (BASICpole[q]) [i] = (char) 0; //vymaž paměť programu } } ///////////////////////////////////////////////serial load - načtení programu ze sériového portu////////////////////////////// void Sload() { char pole[4096]; //pole 4kB int x = 0; //počítadlo int y = 0; char nacteno; //načtený znak for(int a=0; a<4096; a++) { pole[a] = 0; } Serial.println("Čekám na data"); do { if(Serial.available()) //pokud jsou dostupná data { Serial.print("."); //napiš tečku nacteno = Serial.read(); //načti znak pole[x] = nacteno; //ulož do pole x++; //zvyš počítadlo } } while(nacteno!='@'); //čekám na načtení @ Serial.println(""); Serial.println("Načteno"); x=0; //vynuluj počítadlo do { nacteno = pole[y]; //načti znak z mezipaměti if(nacteno != 0x0D && nacteno != 0x0A) //pokud není načteno 0x0D nebo 0x0A { INklav[x] = nacteno; x++; y++; } else if(nacteno == 0x0D ) { x=0; INklavesnice = INklav; ulozPRIKAZ(); y++; } else if(nacteno == 0x0A) { x=0; for (int i = 0; i < sizeof (INklav); ++ i) INklav [i] = (char) 0; //vymaž pole nact INklavesnice = INklav; y++; } else { y++; } } while(nacteno!='@'); //čekám na načtení @ Serial.println("Načteno a připraveno"); } /*rámec obrazovky 100 x 40 znaků Serial.println(F("####################################################################################################")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("# #")); Serial.println(F("####################################################################################################")); */