Sari la conținut
ELFORUM - Forumul electronistilor

Termostat - PIC16F877


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

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

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

Alătură-te conversației

Poți posta acum și să te înregistrezi mai târziu. Dacă ai un cont, autentifică-te acum pentru a posta cu contul tău.
Notă: Postarea ta va necesita aprobare moderator înainte de a fi vizibilă.

Vizitator
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Răspunde la acest subiect...

×   Alipit ca text avansat.   Restituie formatare

  Doar 75 emoji sunt permise.

×   Linkul tău a fost încorporat automat.   Afișează ca link în schimb

×   Conținutul tău precedent a fost resetat.   Curăță editor

×   Nu poți lipi imagini direct. Încarcă sau inserează imagini din URL.

×
×
  • 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