Sari la conținut
ELFORUM - Forumul electronistilor

Termostat - PIC16F877


catalin004

Postări Recomandate

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 de catalin004
Link spre comentariu

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 de Bandi Szasz
Link spre comentariu

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

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 de mars01
Link spre comentariu

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 de Bandi Szasz
Link spre comentariu

Am facut cum ati zis si nu imi afiseaza nimic pe display.... :tryre

#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 de catalin004
Link spre comentariu

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 de catalin004
Link spre comentariu

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 de Bandi Szasz
Link spre comentariu

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 de catalin004
Link spre comentariu

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 de Bandi Szasz
Link spre comentariu

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări