Ir ao conteúdo

aphawk

Membro Pleno
  • Posts

    8.316
  • Cadastrado em

  • Última visita

Tudo que aphawk postou

  1. Pessoal, Segue o programa que fiz para utilizar o BMP085 . É um programa que permite o uso bem sofisticado dos 3 sensores envolvidos, e mostra 4 informações diferentes. Já está compensado para a altura média na cidade de São Paulo, mostrando a pressão relativa ao nível do mar para facilitar a interpretação da variação de pressão. Segue o esquema do circuito : Segue o programa : ' ---------------------------------------------------------------- ' ESTAÇÃO METEOROLÓGICA COMPENSADA ' ' Permite obter a Temperatura Real, a Umidade Real, ' a Temperatura do Ponto de Orvalho Real, e finalmente ' obtém a Pressão Real Relativa ao Nível do Mar. ' Para a medida de pressão, levewi em conta a elevação em minha ' residência, que é de 746 metros acima do nível do mar. ' ' E estou usando para monitorar as minhas pescas !!! ' ' Embora não fosse necessário utilizar o DS18B20, pois o DHT11 faz ' as medidas de Umidade e Temperatura, acabei utilizando para ' demonstrar o poder do Bascom, ao utilizar 3 interfaces diferentes ' ao mesmo tempo. E a segunda razão é que o sensor DHT11 não é preciso ' nas leituras de temperatura, tendo uma variação muito maior do que o ' DS18B20. Mesmo assim, poderia utilizar a temperatura do sensor ' BMP085, que mede tanto a pressão como a temperatura com uma boa ' precisão. Mas ..... pelo bem da didática, usei os 3 sensores ! ' ' Este programa é um apanhado dos programas anteriores do Tutorial ' sobre o uso do DS1820 e DHT11 ( este está aqui no tópico mesmo ) ' e usei boa parte do código feito por um usuário do Fórum do BASCOM ' para tratar o BMP085, mas o código dele contém um erro, e eu já ' corrigí aqui nesta versão. ' Como uma boa dica , ilustro o uso do I2C sem os resistores de ' PULL-UP internos , assim posso utilizar dois resistores de ' PULL-UP externos, mas ligados à alimentação do sensor BMP085 ' que é de aproximadamente 3.3 Volts, assim elimino qualquer ' tipo de circuito conversor de nível de tensão entre 5V e 3.3V . ' Vale lembrar que este truque só funciona para velocidades baixas ' de I2C, abaixo de 200 Khz, que é o padrão do BASCOM. ' Lembrando que o BASCOM pode mudar a velocidade do I2C, indo desde ' os famosos 10Khz para até 500 Khz sem dificuldade. ' ---------------------------------------------------------------- $regfile = "m88Pdef.dat" $crystal = 8000000 $hwstack = 40 $swstack = 16 $framesize = 32 Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2 Config Lcd = 16 * 2 Config 1wire = Portc.0 ' DS18B20 on pin 12 Config Sda = Portc.4 ' BMP 085 Sensor de pressão I2C Config Scl = Portc.5 Declare Sub Read1820 Declare Sub Temperature Declare Sub Orvalho Declare Sub Get_th(t As Byte , H As Byte) 'vamos ligar o sensor DHT-11 no pino PORTC.2 Dht_put Alias Portc.2 ' aqui usamos como saída Dht_get Alias Pinc.2 ' e aqui usamos como entrada ! Dht_io_set Alias Ddrc.2 ' aqui mudamos entrada < - > saída Portc.4 = 0 ' Truque para desabilitar o Pull-Up interno Portc.5 = 0 ' Assim não precisamos converter de 3.3 para 5V Dim Tdht As Byte 'Temperatura Dim Hdht As Byte 'Umidade Dim Crc As Byte 'CRC do medidor Dim Mybyte As Byte Dim Sensor_data As String * 40 'buffer para os 5 bytes Dim Tmp_str8 As String * 8 'string temporária para receber 8 bits Dim Count As Byte 'contador para os bits recebidos Dim Bd(9) As Byte Dim I As Byte , Tmp As Byte Dim Tempc As Single , T1 As Single Const Bmp085_read = &HEF 'BMP085 Read Address Const Bmp085_write = &HEE 'BMP085 Write Address '---BMP085 Variables------------------------------------------------------------ Dim I2c_send_buf(5) As Byte Dim I2c_receive_buf(5) As Byte 'Calibration data variables 'Overlay used for easy access Dim Calibration_data(22) As Byte Dim Ac1 As Integer At Calibration_data(1) Overlay Dim Ac2 As Integer At Calibration_data(1) + 2 Overlay Dim Ac3 As Integer At Calibration_data(1) + 4 Overlay Dim Ac4 As Word At Calibration_data(1) + 6 Overlay Dim Ac5 As Word At Calibration_data(1) + 8 Overlay Dim Ac6 As Word At Calibration_data(1) + 10 Overlay Dim B1 As Integer At Calibration_data(1) + 12 Overlay Dim B2 As Integer At Calibration_data(1) + 14 Overlay Dim Mb As Integer At Calibration_data(1) + 16 Overlay Dim Mc As Integer At Calibration_data(1) + 18 Overlay Dim Md As Integer At Calibration_data(1) + 20 Overlay ' -------------------------------------------- ' | | | Temp_high | Temp_low | Type: LONG ' -------------------------------------------- Dim U_temperatur As Long Dim U_temp_low As Byte At U_temperatur Overlay Dim U_temp_high As Byte At U_temperatur + 1 Overlay Dim X1 As Long ' variáveis auxiliares para cáculos BMP085 Dim X21 As Long Dim X22 As Long Dim X2 As Long Dim B5 As Long Dim T As Long Dim Temperatur As String * 6 ' --------------------------------------------------------------------- ' | | U_pressure_high | U_pressure_mid | U_pressure_low | Type: LONG ' --------------------------------------------------------------------- Dim U_pressure As Long Dim U_pressure_low As Byte At U_pressure Overlay Dim U_pressure_mid As Byte At U_pressure + 1 Overlay Dim U_pressure_high As Byte At U_pressure + 2 Overlay Dim B6 As Long 'mais variáveis auxiliares BMP085 Dim X3 As Long Dim B3 As Long Dim Oss As Word ' will be set in Sub Bmp085_initiate_measurement(byval Measurement_type As Byte) Dim B4 As Dword ' mais variáveis auxiliares BMP085 Dim B7 As Dword Dim P As Long Dim Pcomp As Single Dim Pvarx As Single Dim Pressure As String * 6 Dim Ph As Long 'absolute altitude 'Dim Altitude_var1 As Single 'Dim Altitude As Single 'Dim P_single As Single 'Const Pressure_at_see_level = 101325 ' Pa Dim X As Byte Dim Idw As Dword '-----BMP085 SUB's-------------------------------------------------------------- Declare Sub Bmp085_read_calibration_data() Declare Sub Bmp085_initiate_measurement(byval Measurement_type As Byte) 'Measurement_type = 1 --> Temparature Measurement 'Measurement_type = 2 --> Ultra Low Power Pressure Measurement (OSS = 0) 'Measurement_type = 3 --> Standard Pressure Measurement (OSS = 1) 'Measurement_type = 4 --> High Resolution Pressure Measurement (OSS = 2) 'Measurement_type = 5 --> Ultra High Resolution Pressure Measurement (OSS = 3) Declare Sub Bmp085_read_u_temp() 'Read uncompensated Temp Value Declare Sub Bmp085_read_u_press() 'Read uncompensated Pressure Value Declare Sub Bmp085_calc_temp() 'Calculate Temperature Declare Sub Bmp085_calc_pressure() Declare Sub Bmp085_absolute_altitude() Cursor Off Noblink Cls Locate 1 , 1 : Lcd "BAROMETRO PESCAS" Set Dht_io_set ' prepara interface com o DHT-11 Set Dht_put I2cinit ' Inicializa bus I2C, mas com PULL-UP Interno ! Portc.4 = 0 ' temos de desativar eles novamente ! Portc.5 = 0 ' assim protegemos nosso sensor que usa 3.3 V ! ' Vamos ler os dados de calibração do BMP 085 Call Bmp085_read_calibration_data() Do Temperature ' leitura precisa de temperatura do DS18B20 Waitms 2000 Call Get_th(tdht , Hdht) ' leitura precisa de umidade do DHT-11 ' Agora, vamos medir a pressão do BMP085. Para isso : ' É bem complicado, temos primeiro de ler a temperatura sem compensação ' e depois calcular a compensação ! Call Bmp085_initiate_measurement(1) '1 = Temperatur Measurement Call Bmp085_read_u_temp() Call Bmp085_calc_temp() 'Calculate Compensated Temperature 'Temperatur = Str(t) ' Agora, vamos medir a pressão sem compensação , e depois calcular a ' compensação, com cálculos bem chatinhos ! Call Bmp085_initiate_measurement(5) 'Very High Resolution Pressure Measurement (OSS=3) ' ^ type in Measurement_type !!!! <<<<<---------------------------------------- Call Bmp085_read_u_press() Call Bmp085_calc_pressure() ' Agora, temos tudo para calcular o Ponto de Orvalho Call Orvalho ' Pronto, tudo calculado , é só mostrar ! Cls Locate 1 , 1 Lcd "T= O= " ' Temperatura e Orvalho na primeira linha Locate 1 , 3 Lcd Fusing(tempc , "##.#") Locate 1 , 10 Lcd Fusing(pcomp , "##.#") Locate 1 , 15 Lcd Chr(223) ; "C" Locate 2 , 1 Lcd "P= U=" ' Pressão Corrigida E Umidade Na Segunda Locate 2 , 3 Lcd Ph Lcd "mB" Locate 2 , 12 Lcd Hdht Lcd " %" Loop End '////////////////////////////////////////////////////////////////////////////// Sub Temperature ' actual measuring 1wreset 1wwrite &HCC 1wwrite &H44 ' start measure Waitms 1000 Read1820 ' read 9 bytes End Sub '////////////////////////////////////////////////////////////////////////////// Sub Read1820 ' reads sensor ans calculate ' T for 0.1 C 1wreset ' reset the bus 1wwrite &HCC ' read internal RAM 1wwrite &HBE ' read 9 data bytest Bd(1) = 1wread(9) Waitms 1 1wreset ' reset the bus Bd(6) = Bd(2) And &B10000000 ' não usamos para nada mesmo .... Tmp = Bd(1) And &B00001111 T1 = Tmp / 16 Bd(1) = Bd(1) And &B11110000 Bd(1) = Bd(1) / 16 Bd(2) = Bd(2) And &B00000111 Bd(2) = Bd(2) * 16 Tempc = Bd(1) + Bd(2) Tempc = Tempc + T1 If Bd(6) = 128 Then Tempc = Tempc - 256 Else End If End Sub '-------------------------------------------------------------------------------------- ' SUB-ROTINA PARA LER O DHT-11 Sub Get_th(tdht As Byte , Hdht As Byte) Count = 0 Sensor_data = "" Set Dht_io_set 'vira saída Reset Dht_put 'nivel 0 na saída Waitms 25 'tempo de espera pro dht11 25mseg Set Dht_put 'volta nivel 1 na saída Waitus 40 'espera 40 useg Reset Dht_io_set 'vira entrada Waitus 40 'espera mais 40 useg If Dht_get = 1 Then 'se continua 1 tem algo errado Hdht = 1 'pois deveria estar em 0 ! Exit Sub End If Waitus 80 'espera 80 useg If Dht_get = 0 Then 'agora tem de estar 1 ! Hdht = 2 'se tiver 0 , deu erro Exit Sub End If While Dht_get = 1 : Wend 'espera iniciar transmissão Do While Dht_get = 0 : Wend 'começou a transmissão Waitus 30 'voltou a nivel 1, espera 30 useg If Dht_get = 1 Then 'se apos 30 useg continua 1, então o bit é 1 Sensor_data = Sensor_data + "1" 'coloca 1 no buffer de dados While Dht_get = 1 : Wend 'espera esse bit 1 terminar Else 'se apos 30 useg virou 0, então o bit é 0 Sensor_data = Sensor_data + "0" 'coloca zero no buffer End If Incr Count ' incrementa contador de bits Loop Until Count = 40 ' repete para 40 bits totais Set Dht_io_set Set Dht_put Tmp_str8 = Left(sensor_data , 8) 'os primeiros 8 bits são a umidade Hdht = Binval(tmp_str8) 'Vamos transformar para valor numérico Tmp_str8 = Mid(sensor_data , 17 , 8) 'os próximos 8 são a temperatura Tdht = Binval(tmp_str8) Tmp_str8 = Right(sensor_data , 8) 'os ultimos 8 são o CRC Crc = Binval(tmp_str8) ' Mybyte = Tdht + Hdht ' o CRC é a soma da umidade + temperatura If Mybyte <> Crc Then ' considerando 8 bits Hdht = 3 ' se não bateu, erro ! End If End Sub 'final da subrotina '-------------------------------------------------------------------------------------- 'subrotina para ler o sensor de pressão BMP085 Sub Bmp085_read_calibration_data() 'Read Calibration Data from Sensor (11x 16Bit Values) 'for optional Error checking --> None of the Values are &H0000 or &HFFFF Calibration_data(1) = &HAA I2creceive Bmp085_write , Calibration_data(1) , 1 , 22 'We need to swap High Byte with Low Byte of all integers Swap Ac1 Swap Ac2 Swap Ac3 Swap Ac4 Swap Ac5 Swap Ac6 Swap B1 Swap B2 Swap Mb Swap Mc Swap Md End Sub '------------------------------------------------------------------------------------------------------- Sub Bmp085_initiate_measurement(byval Measurement_type As Byte) Local M_type As Byte , Wait_time As Byte If Measurement_type < 1 Or Measurement_type > 5 Then Ac1 = Ac1 ' achei melhor por alguma coisa do que deixar vazio Else Select Case Measurement_type Case 1: '1 = Temparature Measurement M_type = &H2E Wait_time = 5 'ms Case 2: M_type = &H34 '2 = Ultra Low Power Pressure Measurement (OSS = 0) Wait_time = 5 'ms Oss = 0 Case 3: M_type = &H74 '3 = Standard Pressure Measurement (OSS = 1) Wait_time = 8 'ms Oss = 1 Case 4: M_type = &HB4 '4 = High Resolution Pressure Measurement (OSS = 2) Wait_time = 14 'ms Oss = 2 Case 5: M_type = &HF4 '5 =Ultra High Resolution Pressure Measurement (OSS = 3) Wait_time = 26 'ms Oss = 3 End Select I2cstart I2cwbyte Bmp085_write I2cwbyte &HF4 I2cwbyte M_type I2cstop 'Wait_time = between 5 and 26ms depending on above selected measurement method Waitms Wait_time End If 'If Measurement_type < 1 Or Measurement_type > 5 Then End Sub '---------------------------------------------------------------------------------------------------- Sub Bmp085_read_u_temp() I2cstart I2cwbyte Bmp085_write I2cwbyte &HF6 I2crepstart I2cwbyte Bmp085_read I2crbyte U_temp_high , Ack I2crbyte U_temp_low , Nack I2cstop End Sub '---------------------------------------------------------------------------------------------------- Sub Bmp085_read_u_press() I2c_receive_buf(1) = &HF6 I2creceive Bmp085_write , I2c_receive_buf(1) , 1 , 3 U_pressure_high = I2c_receive_buf(1) U_pressure_mid = I2c_receive_buf(2) U_pressure_low = I2c_receive_buf(3) Select Case Oss Case 0: Shift U_pressure , Right , 8 Case 1: Shift U_pressure , Right , 7 Case 2: Shift U_pressure , Right , 6 Case 3: Shift U_pressure , Right , 5 End Select End Sub '--------------------------------------------------------------------------------------- Sub Bmp085_calc_temp() ' Calculate true Temperature 'X1 = X1 = U_temperatur - Ac6 X1 = X1 * Ac5 Shift X1 , Right , 15 'X2 = X21 = X1 + Md X22 = 2 ^ 11 X22 = X22 * Mc X2 = X22 \ X21 'Integer division is denoted by the backslash (\). 'B5 = B5 = X1 + X2 'T = T = B5 + 8 Shift T , Right , 4 '4 End Sub '---------------------------------------------------------------------------------------- Sub Bmp085_calc_pressure() ' Calculate true pressure B6 = B5 - 4000 'X1 = X21 = 2 ^ 12 X22 = B6 * B6 X1 = X22 \ X21 X1 = X1 * B2 Shift X1 , Right , 11 'X2 = X21 = 2 ^ 11 X22 = Ac2 * B6 X2 = X22 \ X21 'X3 = X3 = X1 + X2 'B3 = X21 = Ac1 * 4 X22 = X21 + X3 Shift X22 , Left , Oss X22 = X22 + 2 B3 = X22 \ 4 'X1 = X21 = 2 ^ 13 X22 = Ac3 * B6 X1 = X22 \ X21 'X2 = X21 = 2 ^ 12 X2 = B6 * B6 X2 = X2 \ X21 X2 = B1 * X2 Shift X2 , Right , 16 'X3 = X21 = 2 ^ 2 X3 = X1 + X2 X3 = X3 + 2 X3 = X3 \ X21 'B4 = B4 = X3 + 32768 B4 = Ac4 * B4 Shift B4 , Right , 15 'B7 = X21 = 50000 Shift X21 , Right , Oss B7 = U_pressure - B3 B7 = B7 * X21 If B7 < &H80000000 Then Idw = B7 * 2 Idw = Idw \ B4 P = Idw Else Idw = B7 \ B4 Idw = P * 2 P = Idw End If 'X1 = X21 = 2 ^ 8 X1 = P \ X21 X1 = X1 * X1 'X1 = X21 = 2 ^ 16 X1 = X1 * 3038 X1 = X1 \ X21 'X2 = X21 = 2 ^ 16 X2 = -7357 * P X2 = X2 \ X21 'p = X21 = 2 ^ 4 X22 = X1 + X2 X22 = X22 + 3791 X22 = X22 \ X21 P = P + X22 Pcomp = P * 1.0896 'FATOR CORREÇÃO PARA ALTURA=746 MTS P = Pcomp Ph = P \ 100 End Sub '------------------------------------------------------------------------------ Sub Orvalho ' CALCULA O PONTO DE ORVALHO 'Vamos usar a mesma variável real Pcomp para economizar ... Pcomp = Hdht / 100 Pcomp = Pcomp ^ 0.125 Pvarx = Tempc * 0.9 Pvarx = Pvarx + 112 Pcomp = Pvarx * Pcomp Pvarx = 0.1 * Tempc Pcomp = Pcomp + Pvarx Pcomp = Pcomp - 112 End Sub Paulo
  2. Pessoal, achei um Bug na simulação do Proteus 7. E é daqueles que deixa a gente doido ! Estava testando o novo projetinho do medidor de pressão, e como resolví fazer algo bem ilustrativo, estou usando 3 sensores ao mesmo tempo : o DS18B20 que é 1-Wire, o DHT-11 que é um tipo de 1-Wire proprietário, e o Bosh BMP085, que é I2C a 3.3 Volts. Como o sensor de tensão é relativamente trabalhoso em termos de cálculos com ponto flutuante, o programa inteiro não coube mais no ATMEGA48 que estava utilizando. Aí, como eu tinha um ATMEGA168, troquei o processador no programa, e continuei fazendo. Logo de cara, compilei e carreguei no ISIS, apenas trocando o ATMEGA48 pelo ATMEGA168 . E a partir daí as leituras com o DS18B20 começaram a dar errado. Bom, isso era sábado, umas 3 horas da tarde. Fiquei procurando um erro no programa até umas 7 horas da noite. E nada ! O pior é que o osciloscópio virtual , ligado na linha de dados do DS18B20, mostrava um sinal doido, que não tinha nada a ver. Aí, começou o desespero. Mexí no programa, tirei pedaços e pedaços, até ficar quase idêntico ao programa do Tutorial, que utiliza o DS18S20. E continuava a doidera do sinal de dados. Como não funcionava, já na madrugada, resolví pegar o programa do Tutorial, que utiliza o DS18S20, e troquei apenas o processador, para um ATMEGA168. Compilei, e quando fui simular no ISIS, aconteceu o mesmo erro que eu estava tendo no novo programa ! Resolví tirar a dúvida, troquei no programa pelo ATMEGA168P , e o erro permaneceu. Mas .... quando troquei para o ATMEGA88, funcionou direitinho novamente..... Mudei novamente para o ATMEGA328, e também funcionou direitinho. Resolví testar mais : troquei a porta onde o DS18S20 estava ligado, recompilei, e não adiantou nada. O erro continuava dando APENAS no ATMEGA168 e ATMEGA168P ! Resolví tirar a prova dos nove : Montei o circuito real no protoboard, primeiro com o ATMEGA48P , e funcionou direitinho. Aí, recompilei o programa para o ATMEGA168 que tenho, gravei, e coloquei no protoboard. Advinhem : também funcionou direitinho ! Ou seja, o problema não é o ATMEGA168, e nem com o compilador BASCOM, pois o hardware real funciona, mesmo com a simulação do ISIS dizendo que não funcionaria... O problema está no modelo do ATMEGA168 e no ATMEGA168P do PROTEUS. Como dica, fiz um teste que funcionou direitinho : No ISIS, padronizei o processador ATMEGA328, pois consigo carregar nele sem nenhum problema os programas compilados para os ATMEGA48, ATMEGA88 e ATMEGA168. Não preciso alterar nada , é só simular e pronto ! CUIDADO COM O MODELO DO ATMEGA168 e ATMEGA168P. Obs : bug foi corrigido na versão 8 do Proteus ! Paulo
  3. Pessoal, Acabei de receber um sensor de pressão barométrica relativamente barato,o BMP085 da BOSCH, paguei R$ 18,00 , vou fazer um programinha para ter um aparelho que mostre Pressão Atmosférica, Temperatura , Umidade Relativa do Ar e Ponto de Orvalho, para me ajudar nas minhas pescarias ...... até domingo postarei o projetinho. Paulo ATUALIZAÇÃO - Estou incluindo no Tutorial o uso do DHT-11, e também um projetinho simples de uso do BMP085, mostrando apenas a pressão e a temperatura. Motivo - o programa que fiz e vou postar aqui no tópico ficou grande demais, pois utilizei 3 sensores com interfaces diferentes para ilustrar um uso mais sofisticado do Bascom; e acabou precisando de um ATMEGA88 para caber tudo, mas a versão demo do Bascom não consegue compilar, pois passa de 4 Kb. Porisso, estou fazendo esse novo projetinho apenas para o Tutorial, que irá permitir utilizar o ATMEGA48 e a versão demo do Bascom. Logo postarei o Tutorial Atualizado.
  4. Ok, já respondí, quando terminar o seu projeto, poste aqui o projeto completo, para ajudar a mais pessoas, ok ? Um abraço ! Paulo
  5. Heheheh isso acontece..... Pode desconsiderar o velho porque tudo o que tinha nele está também no novo, além de ter os programas-fontes e os arquivos de simulação tudo prontinhos prá rodar !!!! Aquela sua aplicação, que voce disse no outro tópico, fica muito fácil de fazer em Basic mesmo, é só voce acompanhar o tutorial e estudar pelo menos uns 3 projetos do início, aí já dá para fazer o que voce precisa, ok ? Aí, se voce resolver montar o projeto, pode tanto usar um protoboard maior e montar tudo inclusive a parte do microcontrolador, como comprar uma plataforma ARDUÍNO simples, eu recomendo o famoso Uno R3, barato e super-documentado com zilhões de aplicações na NET; aí voce só tem que mudar no BASCOM o tipo de processador, o clock utilizado, e as portas que voce quiser utilizar, e usa um pequeno protoboard externo só para montar os circuitinhos externos, ok ? Para programar , voce usa o soquete ICSP de 6 pinos que tem em todos os Arduínos. Todo o procedimento de gravação com o PROGISP está detalhado no tutorial, assim fica bem fácil começar ! Enfim, boa diversão !!!! Paulo
  6. Oi lpdant, Como assim não consegue baixar ? Acabei de verificar, 8 pessoas já baixaram, e o link está ok, acabei de testar. O que que acontece ? Paulo
  7. Pessoal, Comprei um sensor baratinho ( R$ 13,00 ) de umidade do ar e temperatura, que é o DHT-11, chegou ontem, e não tive tempo de incluir o projetinho no tutorial. Só depois que ele chegou é que ví que embora ele seja do tipo 1-Wire, o protocolo é proprietário, isto é, não segue nenhum padrão !!! Tive de baixar o PDF dele e procurar mais dicas na NET para fazer isso funcionar..... Só agora conseguí terminar o projetinho, ficou simples e funcional; vou postar aqui o projetinho completo com o programa para quem precisar. O esquema eletrônico é exatamente o mesmo que eu usei no Tutorial para o Controle de Cooler com 1-Wire, a única diferença é a troca do sensor pelo DHT-11. Eu encontrei esse programa práticamente pronto na Net, reproduzo aqui , modificando para o meu caso, e acrescentei os comentários para explicar o programa. O site que encontrei foi o AVRproject.ru . Mais informações sobre o funcionamento do DHT-11 no link abaixo : http://embedded-lab.com/blog/?p=4333 $regfile = "m48pdef.dat" $crystal = 8000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 Cursor Off Cls Declare Sub Get_th(t As Byte , H As Byte) 'vamos ligar o sensor no pino B.0 Dht_put Alias Portb.0 ' aqui usamos como saída Dht_get Alias Pinb.0 ' e aqui usamos como entrada ! Dht_io_set Alias Ddrb.0 ' aqui mudamos entrada < - > saída Dim T As Byte 'Temperatura Dim H As Byte 'Umidade Dim Crc As Byte 'CRC do medidor Dim Mybyte As Byte Dim Sensor_data As String * 40 'buffer para os 5 bytes Dim Tmp_str8 As String * 8 'string temporária para receber 8 bits Dim Count As Byte 'contador para os bits recebidos Enable Interrupts Set Dht_io_set Set Dht_put Lcd "AVRproject.ru" Lowerline Lcd "DHT11 sensor" Do Waitms 1500 Call Get_th(t , H) Cls Lcd "TMP: " ; T ; "C" Lowerline Lcd "PHP: " ; H ; "%" Loop Sub Get_th(t As Byte , H As Byte) Count = 0 Sensor_data = "" Set Dht_io_set 'vira saída Reset Dht_put 'nivel 0 na saída Waitms 25 'tempo de espera pro dht11 25mseg Set Dht_put 'volta nivel 1 na saída Waitus 40 'espera 40 useg Reset Dht_io_set 'vira entrada Waitus 40 'espera mais 40 useg If Dht_get = 1 Then 'se continua 1 tem algo errado H = 1 'pois deveria estar em 0 ! Exit Sub End If Waitus 80 'espera 80 useg If Dht_get = 0 Then 'agora tem de estar 1 ! H = 2 'se tiver 0 , deu erro Exit Sub End If While Dht_get = 1 : Wend 'espera iniciar transmissão Do While Dht_get = 0 : Wend 'começou a transmissão Waitus 30 'voltou a nivel 1, espera 30 useg If Dht_get = 1 Then 'se apos 30 useg continua 1, então o bit é 1 Sensor_data = Sensor_data + "1" 'coloca 1 no buffer de dados While Dht_get = 1 : Wend 'espera esse bit 1 terminar Else 'se apos 30 useg virou 0, então o bit é 0 Sensor_data = Sensor_data + "0" 'coloca zero no buffer End If Incr Count ' incrementa contador de bits Loop Until Count = 40 ' repete para 40 bits totais Set Dht_io_set Set Dht_put Tmp_str8 = Left(sensor_data , 8) 'os primeiros 8 bits são a umidade H = Binval(tmp_str8) 'Vamos transformar para valor numérico Tmp_str8 = Mid(sensor_data , 17 , 8) 'estes 8 são a temperatura T = Binval(tmp_str8) Tmp_str8 = Right(sensor_data , 8) 'os ultimos 8 são o CRC Crc = Binval(tmp_str8) ' Mybyte = T + H ' o CRC é a soma da umidade + temperatura If Mybyte <> Crc Then ' considerando 8 bits H = 3 ' se não bateu, erro ! End If End Sub 'final da subrotina Paulo
  8. Pessoal, Segue um novo tutorial, orientado para os principiantes, sobre o uso de microcontroladores AVR ( Atmega, Attiny ) em vários tipos de projetos. Conforme os projetos vão evoluindo, mostro também como pode ser muito importante o uso do Assembly dentro do programa em Basic. Isto torna totalmente desnecessário, (melhor dizendo, obsoleto !) o uso de linguagem C para qualquer tipo de programa, mesmo os de temporização muito crítica. Apresento os programas-fontes, os objetos da compilação, e os arquivos de simulação do ISIS, tudo incluído para facilitar. Muitos dos projetos aqui neste tópico são inéditos, e conforme vou apresentando, vou explicando muitas técnicas bem avançadas para conseguirmos atingir os objetivos utilizando sempre um hardware de baixo custo. Lembro aqui que quase sempre podem ser utilizadas as plataformas ARDUÍNO, bastando adequar os esquemas para o hardware escolhido ! O foco foi dado no uso do BASCOM, que possui versão gratuita para gerar objetos até 4K, e a Simulação dos projetos, utilizando o ISIS do PROTEUS. Assim, fica bem mais fácil para todos fazerem os seus projetos, e rodar a simulação no ISIS, antes de partir para a montagem física. Este novo tutorial é uma evolução natural do antigo tutorial escrito por mim faz algum tempo, e este novo substitui totalmente o antigo. Importante -> Acabei de colocar uma versão atualizada, com projetos utilizando sensores de Umidade e de Pressão, bem como utilização de componentes 1-WIRE e I2C com tensões diferentes à do AVR. Esta nova versão tem agora 169 páginas ..... Mas mesmo após ler o tutorial, a continuação natural dele está aqui neste tópico, que já possui muita informação extra e avançada. Boa diversão e um excelente aprendizado a todos. Paulo Tutorial_AVR.zip Tutorial_AVR.zip
  9. Vou tentar descrever a técnica de multiplexação : Como sabemos, a persistência retiniana faz com que percebamos como contínua qualquer visualização discreta, desde que essa visualização seja maior do que 30 vezes por segundo. Claro que isso varia um pouco de pessoa para pessoa, mas em tese, se fazermos uma imagem piscar 40 vezes por segundo, iremos perceber como se essa imagem estivesse sempre ligada ! Esse é o princípio da multiplexação, que no seu caso é acender apenas um dos displays, deixar um pouquinho aceso, apagar, acender o outro display, esperar um pouquinho, etc, e assim indefinidamente. Imagine o numero 81, queremos que ele seja mostrado no display. O primeiro display é o dezenas, e o segundo display é o das unidades. Portanto, temos de colocar na saída do PIC o numero 8, selecionar a saída do display das dezenas, esperar um pouco, apagar o display, e aí colocamos o numero 1 na saída do PIC, selecionamos a saída do display das unidades, esperamos um pouco, apagamos, e voltamos ao início novamente. Se fizermos esse processo 40 vezes por segundo para cada display, voce não irá perceber as piscadas que existem, e o melhor de tudo, como apenas 1 display está aceso , sempre a corrente será a de um só display ! Isso fica melhor ainda se voce imaginar que tem 4 displays em vez de 2, imagine se voce fosse acender todos eles ao mesmo tempo, a corrente que seria consumida pelo seu circuito ! No caso dos PICs, que suportam uma boa corrente de saída em seus pinos, podemos ligar os displays diretamente aos pinos, com apenas um resistor limitador, e não precisamos de nenhum driver adicional de corrente. como se faz essa multiplexação a nivel de software ( e hardware ... ) ? Usamos um dos TIMERS do PIC, geralmente o TIMER 0 , e programamos ele para interromper o programa principal no mínimo 80 vezes por segundo, para fazermos a sequência descrita acima. Assim, fica fácil de perceber que iremos acender cada um dos displays 40 vezes a cada segundo, e cada display ficará aceso por cerca de 1/80 = 12,5 milisegundos a cada vez ! Claro que esse procedimento faz com que a luminosidade de cada display seja baixa, pois em 1 segundo cada display ficará aceso por apenas 0,5 segundos, ou seja, a luminosidade será a metade ! O que fazemos para melhorar isso é utilizar uma característica dos LEDs : se normalmente a corrente máxima para um display é de 25 ma para cada segmento, se consultarmos a documentação veremos que eles podem suportar uma corrente bem maior ( por exemplo, 100 ma ) por alguns milissegundos, e com uma certa taxa de repetição máxima . Assim, baseado no datasheet do display, escolhemos a frequência de refresh , e aumentamos a corrente dos segmentos, para mantermos o brilho alto. Claro que nesse caso usamos drivers de corrente tipo source, por exemplo, o UDN2981. Resumindo, o programa principal calcula o valor a ser mostrado, e coloca esse valor em duas variáveis separadas ( dezenas e unidades ), e sinaliza à rotina de multiplexação que os dados estão completos e corretos. Ou seja, se o programa principal está na iminência de alterar um dos dois valores, ele sinaliza através desse flag, e quando ele concluir a alteração dos dois valores, ele sinaliza novamente através desse flag. Assim, a rotina de multiplexação consulta sempre o flag ANTES de mostrar, asssim evitamos um problema recorrente que é o de perceber uma "piscada" de um valor meio maluco de vez em quando ( imagine que o valor está mudando de 10 para 09, e a rotina de multiplex interrompeu justamente após a mudança da dezena apenas, o que irá aparecer rápidamente no display será 00 ! ) . Ao consultar o flag, a rotina de multiplex simplesmente não faz nada e termina, o que pode fazer com que um dos displays seja atualizado apenas 39 em vez de 40 vezes, na prática isso não é perceptível ! Caso voce ainda tenha dúvidas, sugiro que leia o Tutorial no link abaixo : http://forum.clubedohardware.com.br/showpost.php?p=3712305&postcount=3 Bons projetos. Paulo
  10. Brunocavaledo, Eu tenho um projetinho muito parecido, que mede tensão e corrente, usando EXATAMENTE o mesmo princípio ( mas tensão até 20 V e corrente até 20A ), utilizando um microcontrolador AVR ATMEGA48, e que possui apenas a calibração de corrente devido à tolerância do resistor shunt ( 10% ). É práticamente idêntico em funcionamento e ajuste ao segundo esquema que voce postou. A medição de tensão tem precisão dentro de 5% e para mim é o suficiente, mas pode ser alterado no programa para também poder ajustar mais precisamente a tensão. Posso modificar ele para a tensão e corrente que voce precisar, e o código-fonte está escrito em BASCOM ( Basic ). Veja se te ajuda, ok ? Paulo
  11. Beleza , Felipe, se voce escrever em C , mas colocar a sintaxe normal, sem aquelas abreviações ( *&%$#@!(@!)!)@>>++<<< ..... ) , fica bem mais fácil para mim converter, e se tiver alguma dúvida voce me ajuda !!!! Legal essa ideia de fazer multiplataforma, mas voce vai parametrizar para ela ser bem genérica, tipo poder definir quantas frequências , quantas amostras, quantos intervalos , etc ???? Se for usar aquele método Buterfly, vai dar trabalho pacas !!!! Bom, manda bala e vê o que fica melhor para todos . Valeu , Felipe ! Paulo
  12. Felipe, no post anterior ao seu, eu passei o link do projeto completo ! Eu tentei copiar o link apenas do arquivo para download, mas não funciona se voce não acessar a página diretamente ! Acesse a página, o link para download está imediatamente ao final da descrição do projeto, e ANTES dos trocentos posts de comentários !!!! Esse arquivo contém tudo, desde o esquema, PCB's para diversos tipos de displays, fontes e arquivos .HEX prontos para gravar, ok ? Dá uma olhada no source do cara ..... e depois se voce me ajudar a passar pro Basic, vai ficar uma beleza isso ! Valeu !!!!!!! Boa pesquisa ! Paulo
  13. Pessoal, Segue o link de um projeto muito legal, muito simples de montar, e que funciona muito bem. É um analisador de espectro de áudio, que pode utilizar vários tamanhos de displays LCD ou VFD. Tem ajuste de luminosidade via PWM, e ajuste de ganho de áudio, tudo por software. http://diy.elektroda.eu/analizator-widma-akustycznego-v2/?lang=en O site está em inglês, e ao final existem os links para se obter todos os arquivos do projeto. Mas todo o projeto original está em Polonês, e os comentários do programa também estão em Polonês, ou seja, não dá para entender o funcionamento do programa sem ficar traduzindo os comentários .... O circuito usa um ATMEGA8, e o software é em Bascom-AVR com algumas operações em assembly para se ganhar velocidade. Se alguém estiver interessado, eu reescreví o software para utilizar um ATMEGA88, o qual não apresenta nenhum possível problema com o ADC em 44 Khz. Aliás, só para fazer um pequeno teste, eu troquei o cristal de 16 Mhz por um de 20 Mhz, e tirei as rotinas em assembler, utilizando exclusivamente o Bascom, e funcionou direitinho. Embora a parte do software que realiza a DFT esteja bem confuso, o resto é bem simples, e ilustra muito bem o poder da linguagem Basic do BASCOM, aliado a um hardware muito simples. Futuramente, estarei incluindo num novo tutorial esse exemplo, simulado pelo Proteus. Paulo
  14. Bom dia pessoal, estou voltando à atividade aqui no Fórum, e percebí que os links de downloads dos tutoriais não estão funcionando. Vou atualizar os links, e depois postarei algumas novidades sobre o uso do BASCOM-AVR, que ajudam bastante a quem está começando. E ao longo desse tempo que fiquei ausente, acabei usando bastante o Proteus, para simular o funcionamento dos programas sem ter de toda hora mexer no hardware físico. Conseguí simular quase todos os projetos que realizei, claro que com algumas limitações, mas ganhei muito tempo fazendo essa simulação. Com o osciloscópio virtual, o debug ficou muito, mas muito mais fácil. Se houver interesse , posso fazer um pequeno tutorial sobre o processo e algumas dicas muito úteis, que permitirão a integração fácil entre o BASCOM-AVR e o PROTEUS. E, aos amigos que sempre ajudaram a todos aqui no Fórum, meus agradecimentos pela cooperação ! Paulo
  15. Grande Felipe, faz tempo que voce não aparece, bom retorno !!!! Só para deixar um pouco mais claro, esse exemplo do Felipe está perfeito em termos de cálculo, mas assume que a transferência de energia térmica entre todos os envolvidos tem rendimento de 100 % , que na prática está muito longe da realidade. Se conseguirmos fazer acoplamentos muito eficientes entre a junção Peltier e os dois lados envolvidos, quem sabe conseguiremos uns 20 % de rendimento nas transferências, aí então bastaria multiplicar os números por 5. Assim, ou aumentamos a potencia da junção Peltier em 5 vezes, ou o tempo necessário terá de ser multiplicado por 5, certo ? Esse é o tipo de projeto em que só a prática permite ajustar as coisas até estarmos satisfeitos com os resultados .... Paulo
  16. O que voce quer é isto : O seu programa fica normalmente fazendo a conversão do A/D e guardando elas na memória , e quando voce receber um determinado byte voce que que páre de fazer as conversões e vá para uma rotina que vai te enviar esses bytes pela serial, ok ? Basta implementar a comunicação serial e ficar observando sempre a cada conversão A/D se tem algum dado recebido via serial; se tiver, veja se é o dado correto que voce está esperando, e se for, simplesmente sai do loop do A/D e vai para a rotina de TX serial, ok ? Veja se é isso e eu posto o esqueleto do negócio ! Paulo
  17. Pessoal, Independente do método, a pastilha Peltier tem de dissipar a potência para o ambiente, ou não vai conseguir retirar o calor do conteúdo da caixa. Seja cobre, alumínio, cerâmica, continua sendo um dissipador. E se quiser um dissipador mais eficiente, lembre-se do princípio dos coolers de CPU cheio de aletas. As aletas multiplicam grandemente a superfície de dissipação, permitindo um fluxo de calor bem maior. O truque é prender a pastilha em algo que funcione como um dissipador, tanto do lado interno da caixa como do lado externo, assim melhora o fluxo entre a pastilha e os 2 ambientes. Já ví usarem algo tipo aqueles dissipadores de amplificador de potência de áudio de grande potência, cheio de aletas, e funcionou perfeitamente. Se colocar poucas aletas ( ou seja, baixa eficiência ) , demora muito mais tempo para as latinhas abaixarem a temperatura, ok ? Paulo
  18. Nossa, agora ferrou .... misturou A/D, serial e gravação Eprom .... Bom, pelo que entendí, voce está preocupado em perder alguma coisa. Explique melhor qual é a sua dúvida, se é perder o valor do conversor A/D, ou perder o valor do dado recebido via serial. A gravação na Eprom não tem problema de ser perdida, ok ? Lembre-se , sempre podemos habilitar ou desabilitar as interrupts na hora em que quisermos, com isso podemos controlar bastante cada processo. Paulo
  19. Igor, Existe um projeto completo que saiu numa revista brasileira de eletrônica, fazem uns 2 anos creio eu, tinha tudo isso que voce tá falando. Dá uma pesquisada ok ? O que eu sei : - Primeiro, tem de dimensionar qual a potência necessária para resfriar o seu recipiente. Isto voce calcula a partir do conteúdo dele e da provável temperatura ambiente. Por exemplo : 10 latas de cerveja = +- 3,6 litros de "'agua" ( parecido ... ) Aí voce imagina que a temperatura ambiente é de por exemplo 30 graus, e voce quer refrigerar até uns 4 graus, e calcula quantas calorias voce terá de retirar das latinhas para atingir a sua temperatura. A partir disto, voce calcula qual a potência de sua pastilha Peltier para fazer isto. Dá uma margem de sobra de uns 30% para compensar rendimento térmico. - Agora, sabendo da potência que voce quer, o fabricante das pastilhas possui tabelas que informam os modelos com as potências desejadas, e dentro desta potência existem variações de tensão e de corrente. Por exemplo, existe um modelo que trabalha com 12 volts e 5 ampéres, e um outro modelo que trabalha com 20 volts e 3 ampéres, ambos possuem a mesma potência. A partir daí, é só voce fornecer a tensão e a corrente desejada, e controlar a temperatura, ok ? Boa sorte. Paulo
  20. Oi Helder, O compilador C que a turma usa para AVR é o WINAVR, é free !!!! , e um tutorial que já ví recomendarem é este aqui : http://winavr.scienceprog.com/ Infelizmente em C não posso te ajudar nada, mas tem muita gente aqui no Fórum que é fera em C e AVR. Faça um post no Fórum principal, e veja se aparece alguém para te ajudar, ok ? Agora, não se assuste com os AVR's, eles são muito mais poderosos que os 8051 que voce conheceu, e incluem um montão de hardware dentro deles por um custo x benefício imbatível. Boa sorte ! Paulo
  21. aphawk

    Ajuda Com 127V

    Não faça isso ...... Dimmer é utilizado para o controle de potência, pois ele não limita nem a tensão, nem a corrente, o que ele faz é limitar o tempo em que a energia é aplicada à carga ! Se retificar a tensão com a ponte de diodos, e filtrar com um capacitor, vai ter mais de 150 volts nela !!!!!!! A melhor solução mesmo é utilizar um transformador, ok ? Paulo
  22. MatheusLPS, Excelente a sua iniciativa, parabéns !!!! Estou no aguardo do restante do projeto ! Paulo
  23. Ué ... estão define TODA A EEPROM : Dim buffer(511) As ERAM Byte DIM b as Byte DIM i as byte para ler : i= 124 b=buffer(i) -> b tem o conteúdo da posição 124 da EEPROM ! para gravar : i=124 b=adc(0) buffer(i)=b -> agora, a leitura do ADC está na posição 124 da EEPROM ! Detalhe : sempre tem de usar uma variável comum para ler e gravar dados na EEPROM, ou seja, não pode usar diretamente em nenhuma outra operação, nem fazer contas com ela, nem mostrar no display, nada !!!!! Primeiro sempre passe o valor da EEPROM para uma variável comum. Lembre sempre disso, ajuda a procurar agulhas num palheiro ! O tamanho da EEPROM muda conforme o AVR, ok ? Eu percebí que a variável C era só um contador, mas também percebí que o seu programa de ler e escrever na memória EEPROM ignorava totalmente a variável C !!!! Porisso que eu falei aquela observação. Modifique e teste, ok ? Paulo
  24. Eu tava estranhando a sua dificuldade, pois RS232 é mais fácil que empurrar bêbado em descida .... Bom, pelo seu código, voce está querendo armazenar 10 leituras então por que que não reservou 10 endereços na EEprom ?????? Vou te dar uma excelente dica : baixe o Help do Bascom, verifique os exemplos que tem nos comandos Basic, relativos à escritas e leituras em EEPROM, sua resposta está lá ! Seu programa está invadindo áreas que não foram reservadas, porisso o erro ! Repare que nos exemplos são especificados os N bytes para serem guardados os valores, ou seja, voce precisa reservar eles ANTES de usar, pois o compilador utiliza isto para alocar a área exata de EEPROM. Modifique seu programa para esses 10 bytes no seu caso, que deve funcionar, ok ? Um abraço ! Paulo Opa, achei algo estranho : Do O = Getadc(0) Print #1 , O Print #1 , T Waitms 250 Writeeeprom O , Label1 C = C + 1 Loop Until C = 10 Do Readeeprom D , Label1 Print #1 , D Waitms 250 C = C - 1 Loop Until C = 0 O que que a variável C tem a ver com os seus dados na EEprom ??????????? Tudo está se referindo SEMPRE para o endereço definido em Label1, como isso nunca muda, sempre está vindo o valor mantido em Label1 .... mude isto, indexando o byte A PARTIR de label1 , ok ?
  25. Ué ... não entendi ... Se no seu programa voce definiu o cristal como 10 Mhz, voce só poderia estar usando um cristal EXTERNO !!!!!!!!!!!! O clock interno no Atmega pode ser 1 Mhz, ou 8 Mhz, mas nunca 10 Mhz ! Porisso que te perguntei sobre os FUSES !!!! Se voce está usando o clock interno, programa os FUSES no Atmega para gera 8 Mhz, e declare no programa $crystal = 8000000 ! Se for usar um cristal externo, também tem de programar os FUSES de acordo com o cristal utilizado, e declarar a velocidade correta no programa. O Bascom gera o baud rate a partir da frequência declarada do cristal no programa, que TEM DE COINCIDIR COM O CRISTAL !!!! Caso contrário voce vai ficar doido mesmo ..... Modifique e veja se agora vai, ok ? Paulo

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!