catalin004 Postat Noiembrie 3, 2017 Partajează Postat Noiembrie 3, 2017 (editat) Salutare...am un proiect pentru master, si anume sa realizez un termostat electronic, cu afisaj LCD, pe placa originala de la Pickit2...Momentan am am vrut doar sa citesc temperatura de la un senzor de temp (acum am potentiometru), insa imi apar multe zecimale cu 999 la sfarsit....asa ca rog ajutor... #include "LCD_config.h" #include "globalvar.h" #include "HW_config.h" //Read ADC void ReadADC() { temp_senz = ADC_Read(1); //read the voltage on ADC 0 temp = ((long)temp_senz*5000)/1023; //calculate the temperature } void LCD_start() { //Init & Clear LCD LCD_Init(); LCD_CMD(_LCD_CURSOR_OFF); LCD_CMD(_LCD_CLEAR); LCD_Out(1,1," TERMOSTAT "); LCD_Out(2,1," 2017- ASI "); delay_ms(3000); LCD_CMD(_LCD_CLEAR); LCD_Out(1, 1,"READ-TEMP:"); LCD_Out(2, 1,"SET-TEMP:"); //Show set temperature ByteToStr(setTemp, show_set_temp); //convert from byte to string LCD_Out(2, 10,show_set_temp); Lcd_Chr_Cp(223); Lcd_Chr_Cp('C'); } void ShowTEMP() { //Show read temperature temp=temp/100; FloatToStr(temp, read_temp); //convert from float to string LCD_Out(1, 11,read_temp); Lcd_Chr_Cp(223); //simbol for degrees Lcd_Chr_Cp('C'); } void main() { //Init harware port selection hw_init(); LCD_start(); while(1) { ReadADC(); ShowTEMP(); delay_ms(200); } } Editat Noiembrie 3, 2017 de catalin004 Link spre comentariu
Bandi Szasz Postat Noiembrie 3, 2017 Partajează Postat Noiembrie 3, 2017 (editat) Este o problema des intalnita, problema este in "FloatToStr". Eu consider ca pentru o simpla afisare de numere pe LCD acea functie ocupa un spatiu urias, eu am facut functii proprii pt convertire. Nu am acuma acces la codul sursa dar daca nu gresec e ceva de genul urmator. Daca nu merge o sa ma uit peste codul sursa in seara asta. char *strTemp[] = "00.0C" ; void tempToStr(float temp, char *buffer) { int value = temp*10; buffer[3] = value % 10; buffer[1] = value/10 % 10; buffer[0] = value/100 % 10; } tempToStr(temp, &strTemp); LCD_Out(1, 11, strTemp); Editat Noiembrie 3, 2017 de Bandi Szasz Link spre comentariu
catalin004 Postat Noiembrie 3, 2017 Autor Partajează Postat Noiembrie 3, 2017 ok....si cum fac apelarea in main? Ok...am rezolvat...doar ca ar trebui comanda BytetoStr sau FloattoStr....in loc de temptoStr, pe care compilatorul nu o recunoaste Link spre comentariu
catalin004 Postat Noiembrie 7, 2017 Autor Partajează Postat Noiembrie 7, 2017 Alte idei de afisare?vad ca nu a mai zis nimeni nimic.... Link spre comentariu
mars01 Postat Noiembrie 7, 2017 Partajează Postat Noiembrie 7, 2017 (editat) Pentru ca desi solutia oferita de Bandi Szasz are o mica greseala, este cea mai buna solutie pentru tine de afisare. In loc de: char *strTemp[] = "00.0C" ; void tempToStr(float temp, char *buffer) { int value = temp*10; buffer[3] = value % 10; buffer[1] = value/10 % 10; buffer[0] = value/100 % 10; } tempToStr(temp, &strTemp); LCD_Out(1, 11, strTemp); ar trebui sa fie ori asa: char *strTemp = "00.0C" ; void tempToStr(float temp, char *buffer) { int value = (int)temp*10; buffer[3] = value % 10; buffer[1] = value/10 % 10; buffer[0] = value/100 % 10; } tempToStr(temp, &strTemp); LCD_Out(1, 11, strTemp); ori asa: char strTemp[] = "00.0C" ; void tempToStr(float temp, char *buffer) { int value = (int)temp*10; buffer[3] = value % 10; buffer[1] = value/10 % 10; buffer[0] = value/100 % 10; } Sa zicem ca alegem prima varianta. In program, la inceput declari functia scriind prototipul sau asa: void tempToStr(float, char*); Dupa acea ii definesti corpul cat si un string care sa contina datele tale, sub forma aleasa: char *strTemp = "00.0C" ; void tempToStr(float temp, char *buffer) { int value = (int)temp*10; buffer[3] = value % 10; buffer[1] = value/10 % 10; buffer[0] = value/100 % 10; } Iar la final, in functia main(), unde este cazul, folosesti functia in genul cum a exemplificat colegul: tempToStr(temp, strTemp); // conversie a unui nr tip FLOAT intr-un STRING LCD_Out(1, 11, strTemp); // afisarea string-ului Editat Noiembrie 7, 2017 de mars01 1 Link spre comentariu
catalin004 Postat Noiembrie 8, 2017 Autor Partajează Postat Noiembrie 8, 2017 Ca off topyc: Cu ce bagati spatierile la acolade atunci cand aveti if? sau for? ca TAB-ul mi le pune cam aiurea Link spre comentariu
Bandi Szasz Postat Noiembrie 8, 2017 Partajează Postat Noiembrie 8, 2017 (editat) Da este o problema destul de veche si enervanta cu tab. Eu selectez cel putin doua linii de cod si dupa dau TAB, in felul asta o sa puna 2 space-uri, e mai nasol daca acoladele contin doar o singura linie, in cazul acesta dau cu space-ul. Editat Noiembrie 8, 2017 de Bandi Szasz Link spre comentariu
catalin004 Postat Noiembrie 8, 2017 Autor Partajează Postat Noiembrie 8, 2017 (editat) pai de-asta m-a certat mars...si nu vreau sa ma posetz greseli mici......dintr-alea mai mari Editat Noiembrie 8, 2017 de catalin004 Link spre comentariu
catalin004 Postat Noiembrie 10, 2017 Autor Partajează Postat Noiembrie 10, 2017 (editat) Am facut cum ati zis si nu imi afiseaza nimic pe display.... #include "LCD_config.h" float temp; int tmp; void get_ADC(){ tmp = ADC_Read (0); temp = (tmp*5000)>>10; temp = temp/10000; } void tempToStr(float, char*); char *strTemp = "00.0" ; void tempToStr(float temp, char *buffer) { int value = (int)temp*10; buffer[3] = value % 10; buffer[1] = value/10 % 10; buffer[0] = value/100 % 10; } void main(){ TRISA.F0 = 1; ADC_Init(); LCD_Init(); LCD_Cmd(_LCD_CURSOR_OFF); LCD_Cmd(_LCD_CLEAR); LCD_Out(2,1, "Nu merge nenea"); for(;;){ get_ADC(); tempToStr(temp, strTemp); // conversie a unui nr tip FLOAT intr-un STRING LCD_Out(1, 11, strTemp); // afisarea string-ului } } Editat Noiembrie 10, 2017 de catalin004 Link spre comentariu
catalin004 Postat Noiembrie 10, 2017 Autor Partajează Postat Noiembrie 10, 2017 (editat) Deci singurul mod in care afiseaza este schimbarea in expresia: tempToStr(temp, strTemp); // conversie a unui nr tip FLOAT intr-un STRING cu ByteToStr(temp, strTemp); // conversie a unui nr tip FLOAT intr-un STRING cauza nu o stiu asa ca rog ajutor Aici trebuia long: temp = ((long)tmp*5000)>>10; Editat Noiembrie 10, 2017 de catalin004 Link spre comentariu
Bandi Szasz Postat Noiembrie 10, 2017 Partajează Postat Noiembrie 10, 2017 (editat) Aveti functia definita de 2 ori, linia "void tempToStr(float, char*);" trebuie stearsa. Edit: cred ca acel calcul la ADC se poate rezolva mult mai usor, daca imi ziceti ce tip de sensor aveti va pot ajuta, eu la TMP36, LM35 am rezolvat calcularea cu o singura inmultire. #include "LCD_config.h" float temp; int tmp; void get_ADC(){ tmp = ADC_Read (0); temp = (tmp*5000)>>10; temp = temp/10000; } char *strTemp = "00.0" ; void tempToStr(float temp, char *buffer) { int value = (int)temp*10; buffer[3] = value % 10; buffer[1] = value/10 % 10; buffer[0] = value/100 % 10; } void main(){ TRISA.F0 = 1; ADC_Init(); LCD_Init(); LCD_Cmd(_LCD_CURSOR_OFF); LCD_Cmd(_LCD_CLEAR); LCD_Out(2,1, "Nu merge nenea"); for(;;){ get_ADC(); tempToStr(temp, &strTemp); // conversie a unui nr tip FLOAT intr-un STRING LCD_Out(1, 11, strTemp); // afisarea string-ului } } Editat Noiembrie 10, 2017 de Bandi Szasz Link spre comentariu
catalin004 Postat Noiembrie 10, 2017 Autor Partajează Postat Noiembrie 10, 2017 (editat) Am sters-o si face la fel....LM35 este senzorul Am facut cateva modificari....imi afiseaza temperatura, insa cu doar partile unitatilor si zecilor, insa fara zecimala....iar in fata imi apar niste hieroglife...Daca pun temp in loc de byte afiseaza numai hieroglife #include "LCD_config.h" float temp; int tmp; void get_ADC(){ tmp = ADC_Read(0); //Read ADC voltage temp = ((long)tmp*5000)>>10; // temp = temp/100; //Convert mV in Celsius } char *strTemp = "00.0" ; void tempToStr(float temp, char *buffer) { int value = (int)temp*1000; buffer[3] = value % 10; buffer[1] = value/10 % 10; buffer[0] = value/100 % 10; } void main(){ TRISA.F0 = 1; //ADC input to RA01 TRISA=0xFF; ADCON1=0x80; //ADC reference to 5V Vdd ADC_Init(); //ADC start LCD_Init(); //LCD Init LCD_Cmd(_LCD_CURSOR_OFF); LCD_Cmd(_LCD_CLEAR); LCD_Out(2,1, "Nu merge nenea"); for(;;){ get_ADC(); ByteToStr(temp, &strTemp); // conversie a unui nr tip FLOAT intr-un STRING LCD_Out(1, 8, strTemp); // afisarea string-ului } } Editat Noiembrie 10, 2017 de catalin004 Link spre comentariu
cristi7521 Postat Noiembrie 10, 2017 Partajează Postat Noiembrie 10, 2017 (editat) Cred ca stringul tau nu contine ASCII. Incearca sa adaugi 30hex la fiecare variabila buffer[3]..... Editat Noiembrie 10, 2017 de cristi7521 Link spre comentariu
catalin004 Postat Noiembrie 10, 2017 Autor Partajează Postat Noiembrie 10, 2017 (editat) adica +30 la fiecare...ok... ciudat este acea convertire: tempToStr(temp, &strTemp);...... Nu merge.. Editat Noiembrie 10, 2017 de catalin004 Link spre comentariu
Bandi Szasz Postat Noiembrie 10, 2017 Partajează Postat Noiembrie 10, 2017 (editat) Pentru a calcula simplu temperatua se masoara exact alimentarea de 5V ( de obicei LM7805 scoate in jur 4.98V) si se aplica furmula urmatoare: (VDD/1023)*100 valoare rezultata ( 0.488 pt VDD de 5V) se va folosii in felul uramtor: float temp = (float)ADC_Read(0) * valoarea_obtinuta Ex: float temp = (float)ADC_Read(0) * 0.488 Functia originala care este testata de mine si merge de 2 ani de zile, acuma am observat ca trebuie adaugat +48 (pentru ASCII) char* tempV = "00.0V"; void FloatToVolts(char*dataBuffer,float value) { int tempInt = (int)(value*10); dataBuffer[3] = tempInt%10+48; dataBuffer[1] = tempInt/10%10+48; dataBuffer[0] = tempInt/100%10+48; } void displayMainData() { FloatToVolts(tempV,sol_volts); LCD_Out(1,3,tempV); } Editat Noiembrie 10, 2017 de Bandi Szasz Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum