Seminar iz kolegija Mikroupravljaci
Dependencies: mbed Akvizicija
565656klkl
Revision 0:5b31abb1ab50, committed 2019-11-17
- Comitter:
- jkordek
- Date:
- Sun Nov 17 07:48:15 2019 +0000
- Commit message:
- Inkubator - seminar iz kolegija Mikroupravljaci
Changed in this revision
diff -r 000000000000 -r 5b31abb1ab50 Akvizicija.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Akvizicija.lib Sun Nov 17 07:48:15 2019 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/jkordek/code/Akvizicija/#605e0524703e
diff -r 000000000000 -r 5b31abb1ab50 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Nov 17 07:48:15 2019 +0000 @@ -0,0 +1,310 @@ +#include "mbed.h" +#include "Akvizicija.h" // simulacija vrijednosti temperature i vlage - očitavanje vrijednosti s potenciometra + +#define debug true //flag za debug + +Akvizicija pot(p19,p20); //stvaranje objekta pot, p19 - pin potenciometra koji simulira temperaturu, p20 - pin potenciometra koji simulira vlagu + +Serial nextion(p13, p14); // tx, rx pinovi za Nextion zaslon +Serial pc(USBTX, USBRX, 115200); //PC monitor +LocalFileSystem local("local"); // Stvaranje objekta localfilesystem-a pod nazivom "local" + +Ticker akvizicija; //ticker za dohvaćanje vrijednosti temperature i vlage +Ticker NextionIspis; //ticker za slanje podataka s lpc-a na zaslon + +PwmOut vent(p21); //stvaranje pwm objekta pod nazivom "vent" + +char buffer[40]; //veličina buffera za primanje znakova sa nextion zaslona (dovoljno je 40 znakova) +int znak = 0; // redni broj znaka u polju znakova (stringu) +char read_string[128]; // veličina buffera za čitanje podataka iz datoteke (dovoljno je 128 znakova) + +//globalne varijable za spremanje trenutnih vrijednosti +//postavljene su u 0 ali se prilikom pokretanja vrijednosti pročitaju iz datoteke i spreme u globalne varijable +float PGZ = 0; +float IGZ = 0; +float DGZ = 0; +int hister = 0; +int pwm_fan = 0; +char ssid[30] = ""; +char pass[30] = ""; +float tset = 0; +int hset = 0; + +//varijavble za spremanje trenutnih vrijednosti temperature i vlage +float temperature = 0; +float humidity = 0; + +int broj_stranice = 0; //podatak o tome koja je stranica trenutno aktivna na Nextion zaslonu + +//funkcija koja je dodijeljena tickeru1 +void dohvativr() +{ + if (broj_stranice ==0) { + temperature = pot.getTemp(); + humidity = pot.getVlaga(); + } +} + +//funkcija koja je dodijeljena tickeru2 +void nextion_ispis() +{ + if (broj_stranice == 0) {//ispisuj samo ako je aktivna stranica broj 0 + + nextion.printf("add 10,0,"); + nextion.printf("%d",(int)temperature); + nextion.printf("\xFF\xFF\xFF"); + + nextion.printf("add 10,1,"); + nextion.printf("%d",(int)tset); + nextion.printf("\xFF\xFF\xFF"); + + nextion.printf("add 11,0,"); + nextion.printf("%d", (int)humidity); + nextion.printf("\xFF\xFF\xFF"); + + nextion.printf("add 11,1,"); + nextion.printf("%d",(int)hset); + nextion.printf("\xFF\xFF\xFF"); + + nextion.printf("temp.txt=\""); + nextion.printf("%.1f\260C",temperature); // znak 260 je "°" + nextion.printf("\"\xFF\xFF\xFF"); + + nextion.printf("vlaga.txt=\""); + nextion.printf("%.0f%c", humidity, 37); //znak 37 je "%" + nextion.printf("\"\xFF\xFF\xFF"); + } +} + +//funkcija koja vraća substring nekog stringa, argumenti su string, početak (m-ti znak) i kraj (n-ti znak) +char* substr(const char *src, int m, int n) +{ + // veličina substringa + int len = n - m; + + // allocate (len + 1) chars for destination (+1 for extra null character) + // The C library function void *malloc(size_t size) allocates the requested memory and returns a pointer to it. + char *dest = (char*)malloc(sizeof(char) * (len + 1)); + + // extracts characters between m'th and n'th index from source string and copy them into the destination string + for (int i = m; i < n && (*src != '\0'); i++) { + *dest = *(src + i); + dest++; + } + + // null-terminate the destination string + *dest = '\0'; + + // return the destination string + return dest - len; +} + +//Rx_interrupt rutina +void Rx_Interrupt(void) +{ + char c; + bool zapis; + + if(nextion.readable()) { + c = nextion.getc(); //očitaj znak i pohrani ga u varijablu "c" + buffer[znak] = c; //pohrani znak "c" u polje znakova pod indexom "znak" + znak++; //inkrement indexa + if ((znak >= 3) && (buffer[znak-1] == 0xff) && (buffer[znak-2] == 0xff) && (buffer[znak-3] == 0xff)) { //ako primljena poruka završava s “\xFF\xFF\xFF” (kraj naredbe) + + if (debug) pc.printf("primljeno: %s\n\r", buffer); // prikaži primljenu poruku + //strstr funkcija vraća index na kojem se prvi puta pojavljuje substring u stringu, ako ne postoji vraća NULL + if(strstr(buffer, "ppage") != NULL) { //ako je primljen broj stranice + broj_stranice = buffer[5] - 48; //npr. ppage2 >> buffer[5]-48 = 50 - 48 = 2 + if (debug) pc.printf("stranica %d\n\r", broj_stranice); // prikaži primljenu poruku + } + + else if(strstr(buffer, "pPGZ=") != NULL) { + char* dest = substr(buffer, strlen("pPGZ="), znak-3); //pokazivac na vrijednost PGZ-a u bufferu + PGZ = atof(dest); + if (debug) pc.printf("PGZ: %.3f\n\r", PGZ); // prikaži primljenu poruku + zapis = true; + } else if(strstr(buffer, "pIGZ=") != NULL) { + char* dest = substr(buffer, strlen("pIGZ="), znak-3); //pokazivac na vrijednost IGZ-a u bufferu + IGZ = atof(dest); + if (debug) pc.printf("IGZ: %.3f\n\r", IGZ); // prikaži primljenu poruku + zapis = true; + } else if(strstr(buffer, "pDGZ=") != NULL) { + char* dest = substr(buffer, strlen("pDGZ="), znak-3); //pokazivac na vrijednost DGZ-a u bufferu + DGZ = atof(dest); + if (debug) pc.printf("DGZ: %.3f\n\r", DGZ); // prikaži primljenu poruku + zapis = true; + } else if(strstr(buffer, "phister=") != NULL) { + char* dest = substr(buffer, strlen("phister="), znak-3); + hister = atoi(dest); + if (debug) pc.printf("histereza: %d\n\r", hister); // prikaži primljenu poruku + zapis = true; + } else if(strstr(buffer, "ppwm_fan=") != NULL) { + char* dest = substr(buffer, strlen("ppwm_fan="), znak-3); + pwm_fan = atoi(dest); + if (debug) pc.printf("pwm fan: %d\n\r", pwm_fan); // prikaži primljenu poruku + vent = pwm_fan/100.0; // postavi vrijednost faktora vođenja + zapis = true; + } else if(strstr(buffer, "ps=") != NULL) { + char* dest = substr(buffer, strlen("ps="), znak-3); + strcpy(ssid, dest); + if (debug) pc.printf("ssid: %s\n\r", ssid); // prikaži primljenu poruku + zapis = true; + } else if(strstr(buffer, "pp=") != NULL) { + char* dest = substr(buffer, strlen("pp="), znak-3); + strcpy(pass, dest); + if (debug) pc.printf("pass: %s\n\r", pass); // prikaži primljenu poruku + zapis = true; + } else if(strstr(buffer, "ptset=") != NULL) { + char* dest = substr(buffer, strlen("ptset="), znak-3); + tset = atof(dest); + if (debug) pc.printf("temp set: %.1f\n\r", tset); // prikaži primljenu poruku + zapis = true; + } else if(strstr(buffer, "phset=") != NULL) { + char* dest = substr(buffer, strlen("phset="), znak-3); + hset = atoi(dest); + if (debug) pc.printf("histereza: %d\n\r", hset); // prikaži primljenu poruku + zapis = true; + } + if(zapis) { //ako je došlo do promjene parametara otvori datoteku i pohrani vrijednosti + FILE *File2 = fopen("/local/textfile.txt", "w"); // Open "out.txt" on the local file system for writing + fprintf(File2, "%.3f\r%.3f\r%.3f\r%d\r%d\r%s\r%s\r%.1f\r%d\r", PGZ, IGZ, DGZ, hister, pwm_fan, ssid, pass, tset, hset); + fclose(File2); + zapis = false; + } + + memset(buffer,0,strlen(buffer)); //isprazni buffer + znak = 0; //ponovno sastavljaj polje znakova od nulte pozicije + } + } +} + +void init(){ + +nextion.baud(115200); + nextion.attach(&Rx_Interrupt, Serial::RxIrq); // Serial prekid + akvizicija.attach(&dohvativr, 0.5); //ticker, svakih 500ms + NextionIspis.attach(&nextion_ispis, 0.5); //ticker, svakih 500ms + +//-------------------------- citanje iz datoteke --------------------------------------------// + + FILE* File2 = fopen ("/local/textfile.txt","r"); // otvori datoteku + fgets(read_string,128,File2); // pročitaj podatke + fclose(File2); // zatvori datoteku + + int init_size = strlen(read_string); + char delim[] = "\n\r"; + + char *ptr = strtok(read_string, delim); + + int i = 0; + + while(ptr != NULL) { + + switch (i) { + + case 0: + PGZ = atof(ptr); + break; + + case 1: + IGZ = atof(ptr); + break; + + case 2: + DGZ = atof(ptr); + break; + + case 3: + hister = atoi(ptr); + break; + + case 4: + pwm_fan = atoi(ptr); + break; + + case 5: + strcpy(ssid, ptr); + break; + + case 6: + strcpy(pass, ptr); + break; + + case 7: + tset = atof(ptr); + break; + + case 8: + hset = atoi(ptr); + break; + + default: + printf("Greska\n\r"); + } + + if (debug) printf("%s", ptr); + ptr = strtok(NULL, delim); + i++; + + } + i = 0; //jel treba uopće ovo? +//---------------------------------------------------------------------------------------------------// + +//-------------------------- slanje zaslonu prilikom inicijalizacije --------------------------------------------// + + nextion.printf("page2.t0.txt=\""); + nextion.printf("%.3f",PGZ); + nextion.printf("\"\xFF\xFF\xFF"); + + nextion.printf("page2.t1.txt=\""); + nextion.printf("%.3f",IGZ); + nextion.printf("\"\xFF\xFF\xFF"); + + nextion.printf("page2.t2.txt=\""); + nextion.printf("%.3f",DGZ); + nextion.printf("\"\xFF\xFF\xFF"); + + nextion.printf("page2.n0.val="); + nextion.printf("%d",hister); + nextion.printf("\xFF\xFF\xFF"); + + nextion.printf("page2.n1.val="); + nextion.printf("%d", pwm_fan); + nextion.printf("\xFF\xFF\xFF"); + + nextion.printf("page4.t0.txt=\""); + nextion.printf("%s",ssid); + nextion.printf("\"\xFF\xFF\xFF"); + + nextion.printf("page4.t1.txt=\""); + nextion.printf("%s",pass); + nextion.printf("\"\xFF\xFF\xFF"); + + nextion.printf("page0.t6.txt=\""); + nextion.printf("%.1f",tset); + nextion.printf("\"\xFF\xFF\xFF"); + + nextion.printf("page0.t2.txt=\""); + nextion.printf("%d",hset); + nextion.printf("\"\xFF\xFF\xFF"); + +//---------------------------------------------------------------------------------------------------// + +} + +void pwmInit(){ + vent.period(0.010); //pwm frekvencija 100 Hz + vent = pwm_fan/100.0; //skaliraj pwm +} + +int main() +{ + init(); + pwmInit(); + + while (1) { + wait(0.5); // Ne radi ništa + } +} + +
diff -r 000000000000 -r 5b31abb1ab50 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sun Nov 17 07:48:15 2019 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file