#include <SD.h>
#include <Wire.h>
#include <SPI.h>
#include <ss_oled.h>
int nextaction=11;
#define CS_PIN 10
#define useSerialOutput 1
#define debugmode 1
#define CARD_NONE 1
#define BTNstart 2
#define JUST_LEFT -1
#define JUST_RIGHT -2
#define JUST_CENTRE -3
//OLED Display
//#define OLED_I2C_ADDRESS 0x3C
//#define OLED_RST_PIN -1
#define pinOLED_SDA -1
#define pinOLED_SCL -1
#define pinOLED_RESET -1
#define OLED_FLIPPED 1
#define OLED_INVERTED 0
// Use bit banging to get higher speed output
#define OLED_HARDWARE_I2C 1
#define OLED_WIDTH 132
#define OLED_HEIGHT 64
#define OLED_INVERT 1
#define OLED_NORMAL 0
#define OLED_RENDER 1
#define OLED_TOF_L_TAB 18
#define OLED_TOF_R_TAB 84
#define OLED_TOF_Line 3
#define OLED_SD_Line 5
#define OLED_STATUS_Line 7
//SPI Bus for SDcard
int pinSck = 5;
int pinMiso = 19;
int pinMosi = 27;
int pinCs = 10;
File root;
String Apt="Apaname";
String dev="devname";
int tempint=55;
int dat[9]={1,1,-30,-40,2100,100,200,300,400}; //apt num, dev num, rssi,rssi,height, data x ?
String GLOBALfilefield;
String lineOfDashes="----------------";
SSOLED oled;
void setup() {
float tl=15.56;
float tr=19.45;
bool showLogin;
int oledResult=0;
Serial.begin(115200);
pinMode(BTNstart, INPUT);
//Setup the OLED
oledResult = oledInit(&oled, OLED_132x64, 0x3c, OLED_FLIPPED, OLED_INVERTED, OLED_HARDWARE_I2C, pinOLED_SDA, pinOLED_SCL, pinOLED_RESET, 400000L);
oledFill(&oled, 0,1);
Serial.print("Initializing SD card... ");
if (!SD.begin(CS_PIN)) {
Serial.println("Card initialization failed!");
while (true);
}
OLEDinitialiseDisplay();
switch (nextaction) {
case 0:
disp_sensors();
break;
case 1:
//scan
OLEDstatus("Align START",OLED_NORMAL);
delay(1000);
OLEDwriteFloat(tl,OLED_TOF_L_TAB,OLED_TOF_Line,0);
OLEDwriteFloat(tr,OLED_TOF_R_TAB,OLED_TOF_Line,0);
break;
case 2:
//needs to move
OLEDprintAt("MOVE THE SENSOR",JUST_CENTRE,OLED_TOF_Line,true);
OLEDprintAt("CLOSER TO THE",JUST_CENTRE,OLED_TOF_Line+1,true);
OLEDprintAt("WALL",JUST_CENTRE,OLED_TOF_Line+2,true);
break;
case 3:
onOTAStart();
break;
case 4:
onOTAStart();
onOTAProgress(10000,25000);
break;
case 5:
onOTAEnd(true);
break;
case 6:
onOTAEnd(false);
break;
case 7:
OLEDprintAt("LEFT", JUST_LEFT, 0, OLED_NORMAL);
OLEDprintAt("RIGHT", JUST_RIGHT, 1, OLED_NORMAL);
OLEDprintAt("CENTRE", JUST_CENTRE, 2, OLED_NORMAL);
case 8:
//waitingForWiFiScreen();
oledFill(&oled, 0,1);
OLEDprintAt("Waiting for WiFi", JUST_LEFT, 0, OLED_NORMAL);
OLEDprintAt("to engage", JUST_CENTRE, 1, OLED_NORMAL);
OLEDprintAt(lineOfDashes, JUST_LEFT, 2, OLED_NORMAL);
OLEDprintAt("Connecting to", JUST_CENTRE, 4, OLED_NORMAL);
OLEDprintAt("IVST_1234567890", JUST_CENTRE, 5, OLED_NORMAL);
OLEDprintAt(" 10 ", JUST_CENTRE, 7, OLED_NORMAL); //Cntleft
//OLEDprintAt(" " + "10" + " ", JUST_CENTRE, 6, OLED_NORMAL); //Cntleft
break;
case 9:
oledFill(&oled, 0,1);
OLEDprintAt("WiFi Error", JUST_CENTRE, 0, OLED_INVERT);
OLEDprintAt("No connection to", JUST_CENTRE, 1, OLED_NORMAL);
OLEDprintAt("IVST_1234567890", JUST_CENTRE, 2, OLED_INVERT); //tempSSID
OLEDprintAt("Check that WiFi", 0, 4, OLED_NORMAL);
OLEDprintAt("is 2.4Ghz & not ", 0, 5, OLED_NORMAL);
OLEDprintAt("using the same", 0, 6, OLED_NORMAL);
OLEDprintAt("SSID with 5Ghz", 0, 7, OLED_NORMAL);
break;
case 10:
do {
delay(0);
showLogin=OLEDshowLoginScreen();
} while (showLogin);
oledFill(&oled, 0,1);
break;
case 11:
OLEDshowOTAScreen();
}
}
void onOTAStart() {
// Log when OTA has started
#if (useSerialOutput)
Serial.println("OTA update started!");
#endif
oledFill(&oled, 0,1);
OLEDprintAt("OTA update", JUST_CENTRE, 0, OLED_NORMAL);
OLEDprintAt("Started", JUST_CENTRE, 1, OLED_NORMAL);
OLEDprintAt(lineOfDashes, JUST_LEFT, 2, OLED_NORMAL);
}
void onOTAProgress(size_t current, size_t final) {
//if (millis() - ota_progress_millis > 500) {
//ota_progress_millis = millis();
OLEDprintAt(String(current)+" bytes ", 0, 5, OLED_NORMAL);
OLEDprintAt("of " + String(final)+" ", 0, 6, OLED_NORMAL);
//}
}
void onOTAEnd(bool success) {
bool buttonResult;
// Log when OTA has finished
oledFill(&oled, 0,1);
if (success) {
OLEDprintAt("OTA update", JUST_CENTRE, 1, OLED_NORMAL);
OLEDprintAt("completed", JUST_CENTRE, 2, OLED_NORMAL);
OLEDprintAt("successfully!", JUST_CENTRE, 3, OLED_NORMAL);
#if (useSerialOutput)
Serial.println("OTA update finished successfully!");
#endif
} else {
OLEDprintAt("OTA update", JUST_CENTRE, 1, OLED_INVERT);
OLEDprintAt("ERROR!", JUST_CENTRE, 2, OLED_INVERT);
#if (useSerialOutput)
Serial.println("OTA update ERROR!");
#endif
}
OLEDprintAt("Press START", JUST_CENTRE, 6, OLED_NORMAL);
OLEDprintAt("to restart", JUST_CENTRE, 7, OLED_NORMAL);
waitForStartButton(0); //do we need ElegantOTA.loop();?
oledFill(&oled, 0,1);
//
}
void disp_sensors() {
if (random(1,100)>50){
oledWriteString(&oled, 0,OLED_TOF_L_TAB,OLED_TOF_Line,(char *)"FAIL", FONT_8x8, OLED_INVERT, OLED_RENDER);
} else {
oledWriteString(&oled, 0,OLED_TOF_L_TAB,OLED_TOF_Line,(char *)"RDY", FONT_8x8, OLED_NORMAL, OLED_RENDER);
}
#if (debugmode)
Serial.println("TOFsensorLeft is online");
#endif
if (random(1,100)>50){
oledWriteString(&oled, 0,OLED_TOF_R_TAB,OLED_TOF_Line,(char *)"FAIL", FONT_8x8, OLED_INVERT, OLED_RENDER);
} else {
oledWriteString(&oled, 0,OLED_TOF_R_TAB,OLED_TOF_Line,(char *)"RDY", FONT_8x8, OLED_NORMAL, OLED_RENDER);
}
#if (debugmode)
Serial.println("TOFsensorRight is online");
#endif
}
void sddemo(){
File textFile;
Serial.println("initialization done.");
Serial.println("Files in the card:");
root = SD.open("/");
printDirectory(root, 0);
Serial.println("");
// Example of reading file from the card:
textFile = SD.open("wokwi.txt",FILE_WRITE);
// textFile.println("Apart,Device,Device Name,Rssi,Rssi,Height,W,x,y,z");
// textFile.println("Name,5,Bob,-57,-67,2000,900,800,700,600");
textFile.println(Apt);
textFile.println(dev);
textFile.println(String(tempint));
textFile.close();
textFile = SD.open("wokwi.txt",FILE_READ);
// textFile.println("Apart,Device,Device Name,Rssi,Rssi,Height,W,x,y,z");
// textFile.println("Name,5,Bob,-57,-67,2000,900,800,700,600");
readtext(textFile);
readtext(textFile);
readtext(textFile);
readtext(textFile);
textFile.close();
}
void readtext(File f) { //read a value from the file
String temptext;
String temp2;
int Tlen;
GLOBALfilefield = f.readStringUntil('\n');
#if (useSerialOutput)
Serial.println("-----> Raw String :" + GLOBALfilefield);
#endif
}
void loop() {
// nothing happens after setup finishes.
}
void printDirectory(File dir, int numTabs) {
while (true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
break;
}
for (uint8_t i = 0; i < numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs + 1);
} else {
// files have sizes, directories do not
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}
void OLEDinitialiseDisplay() { //
oledFill(&oled, 0,1);
oledWriteString(&oled, 0,0,0,(char *)"ICON Survey Tool", FONT_8x8, OLED_NORMAL, OLED_RENDER);
oledWriteString(&oled, 0,0,OLED_TOF_Line,(char *)"L:", FONT_8x8, OLED_NORMAL, OLED_RENDER);
oledWriteString(&oled, 0,66,OLED_TOF_Line,(char *)"F:", FONT_8x8, OLED_NORMAL, OLED_RENDER);
//sprintf(tempchar,"%02d",EP);
//oledWriteString(&oled, 0,OLEDepTab,7,(char *)tempchar, FONT_8x8, OLED_NORMAL, OLED_RENDER);
}
void OLEDwriteFloat(float thisval,int x,int y, byte invert) { //
char tempchar[30];
sprintf(tempchar,"%3.2f",thisval);
x=OLEDcalcx(x,6);
oledWriteString(&oled, 0,x,y,(char *)tempchar, FONT_8x8, invert,OLED_RENDER);
}
void OLEDprintAt(String thisval,int x,int y, byte invert) { //
char tempchar[30];
x=OLEDcalcx(x,thisval.length());
thisval.toCharArray(tempchar,30);
oledWriteString(&oled, 0,x,y,(char *)tempchar, FONT_8x8, invert,OLED_RENDER);
}
byte OLEDcalcx(int x, byte lengthText) {
switch (x) {
case JUST_LEFT:
x=0;
break;
case JUST_RIGHT:
x=128-(lengthText*8);
break;
case JUST_CENTRE:
x=(128-(lengthText*8))/2;
break;
default:
x=x*8;
}
return x;
}
void OLEDstatus(String thisval, byte invert) { //
char tempchar[30];
thisval.toCharArray(tempchar,30);
oledWriteString(&oled, 0,0,OLED_STATUS_Line,(char *)tempchar, FONT_8x8, invert,OLED_RENDER);
}
bool OLEDShowSDData() {
String SDdesc="U/K";
bool testPassed=true;
char tempchar[30];
uint8_t cardType=1;
uint64_t cardSize;
bool SDFAILED=1;
if (SDFAILED) { //the SD Mount has failed. Check the card.
strcpy(tempchar,"SD Card failed");
testPassed=false;
} else {
if (cardType == CARD_NONE) {
strcpy(tempchar,"No SD card attached");
testPassed=false;
}
}
SDdesc="SDSC";
cardSize = 64000000 / (1024 * 1024);
sprintf(tempchar,"%s %03d GB",SDdesc,cardSize*0.0009765625);
oledWriteString(&oled, 0,0,OLED_SD_Line,(char *)tempchar, FONT_8x8, OLED_NORMAL, OLED_RENDER);
return testPassed; //return that there was no failure
}
bool OLEDshowLoginScreen() {
int buttonResult;
bool showPass=false;
String ipaddr;
unsigned long tmrcheck;
char WSssid[30]="IVST_1029333";
char WSpass[30]="1929174";
//ipaddr = WiFi.softAPIP().toString();
ipaddr="192.168.4.1";
oledFill(&oled, 0,1);
OLEDprintAt("Change your WiFi", JUST_CENTRE, 0, OLED_NORMAL);
OLEDprintAt("connection to", JUST_CENTRE, 1, OLED_NORMAL);
OLEDprintAt(WSssid, JUST_CENTRE, 2, OLED_NORMAL);
OLEDprintAt("and browse to", JUST_CENTRE, 3, OLED_NORMAL);
OLEDprintAt("http://", JUST_LEFT, 4, OLED_NORMAL);
OLEDprintAt(ipaddr, JUST_RIGHT, 5, OLED_NORMAL);
OLEDprintAt("Then press START", JUST_CENTRE, 7, OLED_NORMAL);
waitForStartButton(0);
tmrcheck=millis();
do {
buttonResult = digitalRead(BTNstart);
delay(20);
//server.handleClient(); //check for webserver events
if (millis()>tmrcheck+1000) { //the button has been pressed for more than a second
buttonResult=0; //make sure we drop out
showPass=true; //we want to look at the password
}
} while (buttonResult==1); //wait for the Unlock button.
if (showPass==true) {
oledFill(&oled, 0,1);
OLEDprintAt("Details", JUST_CENTRE, 0, OLED_NORMAL);
OLEDprintAt(WSssid, JUST_LEFT, 2, OLED_NORMAL);
OLEDprintAt(WSpass, JUST_LEFT, 3, OLED_NORMAL);
OLEDprintAt("Release to clear", JUST_CENTRE, 7, OLED_NORMAL);
waitForStartButton(1);
}
return showPass; //if true, go display the login screen again
}
void waitForStartButton(byte whichstate) {
byte buttonResult;
do {
buttonResult = digitalRead(BTNstart);
delay(20);
//server.handleClient(); //check for webserver events
} while (buttonResult == whichstate); //wait for the Unlock button.
}
void OLEDshowOTAScreen() {
char ipaddr[30];
String temp;
//ipaddr = WiFi.localIP().toString() + "/update";
temp="192.168.1.4/update";
temp.toCharArray(ipaddr,30);
oledFill(&oled, 0,1);
OLEDprintAt("OTA mode engaged", JUST_CENTRE, 0, OLED_NORMAL);
OLEDprintAt(lineOfDashes, JUST_LEFT, 1, OLED_NORMAL);
OLEDprintAt("Browse to", JUST_CENTRE, 2, OLED_NORMAL);
OLEDprintAt("http://", JUST_LEFT, 3, OLED_NORMAL);
OLEDprintAt("Now set the OTA", JUST_CENTRE, 7, OLED_NORMAL);
OLEDprintAt("switch to off!", JUST_CENTRE, 8, OLED_NORMAL);
oledWriteString(&oled, 0,0,4,(char *)ipaddr, FONT_SMALL, OLED_NORMAL, OLED_RENDER);
}