STM32L476
Dependencies: MbedJSONValue SDFileSystem WConstants mbed-dev DS1820 TinyGPSPlus epd1in54
Fork of A_SSL_Main by
main.cpp
- Committer:
- WaleedElmughrabi
- Date:
- 2018-08-30
- Revision:
- 6:d30c8e8678c9
- Parent:
- 5:4525141f69d2
- Child:
- 8:bc5a3b2ff424
File content as of revision 6:d30c8e8678c9:
#include "mbed.h" #include "stm32l496g_discovery.h" #include "stm32l496g_discovery_lcd.h" #include "stm32l496g_discovery_sd.h" #include "DS1820.h" #include "epd1in54.h" #include "stdio.h" #include "math.h" #include "TinyGPSPlus.h" #include "SDFileSystem.h" #include "errno.h" #define TX5 PG_7 #define RX5 PG_8 #define GPSBaud 9600 #define Serial0Baud 115200 #define SD_FILE_SYSTEM_H SDFileSystem* fs; FILE* fp; Serial GPSSerial(TX5, RX5); TinyGPSPlus tgps; void displayInfo(void); int i = 0; //DS18B20 temperature sensor Serial serial(USBTX, USBRX); DS1820 ds1820(PG_15); //pin name connected to the DS1820 data pin float t; float tempSerial; float tCompare = 0; int ab=1; SDFileSystem sd(PI_3, PC_2, PD_3, PB_12, "sd"); //E-ink Display // Control PinName rst; PinName dc; PinName busy; //SPI communication PinName mosi; PinName miso; PinName sclk; PinName cs; unsigned char frame_black[EPD_HEIGHT*EPD_WIDTH/8]; //function to determine if within polygon geofence //first argument is an integer, the rest are floats //The last vertix should be the same as the first vertix int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy) { int i, j, c = 0; for (i = 0, j = nvert-1; i < nvert; j = i++) { if ( ((verty[i]>testy) != (verty[j]>testy)) && (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) ) c = !c; } return c; } int inCircle(float radius, float xcentre, float ycentre, float testx, float testy) { float distance; int test; distance = (sqrt((testx-xcentre)*(testx-xcentre)+(testy-ycentre)*(testy-ycentre))); if(distance < radius){ test = 1; } else{ test = 0; } return (test); } //GPS acquisition void displayInfo(void) { serial.printf("Location: "); if (tgps.location.isValid()) { serial.printf("%3.6f, %3.6f", tgps.location.lat(), tgps.location.lng()); } else { serial.printf("INVALID"); } serial.printf(" - Date/Time: "); if (tgps.date.isValid()) { serial.printf("%d/", tgps.date.year()); if (tgps.date.month() < 10) serial.printf("0"); serial.printf("%d/", tgps.date.month()); if (tgps.date.day() < 10) serial.printf("0"); serial.printf("%d", tgps.date.day()); } else { serial.printf("INVALID"); } serial.printf(" "); if (tgps.time.isValid()) { if (tgps.time.hour() < 10) serial.printf("0"); serial.printf("%d:", tgps.time.hour()); if (tgps.time.minute() < 10) serial.printf("0"); serial.printf("%d:", tgps.time.minute()); if (tgps.time.second() < 10) serial.printf("0"); serial.printf("%d\r\n", tgps.time.second()); } else { serial.printf("INVALID\r\n"); } } float getTemp() { float t; // getTemp(tRead); if(ds1820.begin()) { ds1820.startConversion(); wait(1.0); t = ds1820.read(); // read temperature tCompare; serial.printf("temp = %3.1f\r\n", t); // Display temp on terminal } else serial.printf("No DS1820 sensor found!\r\n"); mosi = PB_5; miso = PB_4; sclk = PA_5; cs = PA_15; rst = PI_6; dc = PG_6; busy = PI_11; char cVal[32]; //char* t_str; sprintf(cVal,"%.2f", t); memset(frame_black, 0xFF, sizeof(unsigned char)*EPD_HEIGHT*EPD_WIDTH/8); Epd epd = Epd(mosi, miso, sclk, cs, dc, rst, busy); if (epd.Init(lut_full_update) != 0) { return -1; } /*Write strings to the buffer */ epd.DrawStringAt(frame_black, 50, 30, cVal, &Font24, COLORED); epd.DrawStringAt(frame_black, 28, 10, "Temperature", &Font16, COLORED); /* Display the frame_buffer */ epd.SetFrameMemory(frame_black, 0, 0, epd.width, epd.height); epd.DisplayFrame(); epd.Sleep(); return t; } int sdCard() { //SD card // Create and mount SDFileSystem /*fs = new SDFileSystem(PI_3, PC_2, PD_3, PB_12, "sd"); // mosi, miso, sck, cs serial.printf("Mounting file system...\r\n"); int err = fs->mount(); serial.printf("%s\r\n", (err ? "Failed :(\r\n" : "OK\r\n")); if (err) return err; // Open the file. serial.printf("Opening file '/sd/mytest/sdtest.txt'... "); fp = fopen("/sd/mytest/sdtest.txt", "w+"); serial.printf("%s\r\n", (!fp ? "Failed :(\r\n" : "OK\r\n")); if (!fp) { // Check whether directory '/sd/mytest' exists. serial.printf("\r\nChecking directory '/sd/mytest'...\r\n"); struct stat info; err = stat("/sd/mytest", &info); if (err) { serial.printf("Directory '/sd/mytest' does not exist.\r\n"); serial.printf("Trying to create it..."); err = mkdir("/sd/mytest", 0777); serial.printf("%s\r\n", (err ? "Failed :(\r\n" : "OK\r\n")); if (err) return err; } // Create a new 'sdtest.txt' file. serial.printf("File not found, creating a new one...\r\n"); fp = fopen("/sd/mytest/sdtest.txt", "w+"); serial.printf("%s\r\n", (!fp ? "Failed :(" : "OK")); if (!fp) { error("error: %s (%d)\r\n", strerror(errno), -errno); return errno; } } for (int i = 0; i < 10; i++) { serial.printf("Writing numbers (%d/%d)... ", i, 10); err = fprintf(fp, " %d\r\n", i); if (err < 0) { serial.printf("Fail :(\r\n"); error("error: %s (%d)\r\n", strerror(errno), -errno); } else serial.printf("OK\r\n"); } serial.printf("Writing numbers (%d/%d)... OK\r\n\r\n", 10, 10); err = fclose(fp); serial.printf("Closing file '/sd/mytest/sdtest.txt'... "); //serial.printf("%s\r\n", (err ? "Failed :(\r\n" : "OK\r\n")); //if (err) // return err; */ //Mount the filesystem sd.mount(); //Perform a write test printf("\nWriting to SD card..."); FILE *fp = fopen("/sd/sdtest.txt", "w"); if (fp != NULL) { fprintf(fp, "We're writing to an SD card!"); fclose(fp); printf("success!\n"); } else { printf("failed!\n"); } //Perform a read test printf("Reading from SD card..."); fp = fopen("/sd/sdtest.txt", "r"); if (fp != NULL) { char c = fgetc(fp); if (c == 'W') printf("success!\n"); else printf("incorrect char (%c)!\n", c); fclose(fp); } else { printf("failed!\n"); } //Unmount the filesystem sd.unmount(); } int main() { GPSSerial.baud(GPSBaud); wait(0.001); //Variables int inpoly; float x[5] = { 1,4,4,1,1}; float y[5] = { 1,1,4,4,1}; float xtest; float ytest; float cx = 1; float cy = 50; float r = 15; int ans = 0; float liquidTemp = 0; wait(2); while(1){ //inCircle(r, cx, cy, xtest, ytest); //serial.printf("rx = 0x%02X\n", aRxBuffer); //tempSerial = getTemp(t); //inpoly = pnpoly(5,x, y, xtest,ytest); //serial.printf("inpoly = %d\r\n", inpoly); //ans = inCircle(r, cx, cy, xtest, ytest); //serial.printf("distance = %3.1f\r\n", ans); // GPS //if(gps.sample()){ // serial.printf("%f\t%c\t%f\t%c\t%f\t%f\t%f\n\r",gps.longitude, gps.ns,gps.latitude,gps.ew, gps.alt, gps.geoid, gps.time); // serial.printf("%d:%d:%d",gps.hour,gps.minute,gps.seconed); // } sdCard(); while(1) { //wait (1); if (tgps.encode(GPSSerial.getc())) { displayInfo(); xtest = tgps.location.lng(); ytest = tgps.location.lat(); serial.printf("\r\n %3.6f, %3.6f, \r\n", ytest, xtest); ans = inCircle(r, cx, cy, xtest, ytest); wait(5); //little delay to prevent double writing liquidTemp = getTemp(); serial.printf("\r\n In geofence = %d: \r\n", ans); } if (millis() > 5000 && tgps.charsProcessed() < 10) { serial.printf("No GPS detected: check wiring.\r\n"); // while(true); break; } } serial.printf("%d\r\n",i); i++; wait(1.0); } wait(5); }