Ir ao conteúdo
  • Cadastre-se
Visitante

Circuito para controle de cooler

Posts recomendados

Visitante

Olá pessoal eu estou terminando meu projeto ja tive alguma ajuda aqui no CH, mais agora no final me surgiu um problema, eu presciso controlar a velocidade de um cooler baseado na temperatura de um LM35 utilizando um PIC16F877A, "Eu presciso do program Na linguagem C", por exemplo quando o LM35 medir 20°, ele liga o cooler em certa velocidade, e quanto mais a temperatura aumenta, maior seria a velocidade do cooler, eu acho que n deva ser muito complicado( a nao ser para mim). eu só presciso disso, qualquer dica é bem vinda por favor ajudem pessoal.

qualquer dica circuito programa o que vs souberem serve pessoal

Lembrem-se na Linguagem C pessoal desde ja agradeço

Abrass

Compartilhar este post


Link para o post
Compartilhar em outros sites

pra se aprender deve se pegar uma ideia e tenta la por em pratica amigo.Eu tentaria assim:Uma variavel q aumente conforme a temperatura do sensor ,essa variavel controlaria o duty cicle de um pwm q controlaria a ventoinha ,assim conforme aumenta a temperatura ,aumenta a velocidade,nao sei se tem logica ,mais os mais entendidos irão opinar .

Compartilhar este post


Link para o post
Compartilhar em outros sites

@jorgeletronico: você está correto!

@Marcãooo: Como o amigo disse logo acima, você precisa ler a saída do LM35 e armazená-la em uma variável.

Para começar, utilizae um PIC mais barato. O 12F675 tá de bom tamanho, é mais bararto e vai te servir muito bem! :D

Aí você cria uma tabela do tipo:

Temperatura (ºC)           Fan PWM 
35 0
36 30
37 30
38 30
39 40
40 50
41 60
42 70
43 80
44 90
45 100

você vai ler o canal analógico do PIC fazer uma conversão e jogar o valor direto para o duty cicle do PIC.

O LM35 te dá 10mV/ºC e sua temperatura máxima é de 150ºC, logo, você terá uma saída máxima de 1,5V.

Assim senso, o ADC do PIC por definição vem configurado para operar de 0-VddV, ou seja de 0V a 5V. Logo com essa saída de 1,5V do LM35 você não terá todos os valores do AD. você tem 2 opções:

1º) Fazer um amplificador q aumente seu sinal do LM35 para que fique em 0-5V.

2º) Configurar seu PIC para que ele faça a conversão do canal analógico de 0-Vref.

Eu prefiro a segunda opção. Esse Vref é uma referência q você poe no pino do PIC para que o ADC pare ali. Nesse caso você deve utilizar um Vref de 1,5V.

No entanto, o datasheet do dispositivo recomenda que para uma boa conversão a diferença entre Vref e ground seja de pelo menos 2V. Nesse caso está em 1,5V.

Não montei esse circuito na prática ainda. Mas parece q funciona sim.

Caso você for usar o 12f675, a configuração do ADC fica assim:

setup_adc_ports(sAN0|VSS_VREF);         //Configura canais analógico
setup_adc(ADC_CLOCK_INTERNAL); //De acordo com relógio interno.

Aí você vai ler o canal com:

set_adc_channel(0);           //Habilita canal0 analógico
delay_us(20);
variavel = read_adc();
set_pwm1_duty(variavel);

Nesse exemplo que dei, está direto. você lê o ADC e joga direto no PWM. Note que dessa forma, seu cooler só estará em 100% em 150º :D

Para você resolver isso, você precisa fazer umas continhas. Por exemplo:

/*===========================================================================
A resolução do conversor AD segue a seguinte equação:
1LSB=(Vref-)+{[(Vref+)-(Vref-)]/1024}
E nesse caso (Vref+)=1.5V e (Vref-)=0V então a resolução é:
1LSB=1,5/1024=1,46mV
Por exemplo, se a leitura no canal analógico for de 512, a tensão
analógica será:
Vin=512*(1,46/1024)=512*1,46mV=0.75V
===========================================================================*/

