Ir ao conteúdo
  • Cadastre-se

Marcos Baungartner

Membro VIP
  • Posts

    32
  • Cadastrado em

  • Última visita

Reputação

1

1 Seguidor

Sobre Marcos Baungartner

  1. Agradeço a resposta, o SetLocal EnableDelayedExpansion foi a primeira coisa que testei, porém mesmo assim não funcionou. Vi que você setou a variável CMDER_START manualmente, isso não pode acontecer, pois esta variável é setada automaticamente com o caminho do diretório onde clico com o botão direito e escolho "Cmder aqui" para que o terminal abra naquele diretório. Se essa variável for setada manualmente, a clausula else ( pushd %USERPROFILE%) nunca será satisfeita, pois quando eu abro o console diretamente pelo atalho a variável CMDER_START é setada com valor vazio, ou seja, Not Defined, e então inicia no %USERPROFILE%.
  2. Estou criando um script em batch e preciso saber se uma variável possui aspas, a variável CMDER_START possui a string C:" e o comando Set CMDER_START=%CMDER_START:"=\% funciona perfeitamente quando eu o uso no terminal, porém infelizmente parece que não está funcionando no arquivo .bat: if defined CMDER_START ( Set CMDER_START=%CMDER_START:"=\% pushd "%CMDER_START%" ) else ( pushd "%USERPROFILE%" ) A ideia é que quando o CMDER_START receber a string C:" o comando substitua a aspa (") pela contrabarra (\) para que o comando pushd vá para C:\ Consegui fazer funcionar com o seguinte código: if defined CMDER_START set CMDER_START=%CMDER_START:"=\% if defined CMDER_START ( pushd "%CMDER_START%" ) else ( pushd "%USERPROFILE%" ) Tive que fazer o comando de substituição em outro if, parece que o batch não executa mais de uma linha dentro do bloco if, parece que dá para colocar dois comandos dentro do bloco if acrescentando o &, porém dessa maneira não consegui fazer funcionar, provavelmente por causa da expressão regular que utiliza uma aspas. Se alguém souber e puder mostrar como acrescentar esses dois comandos dentro do mesmo bloco if em um arquivo bat eu ficaria muito grato.
  3. Mas foi exatamente o que fiz, li o Datasheet e criei as funções de comunicação, estas estão funcionando perfeitamente pois já as testei isoladamente com LCD, então o problema não é com o DHT22. O problema parece estar em alguma interrupção, vou fazer testes limpando a Flag das interrupções e testar os comandos AT do ESP8266 isoladamente em um programa a parte, porque pelo que vi ele conecta na internet com sucesso mas não está entrando na função que envia os dados para o ThingSpeak.
  4. Saudações, Não estou conseguindo enviar informações para a plataforma ThingSpeak, as funções do DHT22 estão funcionando perfeitamente pois já testei com LCD, e a configuração do Timer1 também pois já testei separado. Mas nesse meu projeto algo está errado porque não consigo enviar dados de umidade e temperatura para meu canal no ThingSpeak. Liguei a porta Rx do ESP8266 na porta Tx do PIC já com divisor de tensão de 3.3V. A porta Tx do ESP8266 liguei na porta RX do PIC. E as portas GPIO0, RST, CH_PD e VCC estão conectados no 3.3v. Porta GND está no terra. O LED (BREATHING_LIGHT) está piscando aleatoriamente, porém a configuração do Timer1 está correta. Espero que alguém possa me dar uma luz sobre o que pode estar errado, notem que alterei as informações de “SSID”, “SENHA_WIFI” e “CHAVE” por motivos de segurança: //Programa : PIC na IoT com ThingSpeak e DHT22 usando PIC16F628A //Autor : Marcos Roberto Baungartner RA: 9902012531 //Data 29/04/2017 //Diretivas para o pré-processador #include <16F628A.h> //Inclui Header do PIC16F628A #FUSES HS //Oscilador Interno e portas como IO <Habilitado> #FUSES NOMCLR //Master Clear (Reset) <Desabilitado> #FUSES NOWDT //Watch Dog Timer <Desabilitado> #FUSES PUT //Power-Up Timer <Habilitado> #FUSES BROWNOUT //Resetar quando detectar brownout <Habilitado> #FUSES NOLVP //Gravação em baixa-tensão <Desabilitado> #FUSES NOCPD //Proteção do memória EEPROM <Desabilitado> #FUSES NOPROTECT //Proteção para leitura do código <Desabilitado> #use delay(clock = 20000000) //Clock de 4MHz (clock útil de 1MHz) #use rs232(baud=115200,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,ERRORS) #priority INT_TIMER1, INT_RDA //INT_EXT,//ordem de prioridade das interrupções (ordem decrescente de prioridade) //defines gerais: #define DATA PIN_A0 #define BREATHING_LIGHT PIN_A1 #define TAMANHO_COMANDO_MODO_ESTACAO sizeof(ComandoModoEstacao); #define TAMANHO_COMANDO_CONECTA_ROTEADOR sizeof(ComandoConectaRoteador); #define TAMANHO_COMANDO_MULTI_CONEXOES sizeof(ComandoMultiplasConexoes); #define TAMANHO_COMANDO_HTTP_THINGSPEAK sizeof(ComandoConectaHTTPThingspeak); #define TAMANHO_COMANDO_SEND_THINGSPEAK sizeof(ComandoSendDadoThingspeak); #define VALOR_INICIAL_TIMER1 3036 #define ESTADO_MODO_ESTACAO 0 #define ESTADO_CONECTA_ROTEADOR 1 #define ESTADO_MULTI_CONEXOES 2 #define ESTADO_HTTP_THINGSPEAK 3 #define ESTADO_SEND_THINGSPEAK 4 #define TEMPO_SEND_THINGSPEAK 30 //envio para o thingspeak é feito em um período de 30s #define VALOR_MAX_CONTADOR_TEMPO_THINGSPEAK TEMPO_SEND_THINGSPEAK*20 #define SIM 1 #define NAO 0 char ContadorIntTimer; long ContadorEnvioDadosThingspeak; volatile char EstadoMaquinaESP8266; char DeveEnviarDadoThingspeak; unsigned char ContadorIntTimerSensor, umidade_byte1, umidade_byte2, temperatura_byte1, temperatura_byte2, paridade_byte, timeOut; unsigned long temperatura_2byte, umidade_2byte; float temperatura = 0, umidade = 0; //prototypes //void ConfigInterrupcaoEXT(void); void ConfigInterrupcaoUART(void); void ConfigTimer1(void); void ESP8266SetaModoEstacao(void); void ESP8266ConectaRoteador(void); void ESP8266MultiplasConexoes(void); void ESP8266HTTPThingspeak(void); void ESP8266PreparaEnvioHTTP(void); void ESP8266SendThingspeak(char valor); void SetupESP8266(void); /*********************** FUNÇOES DO SENSOR DHT22 ****************************************************/ //Envia sinal de start para o sensor void startSignal() { set_tris_a(0b00000000); //Configura RA0 como output output_low(DATA); //Pino DATA envia 0 para o sensor delay_ms(20); output_high(DATA); //Pino DATA envia 1 para o sensor delay_us(30); set_tris_a(0b00000001); //Configura RA0 como input } //Checa resposta do sensor unsigned char checkResponse() { delay_us(40); if(!input(DATA)) { delay_us(80); if(input(DATA)) { delay_us(40); return 1; } else return 0; } } //Função para ler os dados do sensor DHT22 unsigned char readData() { unsigned char j=0, dataByte=0; if(timeOut) break; for(j = 0; j <= 7; j++) { while(!input(DATA)){ // Espera até que a porta DATA vá para High delay_us(1); } delay_us(30); if(!input(DATA)) { //Se continuar em Low apos 30us, bit = 0 dataByte &= ~(1 << (7 - j)); //Zera bit (7-j) } else { //Se estiver em High apos 30us, bit = 1 dataByte |= (1 << (7 - j)); //Seta bit (7-j) while(input(DATA)){ //Espera até que a porta DATA vá para Low delay_us(1); } } } return dataByte; } /***************************************************************************/ /* //tratamento da interrupção externa #int_EXT void EXT_isr(void) { //debouncing delay_ms(10); // código caso necessite de uma interrupção externa } */ //tratamento da interrupção serial #INT_RDA void serial_isr() { char ByteLido; ByteLido = getc(); } //tratamento da interrupção de timer #INT_TIMER1 void TrataTimer1() { ContadorIntTimer++; ContadorEnvioDadosThingspeak++; ContadorIntTimerSensor++; //contabiliza tempo de envio do dado ao thingspeak if (ContadorEnvioDadosThingspeak >= VALOR_MAX_CONTADOR_TEMPO_THINGSPEAK) DeveEnviarDadoThingspeak = SIM; //controla tempo para piscada do breathing light if (ContadorIntTimer >= 20) { //cada "tick" do timer1 tem 0,05s. Logo, 20 "tiks" equivalem a 1 segundo //troca o estado da saída do breathing light output_toggle(BREATHING_LIGHT); ContadorIntTimer = 0; } //controla tempo para leitura do sensor while(ContadorIntTimerSensor >= 40) { //inicia leitura do sensor startSignal(); if(checkResponse()) { umidade_byte1 = readData(); //primeiro byte da umidade: bit 15 ~ bit 8 umidade_byte2 = readData(); //segundo byte da umidade bit: 7 ~ bit 0 temperatura_byte1 = readData(); //primeiro byte da temperatura: bit 15 ~ bit 8 temperatura_byte2 = readData(); //segundo byte da temperatura: bit 7 ~ bit 0 paridade_byte = readData(); //byte da paridade bit: 7 ~ bit 0 if(paridade_byte == (umidade_byte1 + umidade_byte2 + temperatura_byte1 + temperatura_byte2) & 0xFF) { umidade_2byte = umidade_byte1; umidade_2byte = (umidade_2byte << 8) | umidade_byte2; temperatura_2byte = temperatura_byte1; temperatura_2byte = (temperatura_2byte << 8) | temperatura_byte2; if(temperatura_2byte > 0x8000) { //Se temperatura for maior que 1000 0000 (binario) temperatura_2byte &= 0x7FFF; //Temperatura recebe 14bits, pois o bit 15 representa sinal temperatura = temperatura_2byte; temperatura *= -1; } else { temperatura = temperatura_2byte; } umidade = umidade_2byte; ContadorIntTimerSensor = 0; } } } //configura timer e religa interrupções set_timer1(VALOR_INICIAL_TIMER1); } //função de configuração da interrupção UART //parametros: nenhum //saida: nenhum void ConfigInterrupcaoUART(void) { enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); } //função de configuração da interrupção externa //parametros: nenhum //saida: nenhum /* void ConfigInterrupcaoEXT(void) { enable_interrupts(INT_EXT); enable_interrupts(GLOBAL); ext_int_edge(L_TO_H); } */ //função de configuração do Timer1 //parametros: nenhum //saida: nenhum void ConfigTimer1(void) { // - Frequencia do oscilador interno (20000000/4) = 5Mhz (por default, o PIC funciona a 1/4 da frequencia de clock estabelecida) // - Se o Timer1 tem 16 bits, seu valor máximo de contagem é 0xFFFF (65535) // - Com 5MHz de frequencia util, cada ciclo de máquina terá, em segundos: 1 / 5MHz = 0,0000002 (0,2us) // - Utilizando o prescaler do microcontrolador em 4 (ou seja, a frequencia util do timer1 é 1/4 da frequencia util do pic), temos: // Periodo minimo "contável" pelo Timer1 = (1 / (5MHz/4)) = 0,0000008 (0,8us) // - Logo, a cada 16 bits contados, teremos: 65536 * 0,8us = 0,0524288s // - visando maior precisão, sera feito um timer de 0,05s. Logo: // 0,0524288s --- 65536 // 0,05s --- x x = 62500 // Logo, o valor a ser setado no timer1 é: 65536 - 62500 = 3036 (Aplicar esse numero na linha 6 do pic_esp8266.h) ContadorIntTimer = 0; setup_timer_1(T1_INTERNAL| T1_DIV_BY_4); set_timer1(VALOR_INICIAL_TIMER1); enable_interrupts(INT_TIMER1); enable_interrupts(GLOBAL); } //função que configura o ESP8266 para operar em modo estação (se conecta em um roteador) //parametros: nenhum //saida: nenhum void ESP8266SetaModoEstacao(void) { puts("AT+CWMODE=1\r\n\0"); delay_ms(500); } //função que conecta o ESP8266 em um roteador //parametros: nenhum //saida: nenhum void ESP8266ConectaRoteador(void) { puts("AT+CWJAP=\"SSID\",\"SENHA_WIFI\"\r\n\0"); delay_ms(7000); } //função que configura o ESP8266 para operar com multiplas conexoes //parametros: nenhum //saida: nenhum void ESP8266MultiplasConexoes(void) { puts("AT+CIPMUX=1\r\n\0"); delay_ms(500); } //função que conecta o ESP8266 via HTTP ao Thingspeak //parametros: nenhum //saida: nenhum void ESP8266HTTPThingspeak(void) { puts("AT+CIPSTART=4,\"TCP\",\"184.106.153.149\",80\r\n\0"); delay_ms(5000); } //função que prepara o ESP8266 para enviar dados via HTTP ao Thingspeak //parametros: nenhum //saida: nenhum void ESP8266PreparaEnvioHTTP(void) { puts("AT+CIPSEND=4,46\r\n\0"); delay_ms(500); } //função que envia um dado ao Thingspeak //parametros: dado (número de 1 byte) //saida: nenhum void ESP8266SendThingspeak(float valor1, float valor2) { char ComandoEnvioDadoHTTP[71]; memset(ComandoEnvioDadoHTTP,0,sizeof(ComandoEnvioDadoHTTP)); sprintf(ComandoEnvioDadoHTTP,"GET /update?key=CHAVE&field1=%.1f&field2=%.1f\r\n\0", valor1, valor2); puts(ComandoEnvioDadoHTTP); delay_ms(5000); } //função que inicializa, configura e conecta ESP8266 ao roteador //parametros: nenhum //saida: nenhum void SetupESP8266(void) { ESP8266SetaModoEstacao(); ESP8266ConectaRoteador(); ESP8266MultiplasConexoes(); } //programa principal void main(void) { //inicializa maquina de controle da ESP8266 EstadoMaquinaESP8266 = ESTADO_MODO_ESTACAO; //configura Timer1 ConfigTimer1(); //inicializa contador de tempo de envio de dados para o Thingspeak ContadorEnvioDadosThingspeak = 0; DeveEnviarDadoThingspeak = NAO; //configuração das interrupções (UART e interrupção externa) ConfigInterrupcaoUART(); //ConfigInterrupcaoEXT(); //inicializa, configura e conecta ESP8266 ao roteador SetupESP8266(); while(TRUE) { output_high(PIN_B3); if (DeveEnviarDadoThingspeak == SIM) { ESP8266HTTPThingspeak(); ESP8266PreparaEnvioHTTP(); ESP8266SendThingspeak(umidade, temperatura); ContadorEnvioDadosThingspeak = 0; DeveEnviarDadoThingspeak = NAO; } } }
  5. Bom dia, Eu decorei o Datasheet do DHT22, não há nenhum algoritmo nele, mas todos os que eu vi na internet seguem esse mesmo padrão. Coloquei um Cristal de 20MHz e agora está funcionando. Tive que usar Float para guardar os bytes e mostrar no LCD. Memoria do PIC está 100% ocupada.
  6. Saudações, Estou fazendo um projeto com o sensor de temperatura e umidade DHT22 junto com o PIC 16F628A, porém percebi que o problema está na função que lê os bits do sensor. Alguém poderia me indicar onde está o problema? O meu LCD não aparece nada, somente aparece se eu comentar as linhas que recebem readData() na função main(). Esse é o código do PIC: #define DATA PIN_A1 unsigned char umidade_byte1, umidade_byte2, temperatura_byte1, temperatura_byte2, paridade_byte; unsigned long temperatura_2byte, umidade_2byte, timeOut; float temperatura = 0, umidade = 0; /*********************** FUNÇOES DO SENSOR DHT22 ****************************************************/ //Envia sinal de start para o sensor void startSignal() { set_tris_a(0b00000000); //Configura RA1 como output output_low(DATA); //Pino DATA envia 0 para o sensor delay_ms(25); output_high(DATA); //Pino DATA envia 1 para o sensor delay_us(30); set_tris_a(0b00000010); //Configura RA1 como input } //Checa resposta do sensor unsigned char checkResponse() { delay_us(40); if(!input(DATA)) delay_us(80); if(input(DATA)) { delay_us(40); return 1; } return 0; } //Função para ler os dados do sensor DHT22 unsigned char readData() { unsigned char j=0, contaTempo=0, dataByte=0; if(timeOut) break; for(j = 0; j <= 7; j++) { contaTempo = 0; while(!input(DATA)){ // Espera até que a porta DATA vá para High delay_us(1); contaTempo++; if(contaTempo > 100) { timeOut = 1; break; } } delay_us(40); if(!input(DATA)) { //Se continuar em Low apos 40us, bit = 0 dataByte &= ~(1 << (7 - j)); //Zera bit (7-j) } else { //Se estiver em High apos 40us, bit = 1 dataByte |= (1 << (7 - j)); //Seta bit (7-j) while(input(DATA)){ //Espera até que a porta DATA vá para Low delay_us(1); contaTempo++; if(contaTempo > 100) { timeOut = 1; break; } } } } return dataByte; } /***************************************************************************/ //PROGRAMA PRINCIPAL void main(void) { set_tris_a(0b00000000); set_tris_b(0b00000000); output_a(0); output_b(0); setup_ccp1(CCP_OFF); lcd_init(); // Inicializa LCD printf(lcd_putc, "\f"); // Limpa LCD while(TRUE) { delay_ms(2000); timeOut = 0; //inicia leitura do sensor startSignal(); if(checkResponse()) { umidade_byte1 = readData(); // primeiro byte da umidade: bit 15 ~ bit 8 umidade_byte2 = readData(); // segundo byte da umidade bit: 7 ~ bit 0 temperatura_byte1 = readData(); // primeiro byte da temperatura: bit 15 ~ bit 8 temperatura_byte2 = readData(); // segundo byte da temperatura: bit 7 ~ bit 0 paridade_byte = readData(); // byte da paridade bit: 7 ~ bit 0 if(timeOut){ // Se leitura passar de 100us printf(lcd_putc,"\f"); // Limpa LCD lcd_gotoxy(2, 6); // Define o ponto de inicio da frase L2C6 printf(lcd_putc, "Time out!"); // Escreve no LCD } else { if(paridade_byte == ((umidade_byte1 + umidade_byte2 + temperatura_byte1 + temperatura_byte2) & 0xFF)) { umidade_2byte = umidade_byte1; umidade_2byte = (umidade_2byte << 8) | umidade_byte2; temperatura_2byte = temperatura_byte1; temperatura_2byte = (temperatura_2byte << 8) | temperatura_byte2; if(temperatura_2byte > 0x8000) { // Se temperatura for maior que 1000 0000 0000 0000 (binario) temperatura_2byte &= 0x7FFF; // Temperatura recebe 14bits, pois o bit 15 representa sinal temperatura = temperatura_2byte; temperatura = ( temperatura / 10) * -1; // Corrige temperatura } else { temperatura = temperatura_2byte; temperatura = ( temperatura / 10) * -1; // Corrige temperatura } umidade = umidade_2byte; umidade = umidade / 10; // Corrige umidade lcd_gotoxy(1,5); // Define o ponto de inicio da frase L1C5 printf(lcd_putc,"Temp: %02.1f \xDFC", temperatura); // Escreve no LCD Temperatura em Celsius [printf(lcd_putc, "%f " "\xdf" "C", temperatura)]; lcd_gotoxy(2,5); // Define o ponto de inicio da frase L2C5 printf(lcd_putc,"Temp: %02.1f \xDFF", ((temperatura * 1.8) + 32)); // Escreve no LCD Temperatura em Fahrenheit lcd_gotoxy(3,5); // Define o ponto de inicio da frase L3C5 printf(lcd_putc,"Temp: %02.1f \xDFK", temperatura + 273.15); // Escreve no LCD Temperatura em Kelvin lcd_gotoxy(4,5); // Define o ponto de inicio da frase L4C5 printf(lcd_putc,"Umid: %02.1f %c", umidade, 0x25); // Escreve no LCD Umidade em % } else { printf(lcd_putc, "\f"); // Limpa LCD lcd_gotoxy(2, 3); // Define o ponto de inicio da frase L2C3 printf(lcd_putc, "Checksum Error!"); // Escreve no LCD (Erro de paridade dos dados) } } } else { lcd_gotoxy(2, 3); // Define o ponto de inicio da frase L2C3 printf(lcd_putc, " No response "); // Escreve no LCD lcd_gotoxy(3, 3); // Define o ponto de inicio da frase L2C3 printf(lcd_putc, "from the sensor"); // Escreve no LCD } } }
  7. Mas tem sim, só pela foto dá para se ver os furinhos dos altos falantes de cada lado dos botões de controle. Meu monitor é o HP w17e ele possui entrada P2 de audio na parte de trás, porém eu não uso esse cabo, somente o VGA. Acabei de descobrir que o audio estava saindo de dentro do gabinete e como o monitor fica em cima deste, achei que estivesse saindo do monitor, esse computador é do meu serviço então não conheço as expecificações técnicas além de CPU e RAM.
  8. Só uso o Cabo D-Sub (VGA) e consigo escutar som pelo alto falante do monitor, isso sem nenhum cabo de audio conectado ao monitor! O monitor é o HP w17e, ele possui entrada P2 para audio mas nao uso nenhum cabo P2 no monitor, somente o VGA e o mesmo toca as musicas! Gostaria de entender como isso é possível pois até onde eu sei o Cabo D-Sub (Video Graphics Array) só transmite video. Especificações do Fabricante: http://support.hp.com/my-en/document/c00916920
  9. Waltronica http://www.waltronica.com.br Soldafria http://www.soldafria.com.br Pra mim são as melhores lojas de componentes de eletrônica.
  10. Estava há um bom tempo procurando uma maneira de desativar o touchpad em um Netbook pois toda hora que digitava no teclado, acidentalmente esbarrava nele, tirando o cursor fora do texto, e não há opção para desativa-lo do Gerenciador de Dispositivos, nem um botão no teclado para desliga-lo. Eu não obtive sucesso na busca, mas felizmente descobri uma maneira de fazer isso, uso um Netbook Positivo Mobo com Windows 7 32bits. Esses são os passos para desativar o touchpad: Ir em "C:\Windows\System32\drivers\" mover o arquivo "i8042prt.sys" para o Desktop, se der acesso negado, ir nas propriedades do arquivo e mudar as permissões para Controle Total. Reinicie a máquina, o teclado não estará funcionando, isso é normal, ir em Iniciar -> Painel de Controle -> Gerenciador de Dispositivos e DESATIVAR o Mouse PS/2(touchpad). Feito isso, ir em Iniciar -> Todos os Programas -> Acessórios -> Windows Explorer, ir em "C:\Windows\System32\drivers\" e devolver o aquivo "i8042prt.sys" que está no Desktop para a pasta de drivers. Reinicie a máquina e verá que o teclado voltou a responder e o Touchpad está desativado no Gerenciador de Dispositivos.

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...