Ora, se o ADC acusar 512 e você tem 0,75V, você sabe q isso são 75ºC. Só basta agora você colocar uns if, por exemplo:

if (variavel > 300 )   //vendo se a variavel ADC é maior q 43ºC
{
set_pwm1_duty(512); //coloca o pwm em 512, ou seja, 50%.
}

if (variavel > 512 ) //vendo se a variavel ADC é maior q 75ºC
{
set_pwm1_duty(1024); //coloca o pwm em 1024, ou seja, 100%
}

Veja se você consegue compreender aí.

qualquer duvida, só postar.

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  •    0
    Visitante

    obrigado matheus

    vou tentar compeender paresce meio difícil srs

    mais acontesce que eu tenho que utilizar um PIC16F877A por outras funçoes que eu tenho no programa, sera que você poderia me da algumas dicas??

    desde ja agradesço

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Se for usar o 16f877a, o esquema é o mesmo. Pra você etr uma ideia, tenho um programa aqui q lê 4 sensores de temperatura LM35.


    #device adc=10 //Habilitar ADC de 10 bits, obrigatório. Pode
    //ser utilizado de 8 bits também.
    #FUSES NOWDT //Sem Watch dog, evitando reset
    #FUSES XT //Crystal de oscilação igual a 4mhz
    #FUSES PUT //Tempo de início do PIC
    #FUSES NOPROTECT //Codigo sem proteção de leitura, software livre!
    #FUSES NODEBUG //No Debug mode for ICD
    #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOCPD //No EE protection

    #use delay(clock=4000000) //Meu clock
    #include <LCD.C> //Rotina de LCD modo 4 vias. Obrigatório!

    void lcd_scroll_right(void)
    {
    lcd_send_byte(0, 0x1E);
    }

    void main() {

    int16 q,i; //Vaeriável inteira de 16 bits: 0 a 65535
    float temp1,temp2,temp3,temp4; //Variável com vírgula, para poder fazer cáclulos.


    setup_adc_ports(AN0_AN1_AN2_AN4_AN5_VSS_VREF); //Configura canais analógico
    setup_adc(ADC_CLOCK_INTERNAL); //De acordo com relógio interno.

    lcd_init(); //Inicia LCD, obrigatório!

    for (;;) //Para sempre.
    {
    /*===========================================================================
    A resolução do conversor AD segue a seguinte equação:
    1LSB=(Vref-)+{[(Vref+)-(Vref-)]/1024}
    E nesse caso (Vref+)=1.5V e (Vref-)=0V então a resolução é:
    1LSB=1,5/1024=1,46mV
    Por exemplo, se a leitura no canal analógico for de 512, a tensão
    analógica será:
    Vin=512*(1,46/1024)=512*1,46mV=0.75gV
    ===========================================================================*/

    set_adc_channel(0); //Habilita canal 0
    delay_us(20); //Espera um pouco, obrigatório!
    q=read_adc(); //Lê canal 0
    temp1=((1.5/1024)*q)*100; //Conversão para tensão e temperatura.

    set_adc_channel(1); //Habilita canal 1
    delay_us(20); //Espera um pouco, obrigatório!
    q=read_adc(); //Lê canal 1
    temp2=((1.5/1024)*q)*100; //Conversão para tensão e temperatura.

    set_adc_channel(4); //Habilita canal 4
    delay_us(20); //Espera um pouco, obrigatório!
    q=read_adc(); //Lê canal 4
    temp3=((1.5/1024)*q)*100; //Conversão para tensão e temperatura.

    set_adc_channel(5); //Habilita canal 5
    delay_us(20); //Espera um pouco, obrigatório!
    q=read_adc(); //Lê canal 5
    temp4=((1.5/1024)*q)*100; //Conversão para tensão e temperatura.

    printf(lcd_putc, "\fTemperaturas em Celsius");//Título.
    printf(lcd_putc, "\nTemp1=%1.0f Temp2=%1.0f Temp3=%1.0f Temp4=%1.0f", temp1,temp2,temp3,temp4);//Mostre a temperatura.

    delay_ms(2000);

    for(i = 0; i < 22 ; i++) //Faz o efeiro de scroll no LCD
    {
    lcd_scroll_right();
    delay_ms(200); // scroll delay
    }

    delay_ms(2000);
    }
    }
    #include <16F877A.h>             //O PIC utilizado, obigatório!

    75% do caminha tá andado com o código acima. Só falta você colocar os if para ativar o seu pwm quando precisar.

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  •    0
    Visitante

    Ok amigo mais eu gostaria de saber porque no display a temperatura chega só até 25, porque eu presciso que ele leia a temperaturas um pouco maiores também?

    e sempre tem 0,6 °C +/- de diferença no display?

    mais desde ja muito obrigado pela ajuda esta ajudando muito

    agradesço

    abrass

    o que seria efeito scroll no LCD?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Ok amigo mais eu gostaria de saber porque no display a temperatura chega só até 25, porque eu presciso que ele leia a temperaturas um pouco maiores também?

    e sempre tem 0,6 °C +/- de diferença no display?

    mais desde ja muito obrigado pela ajuda esta ajudando muito

    agradesço

    abrass

    Ahhh tá, esqueci de postar o esquemático. Provavelmente você esqueceu de colocar o Vref de 1,5V no pino do PIC, por isso não está passaando de 25ºC.

    semttulolwm.jpg

    Não entendi esse diferença de 0,6ºC... você diz q ele fica oscilando?

    você está simulando ou está montando o circuito real?

    Scroll LCD é uma função q faz com o texto deslize no LCD. Esse display tem 16 posições e as vezes você precisa escrever mais... aí você usa esse método.

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  •    0
    Visitante

    Ah sim agora entendi muito obrigado nobre amigo

    eu disse que varia por exemplo

    a temperatura esta em 15.0°C

    n display aparesce 15.6°C

    é normal isso?

    abrass

    matheus montei esse programinha que você me mandou certinho

    do jeito que ta ae funcionou

    mais acontesce que a temperatura fica sempre 8°C

    em todos

    o que eu fiz errado?

    abrass

    a sim ja descobri era pelo falo de eu n ter jogado 1.5 v

    valeu

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Conforme solicitado, estamos reabrindo este tópico!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Então marcãoo. Vi o código q você me enviou ontem. Ele está marcando 15,6ºC ao invés de 15ºC por causa da conversao q você fez.

    você utilizou 2 fórmulas no programa... Só precisa de 1 :D

    Faça temp=((1.5/1024)*q)*100;

    Tenta aí.

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  •    0
    Visitante

    Olá pessoal, eu estou fazendo um programa aqui, porém eu queria controlar a velocidade de um cooler usando o pino" PIN_B0 " do microcontrolador PIC16F87A, Meu professor nao me ensinou mais ele me disse que eu devo ativar um pwm, mais eu n sei como fazer isso:X

    sera que vocês poderiam me ajudar?

    ta ai o programa ele funciona certin eu só quero ativar o pwm, mais n sei como faço:S

    #include <16F877A.h>             //O PIC utilizado, obigatório!
    #device adc=10 //Habilitar ADC de 10 bits, obrigatório. Pode
    //ser utilizado de 8 bits também.
    #FUSES NOWDT //Sem Watch dog, evitando reset
    #FUSES XT //Crystal de oscilação igual a 4mhz
    #FUSES PUT //Tempo de início do PIC
    #FUSES NOPROTECT //Codigo sem proteção de leitura, software livre!
    #FUSES NODEBUG //No Debug mode for ICD
    #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOCPD //No EE protection

    #use delay(clock=4000000) //Meu clock
    #include <LCD.C> //Rotina de LCD modo 4 vias. Obrigatório!






    void main() {

    int16 q; //Vaeriável inteira de 16 bits: 0 a 65535
    float p, temp,temp2; //Variável com vírgula, para poder fazer cáclulos.


    setup_adc_ports(AN0_AN1_VSS_VREF); //Configura canal 0 analógico
    setup_adc(ADC_CLOCK_INTERNAL); //De acordo com relógio interno.

    lcd_init(); //Inicia LCD, obrigatório!

    for (; //Para sempre.
    {
    /*===========================================================================
    A resolução do conversor AD segue a seguinte equação:
    1LSB=(Vref-)+{[(Vref+)-(Vref-)]/1024}
    E nesse caso (Vref+)=Vdd e (Vref-)=Vss então a resolução é:
    1LSB=5/1024=4,8mV
    Por exemplo, se a leitura no canal analógico for de 512, a tensão
    analógica será:
    Vin=512*(5/1024)=512*4,8mV=2,4576V
    ===========================================================================*/

    set_adc_channel(0); //Habilita canal 0
    delay_us(20); //Espera um pouco, obrigatório!
    q = read_adc(); //Lê canal 0
    p = 5.0 * q / 1024.0; //Conversão para tensão.
    temp=(p*100)/3.413; //Temperatura convertida de acordo com o
    //amplificador utilizado.
    set_adc_channel(1);
    delay_us(20);
    q = read_adc(); //Lê canal 0
    p = 5.0 * q / 1024.0; //Conversão para tensão.
    temp2=(p*100)/3.413; //Temperatura convertida de acordo com o
    //amplificador utilizado.
    if(temp2>=19)
    output_bit(PIN_B0,1);
    else
    output_bit(PIN_B0,0);


    printf(lcd_putc, " Bebedouro P&D");
    printf(lcd_putc, " \n TEMP AGUA=%01.1fC ", temp );//Mostre a temperatura


    delay_ms(50);

    }
    }

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Ativar o pwm em C é mole, primeiro você deve configurar o módulo PWM q no caso é o CCP1. Depois você configura um timer para fazer a frequência do PWM. Eu uso o timer2. Aí você chama as 2 rotinas logo depois do inicio do programa, depois do "void main() {"

    Fica assim:

    setup_ccp1(ccp_pwm);
    setup_timer_2(T2_DIV_BY_16,248, 1);

    Aí depois q você configurar você seta o pwm com o seguinte comando:

    set_pwm1_duty(valorPWM);

    O calor pwm varia entre 0 e 1024.

    aí seu código modificado seria mais ou menos assim:


    #device adc=10 //Habilitar ADC de 10 bits, obrigatório. Pode
    //ser utilizado de 8 bits também.
    #FUSES NOWDT //Sem Watch dog, evitando reset
    #FUSES XT //Crystal de oscilação igual a 4mhz
    #FUSES PUT //Tempo de início do PIC
    #FUSES NOPROTECT //Codigo sem proteção de leitura, software livre!
    #FUSES NODEBUG //No Debug mode for ICD
    #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOCPD //No EE protection

    #use delay(clock=4000000) //Meu clock
    #include <LCD.C> //Rotina de LCD modo 4 vias. Obrigatório!






    void main() {

    int16 q; //Vaeriável inteira de 16 bits: 0 a 65535
    float p, temp,temp2; //Variável com vírgula, para poder fazer cáclulos.

    setup_ccp1(ccp_pwm);
    setup_timer_2(T2_DIV_BY_16,248, 1);
    setup_adc_ports(AN0_AN1_VSS_VREF); //Configura canal 0 analógico
    setup_adc(ADC_CLOCK_INTERNAL); //De acordo com relógio interno.

    lcd_init(); //Inicia LCD, obrigatório!

    for (;;) //Para sempre.
    {
    /*===========================================================================
    A resolução do conversor AD segue a seguinte equação:
    1LSB=(Vref-)+{[(Vref+)-(Vref-)]/1024}
    E nesse caso (Vref+)=Vdd e (Vref-)=Vss então a resolução é:
    1LSB=5/1024=4,8mV
    Por exemplo, se a leitura no canal analógico for de 512, a tensão
    analógica será:
    Vin=512*(5/1024)=512*4,8mV=2,4576V
    ===========================================================================*/

    set_adc_channel(0); //Habilita canal 0
    delay_us(20); //Espera um pouco, obrigatório!
    q = read_adc(); //Lê canal 0
    p = 5.0 * q / 1024.0; //Conversão para tensão.
    temp=(p*100)/3.413; //Temperatura convertida de acordo com o
    //amplificador utilizado.
    set_adc_channel(1);
    delay_us(20);
    q = read_adc(); //Lê canal 0
    p = 5.0 * q / 1024.0; //Conversão para tensão.
    temp2=(p*100)/3.413; //Temperatura convertida de acordo com o
    //amplificador utilizado.
    if(temp2>=19)
    output_bit(PIN_B0,1);
    else
    output_bit(PIN_B0,0);

    set_pwm1_duty(valorPWM);


    printf(lcd_putc, " Bebedouro P&D");
    printf(lcd_putc, " \n TEMP AGUA=%01.1fC ", temp );//Mostre a temperatura


    delay_ms(50);

    }
    }
    #include <16F877A.h>             //O PIC utilizado, obigatório!

    Aí se você quiser mudar o pwm. você pode colocar uns if...

    tenta aí..

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  •    0
    Visitante

    ae pessoal eu gostaria de saber como eu faço pra ativar um pwm na linguagem em C do PIC16F877A e como faço para controlar, o problema é que eu n consigo controlar ele, nao entendo quase nada sobre PWM, eu quero ativar ele para fazer o controle de RPM de um cooler

    eu presciso saber pelo menos a formula em C!!

    desde ja agradesço abraas

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    o marcaaaao... o jeito d controlar o cooler eu disse um post acima do seu.

    Lembra q a um tempo atras você me perguntou como acender um led quqndo a temperatura for igual a 20ºC? Lembra q você fez assim:

    if (temp2>19)
    {
    output_high(PIN_C0);
    }

    Agora você faz a mesma coisa com o PWM do cooler. O raciocínio é o mesmo. Exemplo:

    if (temp2>19)
    {
    set_pwm1_duty(512);
    }

    Dessa forma você poe a velocidade do cooler em 50%.

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    // LCD module connections


    sbit LCD_EN at RB5_bit;
    sbit LCD_D4 at RB0_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D6 at RB2_bit;
    sbit LCD_D7 at RB3_bit;

    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;
    // End LCD module connections
    sbit Gate_Enable at RC1_bit;
    unsigned long RPM_Value;
    char message3[] = "tensão=";
    char message4[] = "Corrente=";
    char message5[] = "Freq= Hz";
    unsigned int ADC_Value, DisplayVolt, DisplayCurr, AdjustVolt;
    char *volt = "00.0";
    char *amp = "0.000";
    //unsigned int Num;
    char *freq = "00000.00";
    long counter, Num, lowfreq;
    unsigned short CountDone, upscale, prescaler;

    void Display_Freq(long freq2write) {

    freq[0] = (freq2write/10000000) + 48; // Extract tens digit
    freq[1] = (freq2write/1000000)%10 + 48; // Extract ones digit
    freq[2] = (freq2write/100000)%10 + 48;
    freq[3] = (freq2write/10000)%10 + 48;
    freq[4] = (freq2write/1000)%10 + 48;
    freq[6] = (freq2write/100)%10 + 48;
    freq[7] = (freq2write/10)%10 + 48;
    // Display Frequency on LCD
    Lcd_Out(2, 6, freq);
    }

    long count_pulse(){
    long ff = 0;
    Gate_Enable = 0;
    CountDone = 0;
    Num = 0;
    TMR1L = 0xDC; //TMR1 start time = 3036 for 100 ms
    TMR1H = 0x0B;
    TMR0 = 0;
    T1CON.TMR1ON = 1;
    do {

    }while(!CountDone);
    Gate_Enable = 1;
    T1CON.TMR1ON = 0; // Disable Timer1
    ff = 256*Num + TMR0;
    ff = ff*10*prescaler;
    return ff;

    }

    // Interrupt service routine
    void interrupt() {
    if(INTCON.T0IF){
    Num ++; // Interrupt causes Num to be incremented by 1
    INTCON.T0IF = 0; // Bit T0IF is cleared so that the interrupt could reoccur
    }
    if (PIR1.TMR1IF){ //Let me use this even if no other interrupts are enabled
    CountDone = 1;
    PIR1.TMR1IF = 0; //reset timer1 flag
    }
    }
    sbit LCD_RS at RB4_bit;

    ////ALTERACAO


    long leitura_ad = 0, aux = 0;
    char texto[5] = "00.0";
    char valor[5] = "00.0";
    long setpoint;
    char teste = 1;
    unsigned int select, update_select;

    void debounce_delay(void){
    Delay_ms(333);
    }

    void atualiza_lcd(){ // funçao atualiza lcd
    Lcd_Init();

    delay_ms(20);
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Cmd(_LCD_CURSOR_OFF);


    }

    void escreve_eeprom() {
    EEPROM_Write (0,setpoint);
    EEPROM_Write (1,setpoint>>8); // quebra var.teste de 16bit em dois de 8

    delay_ms(40);
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Cmd(_LCD_CURSOR_OFF);
    Lcd_out(1,4, "SUCESSSO");
    Lcd_out(2,1, "AJUSTE GRAVADO");
    delay_ms(800);
    atualiza_lcd();

    }
    // Define Messages


    void main() {
    trisa.ra0 = 1;
    trisa.ra1= 1; //configrada como entrada
    trisa.ra2= 1; //configrada como entrada
    ADCON1 = 0x82; // configure VDD as Vref, and analog channels

    INTCON = 0;
    PORTC = 0;
    TRISB = 3; //'configura todos os pinos do portd como saída
    TRISD = 3; //'configura todos os pinos do portd como saída
    TRISE = 0; //'configura todos os pinos do porte como saída
    TRISC = 0; //'configura todos os pinos do portd como saída

    //'configura AN0,AN1,AN3 COMO analógico e os demais pinos como digital
    Gate_Enable = 1;
    // TMR1 settings
    T1CON.TMR1CS = 0; // Fosc / 4
    T1CON.T1CKPS1 = 1; // Setting prescale value to 1:8
    T1CON.T1CKPS0 = 1;
    PIE1.TMR1IE = 1;
    INTCON.PEIE = 1;
    INTCON.T0IE = 1;
    INTCON.GIE = 1;
    Lcd_Init();

    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Cmd(_LCD_CURSOR_OFF);

    Lcd_Out(1,13, texto);
    Lcd_Out(2,13, valor);
    atualiza_lcd();

    setpoint = eeprom_Read(1);setpoint<<=8;
    setpoint |= eeprom_Read(0);

    select = 0;
    update_select = 1;

    do {
    if(!SelectButton){
    debounce_delay();
    update_select = 1;
    switch (select) {
    case 0 : select=1;
    break;
    case 1 : select=2;
    break;
    case 2: select=3;
    break;
    case 3: select=4;
    break;
    case 4: select=0;
    break;
    } //case end
    }
    if(select == 0){ // Diode Tester
    if(update_select){
    Lcd_cmd(_LCD_CLEAR);


    update_select=0;
    }
    ////////////////////********/////
    leitura_ad = adc_read(0);
    aux = leitura_ad;

    leitura_ad = leitura_ad*5000/1023;
    texto[0] = (leitura_AD%1000)/100 + 48;
    texto[1] = (((leitura_AD%1000)%100)/10) + 48;
    texto[2] = '.';
    texto[3] = (((leitura_AD%1000)%100)%10) + 48;
    Lcd_Out(1,13, texto);

    if (Button(&PORTD, 0, 20 ,0)){ //verifica tecla1.
    setpoint++;
    }

    if (Button(&PORTD, 1, 20, 0)){ //verifica se a tecla2.
    setpoint--;
    }
    if (PORTd.Rd5 == 0){ //se portb.rb0 estiver em nivel baixo chama funçao
    escreve_eeprom(); //chama a funçao escreve na eeprom
    }
    if (PORTd.Rd4 == 0 && teste ==1 ){
    portc.rc7 = ~portc.rc7;
    teste = 0; }
    delay_ms(20);
    if (PORTd.rd4 == 1 && teste == 0 ){
    teste = 1;
    delay_ms(20);
    }
    if(portc.rc7==1){
    Lcd_out(2,10, "TL");
    } else Lcd_out(2,10, "TD");

    valor[0] = (setpoint%100)/10 + 48;
    valor[1] = ((setpoint%100)%10) + 48;
    valor[2] = '.';
    valor[3] = '0';
    Lcd_out(2,13, valor);
    Lcd_Out(1,1,"TEMPERATURA");
    Lcd_Out(2,1,"AJUSTE");
    if (aux/2 <= setpoint){
    portc.rc0 = 0;
    }
    else portc.rc0 = 1;
    }//FIM DO MENU 0
    if(select == 1){ // Diode Tester
    if(update_select){

    Lcd_cmd(_LCD_CLEAR);
    Lcd_Out(1,1,"VOLTIMETRO");

    update_select=0;
    }
    // Read Voltage

    ADC_Value = ADC_Read(1);
    DisplayVolt = ADC_Value * 2;
    AdjustVolt = DisplayCurr/1000;
    AdjustVolt = 29*AdjustVolt ; // 29 corresponds to 0.286 Ohm
    DisplayVolt = DisplayVolt - AdjustVolt;
    volt[0] = DisplayVolt/1000 + 48;
    volt[1] = (DisplayVolt/100)%10 + 48;
    volt[3] = (DisplayVolt/10)%10 + 48;
    Lcd_Out(2,9,volt);
    Lcd_Out(2,1,Message3);
    Lcd_Chr(2,13,'V');
    ///AQUI VAI OS TEXTO

    } // End if (detail_select)

    if(select == 2){ // Diode Tester
    if(update_select){
    Lcd_cmd(_LCD_CLEAR);
    Lcd_Out(1,1,"AMPERIMETRO");

    update_select=0;
    }
    // Read Current
    ADC_Value = ADC_Read(2);
    DisplayCurr = ADC_Value * 17;
    amp[0] = DisplayCurr/10000 + 48;
    amp[2] = (DisplayCurr/1000)%10 + 48;
    amp[3] = (DisplayCurr/100)%10 + 48;
    amp[4] = (DisplayCurr/10)%10 + 48;
    Lcd_Out(2,10,amp);
    Lcd_Chr(2,15,'A');

    ///AQUI VAI OS TEXTO
    } // End if (detail_select)
    if(select == 3){ // Diode Tester
    if(update_select){
    Lcd_cmd(_LCD_CLEAR);
    Lcd_Out(1,1,"FREQUENCIMETRO");

    update_select=0;
    }
    // Calculate Frequency
    // First begin with prescaler 1:64
    OPTION_REG = 0b00110101; // Prescaler (1:64), TOCS =1
    prescaler = 64;

    Counter = count_pulse();

    if (Counter > 99990) {
    Display_Freq(Counter);
    Lcd_Chr(2,14,'K');
    //lowfreq = Counter*1000;
    //Lcd_Out(2,1,message5);
    //Display_Freq(lowfreq);
    }
    if (Counter <= 99990) {
    OPTION_REG = 0b00111000; // Prescaler (1:1), TOCS =1
    prescaler = 1;
    Counter = count_pulse();
    Counter = 1000*Counter;
    Display_Freq(Counter);
    Lcd_Chr(2,14,'H');
    Lcd_Chr(2,15,'z');
    }
    Delay_ms(3);
    // Ends Frequency display
    ///AQUI VAI OS TEXTO
    } ///FIM DO MENU
    if(select == 4){ // Diode Tester
    if(update_select){
    Lcd_cmd(_LCD_CLEAR);
    Lcd_Out(1,1,"CONTA GIRO");

    update_select=0;
    }


    ///AQUI VAI OS TEXTO
    } ///FIM DO MENU
    //iluminacao no lcd liga e desliga
    if (PORTd.Rd4 == 0 && teste ==1 ){
    portc.rc7 = ~portc.rc7;
    teste = 0; }
    delay_ms(20);
    if (PORTd.rd4 == 1 && teste == 0 ){
    teste = 1;
    delay_ms(20);
    }
    if(portc.rc7==1){
    ;
    } else ;


    } while(1);
    }
    sbit SelectButton at Rd7_bit;

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário

    Criar uma conta

    Crie uma nova conta em nossa comunidade. É fácil!

    Crie uma nova conta

    Entrar

    Já tem uma conta? Faça o login.

    Entrar agora





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×
    ×
    • Criar novo...

    GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

    Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

    Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

    Inscreva-se agora!