Ir ao conteúdo
  • Cadastre-se

Arduino Como utilizar Modulo VR3 (voice recognition) com bluetooth?


Posts recomendados

Olá boa tarde pessoal, estou desenvolvendo meu projeto de TCC, vai ser basicamente uma automação residencial controlada por voz e por bluetooth, programados no sentido de comando pai e comando filho por voz, e acionarem apenas os eletronicos por bluetooth, porém, me deparei com um problema que estou perdendo as esperanças já, não consigo conciliar o modulo de voz e o bluetooth para funcionarem simultâneamente, ele até compila e tal porém na hora de dar os comandos de voz ou bluetooth nenhum dos dois funciona. 

 

Placa Arduino MEGA 2560

Modulo de voz VR3 (Voice Recognition)

Modulo Bluetooth HC-06

//AUTOMAÇÃO RESIDENCIAL VIA BLUETOOTH E CONTROLE DE VOZ TCC 2020
#include <SoftwareSerial.h>
#include "VoiceRecognitionV3.h"

/**        
  Connection
  Arduino    VoiceRecognitionModule
   52   ------->     TX
   53   ------->     RX
*/


VR myVR(52,53);    // 52:RX 53:TX, you can choose your favourite pins.
SoftwareSerial bt_serial(50,51);//RX e TX BLUETOOTH

uint8_t records[7]; // save record
uint8_t buf[64];

// Leds indicadores de pais e filhos
int Led_Arduino = 13;
int Led_Ligar = 12;
int Led_Desligar = 11;
int Led_Lampada = 10;
int Led_TV = 9;
int Led_Portao = 8;

unsigned long tempo_limite;
unsigned long tempo_espera;


// Variaveis para armazenar o estado do comando reconhecido
boolean comando_Arduino = false;
boolean comando_Ligar = false;
boolean comando_Desligar = false;
boolean comando_Lampada = false;
boolean comando_TV = false;
boolean comando_Portao = false;

//COMANDO AVÔ
#define Arduino (0)  

//COMANDOS PAIS
#define Ligar (1) 
#define Desligar (2)

//COMANDOS FILHOS
#define Lampada (3) 
#define TV (4) 
#define Portao (5) 




void printSignature(uint8_t *buf, int len)
{
  int i;
  for(i=0; i<len; i++){
    if(buf[i]>0x19 && buf[i]<0x7F){
      Serial.write(buf[i]);
    }
    else{
      Serial.print("[");
      Serial.print(buf[i], HEX);
      Serial.print("]");
    }
  }
}

/**
  @brief   Print signature, if the character is invisible, 
           print hexible value instead.
  @param   buf  -->  VR module return value when voice is recognized.
             buf[0]  -->  Group mode(FF: None Group, 0x8n: User, 0x0n:System
             buf[1]  -->  number of record which is recognized. 
             buf[2]  -->  Recognizer index(position) value of the recognized record.
             buf[3]  -->  Signature length
             buf[4]~buf[n] --> Signature
*/
void printVR(uint8_t *buf)
{
  Serial.println("VR Index\tGroup\tRecordNum\tSignature");

  Serial.print(buf[2], DEC);
  Serial.print("\t\t");

  if(buf[0] == 0xFF){
    Serial.print("NONE");
  }
  else if(buf[0]&0x80){
    Serial.print("UG ");
    Serial.print(buf[0]&(~0x80), DEC);
  }
  else{
    Serial.print("SG ");
    Serial.print(buf[0], DEC);
  }
  Serial.print("\t");

  Serial.print(buf[1], DEC);
  Serial.print("\t\t");
  if(buf[3]>0){
    printSignature(buf+4, buf[3]);
  }
  else{
    Serial.print("NONE");
  }
  Serial.println("\r\n");
}

void setup()
{
  /** initialize */
  myVR.begin(9600);
  bt_serial.begin(9600);
  
  Serial.begin(9600);
  Serial.println("COMANDOS PAIS E FILHOS");
 

  // Declarar todos pinos como saída para os LEds
  pinMode(Led_Arduino, OUTPUT);
  pinMode(Led_Ligar, OUTPUT);
  pinMode(Led_Desligar, OUTPUT);
  pinMode(Led_Lampada, OUTPUT);
  pinMode(Led_TV, OUTPUT);
  pinMode(Led_Portao, OUTPUT);
    
  if(myVR.clear() == 0){
    Serial.println("Recognizer cleared.");
  }else{
    Serial.println("Not find VoiceRecognitionModule.");
    Serial.println("Please check connection and restart Arduino.");
    while(1);
  }

  //Carregar todos os comandos no VR3
  if(myVR.load((uint8_t)Arduino) >= 0){
    Serial.println("onRecord loaded");
  }
  
  if(myVR.load((uint8_t)Desligar) >= 0){
    Serial.println("offRecord loaded");
  }

  
  if(myVR.load((uint8_t)Ligar) >= 0){
    Serial.println("onRecord loaded");
  }
  
  if(myVR.load((uint8_t)Lampada) >= 0){
    Serial.println("offRecord loaded");
  }


 
  
  if(myVR.load((uint8_t)TV) >= 0){
    Serial.println("offRecord loaded");
  }

 if(myVR.load((uint8_t)Portao) >= 0){
    Serial.println("onRecord loaded");
  }
  
}

void loop()
{
  
  int ret;
  ret = myVR.recognize(buf, 50);
  
  if(ret>0){
    switch(buf[1]){
     // Verifica se o comando Arduino para iniciar o sistema foi reconhecido
      case Arduino:
      
            // Verifica se o sistema já está iniciado

            
            if(comando_Arduino==false){// COMANDO CASO MODULO DE VOZ DESLIGADO UTILIZA BLUETOOTH
    char c=bt_serial.read();
           if(c=='A'){digitalWrite(Led_Lampada,HIGH);}// LIga lampada BLuetooth
           if(c=='a'){digitalWrite(Led_Lampada,LOW);}

           if(c=='B'){digitalWrite(Led_TV,HIGH);}//Liga TV Bluetooth
           if(c=='b'){digitalWrite(Led_TV,LOW);}

           if(c=='C'){digitalWrite(Led_Portao,HIGH);}// Liga PORTAO bluetooth
           if(c=='c'){digitalWrite(Led_Portao,LOW);}
              
            comando_Arduino = true;
            tempo_limite = millis();
            Serial.println("Olá Mestre, o que você deseja?");
            // Ola mestre, o que você deseja? (áudio)  
            digitalWrite(Led_Arduino, HIGH);
                    
           }
           else{
            Serial.println("Já estou esperando suas ordens!");
            // Já estou esperando suas ordens (áudio)
             
           }
        
      break;
      
      case Ligar:
           if(comando_Arduino==true){
              comando_Ligar = true;
              comando_Desligar = false;
              Serial.println("Qual equipamento deseja ligar?");
              //Qual equipamento deseja acionar? áudio
              digitalWrite(Led_Ligar, HIGH);
              digitalWrite(Led_Desligar, LOW); 
              // Pois não senhor, o que deseja ligar?                    
           }
           
      break;

      case Desligar:
           if(comando_Arduino==true){
              comando_Ligar = false;
              comando_Desligar = true;
              Serial.println("Qual equipamento deseja desligar?");
              //Qual equipamento deseja desligar? áudio
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, HIGH); 
              // Pois não senhor, o que deseja ligar?                    
           }

      break;

      case Lampada:
      
      if(comando_Ligar==true){
              if(digitalRead(Led_Lampada)==HIGH){
                Serial.println("Lampada já está ligada");
                //Senhor a lampada já está ligada 
              }
              else{
              Serial.println("Ligando lampada...");  
              //Será um prazer atender  
              } 
              
              digitalWrite(Led_Lampada, HIGH); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);
                       
           }
      
      if(comando_Desligar==true){
              if(digitalRead(Led_Lampada)==LOW){
                Serial.println("Lampada já está desligada");
                //Senhor a lampada já está desligada 
              }
              else{
               Serial.println("Desligando lampada..."); 
              //Será um prazer atender  
              }
              digitalWrite(Led_Lampada, LOW); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);                  
           }
             
      break;

      case TV:
      if(comando_Ligar==true){
              if(digitalRead(Led_TV)==HIGH){
                //Senhor a TV já está ligada 
              }
              else{
              //Será um prazer atender  
              } 
              digitalWrite(Led_TV, HIGH); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);
                     
           }
      
      if(comando_Desligar==true){
              if(digitalRead(Led_TV)==LOW){
                //Senhor a TV já está desligada 
              }
              else{
              //Será um prazer atender  
              }
              digitalWrite(Led_TV, LOW); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);                  
           }
      break;

      case Portao:
      
      if(comando_Ligar==true){
        Serial.println("Abrir portao");
              digitalWrite(Led_Portao, HIGH); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);       
           }
      
      if(comando_Desligar==true){
              if(digitalRead(Led_Portao)==LOW){
                //Senhor a TV já está desligada 
              }
              else{
              //Será um prazer atender  
              }
              digitalWrite(Led_Portao, LOW); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);                  
           }
      break;


      default:
        Serial.println("Record function undefined");
        break;
  
    }
    /** voice recognized */
    printVR(buf);
  }

// Calcular tempo de espera sem resposta


if(comando_Arduino==true){
      tempo_espera = millis() - tempo_limite;
      if(tempo_espera > 8000){
        Serial.println("Tempo esgotado!");
        comando_Arduino = false;
        comando_Ligar = false;
        comando_Desligar = false;
        digitalWrite(Led_Arduino, LOW);
        digitalWrite(Led_Ligar, LOW);
        digitalWrite(Led_Desligar, LOW);
      }
  }



  
}

 

Caso alguém souber de alguma coisa por favor me ajude não sei o que está ocasionando o conflito.

 

 

 

Projeto TCC B1.txt

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@aphawk Tentei utilizar a opção de RX TX no para o módulo VR3, porém ele n está identificando e n funciona. No bluetooth funciona normal, porém acaba acontecendo algum tipo de conflito ao tentar usar os dois recursos em paralelo, não sei se é uma limitação do hardware ou se é algum problema no código.

Código com RX e TX no bluetooth 

//PROJETO DE TCC 
  
#include <SoftwareSerial.h>
#include "VoiceRecognitionV3.h"

/**        
  Connection
  Arduino    VoiceRecognitionModule
   52   ------->     TX
   53   ------->     RX
*/


VR myVR(52,53);    // 52:RX 53:TX, you can choose your favourite pins.

uint8_t records[7]; // save record
uint8_t buf[64];

// Leds indicadores de pais e filhos
int Led_Arduino = 13;
int Led_Ligar = 12;
int Led_Desligar = 11;
int Led_Lampada = 10;
int Led_TV = 9;
int Led_Portao = 8;

unsigned long tempo_limite;
unsigned long tempo_espera;


// Variaveis para armazenar o estado do comando reconhecido
boolean comando_Arduino = false;
boolean comando_Ligar = false;
boolean comando_Desligar = false;
boolean comando_Lampada = false;
boolean comando_TV = false;
boolean comando_Portao = false;

//COMANDO AVÔ
#define Arduino (0)  

//COMANDOS PAIS
#define Ligar (1) 
#define Desligar (2)

//COMANDOS FILHOS
#define Lampada (3) 
#define TV (4) 
#define Portao (5) 




void printSignature(uint8_t *buf, int len)
{
  int i;
  for(i=0; i<len; i++){
    if(buf[i]>0x19 && buf[i]<0x7F){
      Serial.write(buf[i]);
    }
    else{
      Serial.print("[");
      Serial.print(buf[i], HEX);
      Serial.print("]");
    }
  }
}

/**
  @brief   Print signature, if the character is invisible, 
           print hexible value instead.
  @param   buf  -->  VR module return value when voice is recognized.
             buf[0]  -->  Group mode(FF: None Group, 0x8n: User, 0x0n:System
             buf[1]  -->  number of record which is recognized. 
             buf[2]  -->  Recognizer index(position) value of the recognized record.
             buf[3]  -->  Signature length
             buf[4]~buf[n] --> Signature
*/
void printVR(uint8_t *buf)
{
  Serial.println("VR Index\tGroup\tRecordNum\tSignature");

  Serial.print(buf[2], DEC);
  Serial.print("\t\t");

  if(buf[0] == 0xFF){
    Serial.print("NONE");
  }
  else if(buf[0]&0x80){
    Serial.print("UG ");
    Serial.print(buf[0]&(~0x80), DEC);
  }
  else{
    Serial.print("SG ");
    Serial.print(buf[0], DEC);
  }
  Serial.print("\t");

  Serial.print(buf[1], DEC);
  Serial.print("\t\t");
  if(buf[3]>0){
    printSignature(buf+4, buf[3]);
  }
  else{
    Serial.print("NONE");
  }
  Serial.println("\r\n");
}

void setup()
{
  /** initialize */
  myVR.begin(9600);
  
  Serial.begin(9600);
  Serial.println("COMANDOS PAIS E FILHOS");
 

  // Declarar todos pinos como saída para os LEds
  pinMode(Led_Arduino, OUTPUT);
  pinMode(Led_Ligar, OUTPUT);
  pinMode(Led_Desligar, OUTPUT);
  pinMode(Led_Lampada, OUTPUT);
  pinMode(Led_TV, OUTPUT);
  pinMode(Led_Portao, OUTPUT);






    
    
  if(myVR.clear() == 0){
    Serial.println("Recognizer cleared.");
  }else{
    Serial.println("Not find VoiceRecognitionModule.");
    Serial.println("Please check connection and restart Arduino.");
    while(1);
  }

  //Carregar todos os comandos no VR3
  if(myVR.load((uint8_t)Arduino) >= 0){
    Serial.println("onRecord loaded");
  }
  
  if(myVR.load((uint8_t)Desligar) >= 0){
    Serial.println("offRecord loaded");
  }

  
  if(myVR.load((uint8_t)Ligar) >= 0){
    Serial.println("onRecord loaded");
  }
  
  if(myVR.load((uint8_t)Lampada) >= 0){
    Serial.println("offRecord loaded");
  }


 
  
  if(myVR.load((uint8_t)TV) >= 0){
    Serial.println("offRecord loaded");
  }

 if(myVR.load((uint8_t)Portao) >= 0){
    Serial.println("onRecord loaded");
  }
  
}

void loop()
{
  
  int ret;
  ret = myVR.recognize(buf, 50);
  
  if(ret>0){
    switch(buf[1]){
     // Verifica se o comando Arduino para iniciar o sistema foi reconhecido
      case Arduino:
      
            // Verifica se o sistema já está iniciado

            
            if(comando_Arduino==false){ 
              if(comando_Arduino==false){// COMANDO CASO MODULO DE VOZ DESLIGADO UTILIZA BLUETOOTH
    char c=Serial.read();
  if(c=='A'){digitalWrite(Led_Lampada,HIGH);}// LIga lampada BLuetooth
  if(c=='a'){digitalWrite(Led_Lampada,LOW);}

  if(c=='B'){digitalWrite(Led_TV,HIGH);}//Liga TV Bluetooth
  if(c=='b'){digitalWrite(Led_TV,LOW);}

  if(c=='C'){digitalWrite(Led_Portao,HIGH);}// Liga PORTAO bluetooth
  if(c=='c'){digitalWrite(Led_Portao,LOW);}
              } 
            comando_Arduino=true;{
            tempo_limite = millis();
            Serial.println("Olá Mestre, o que você deseja?");
            // Ola mestre, o que você deseja? (áudio)  
            digitalWrite(Led_Arduino, HIGH);
                    
           }}
           else{
            Serial.println("Já estou esperando suas ordens!");
            // Já estou esperando suas ordens (áudio)
             
           }
        
      break;
      
      case Ligar:
           if(comando_Arduino==true){
              comando_Ligar = true;
              comando_Desligar = false;
              Serial.println("Qual equipamento deseja ligar?");
              //Qual equipamento deseja acionar? áudio
              digitalWrite(Led_Ligar, HIGH);
              digitalWrite(Led_Desligar, LOW); 
              // Pois não senhor, o que deseja ligar?                    
           }
           
      break;

      case Desligar:
           if(comando_Arduino==true){
              comando_Ligar = false;
              comando_Desligar = true;
              Serial.println("Qual equipamento deseja desligar?");
              //Qual equipamento deseja desligar? áudio
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, HIGH); 
              // Pois não senhor, o que deseja ligar?                    
           }

      break;

      case Lampada:
      
      if(comando_Ligar==true){
              if(digitalRead(Led_Lampada)==HIGH){
                Serial.println("Lampada já está ligada");
                //Senhor a lampada já está ligada 
              }
              else{
              Serial.println("Ligando lampada...");  
              //Será um prazer atender  
              } 
              
              digitalWrite(Led_Lampada, HIGH); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);
                       
           }
      
      if(comando_Desligar==true){
              if(digitalRead(Led_Lampada)==LOW){
                Serial.println("Lampada já está desligada");
                //Senhor a lampada já está desligada 
              }
              else{
               Serial.println("Desligando lampada..."); 
              //Será um prazer atender  
              }
              digitalWrite(Led_Lampada, LOW); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);                  
           }
             
      break;

      case TV:
      if(comando_Ligar==true){
              if(digitalRead(Led_TV)==HIGH){
                //Senhor a TV já está ligada 
              }
              else{
              //Será um prazer atender  
              } 
              digitalWrite(Led_TV, HIGH); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);
                     
           }
      
      if(comando_Desligar==true){
              if(digitalRead(Led_TV)==LOW){
                //Senhor a TV já está desligada 
              }
              else{
              //Será um prazer atender  
              }
              digitalWrite(Led_TV, LOW); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);                  
           }
      break;

      case Portao:
      
      if(comando_Ligar==true){
        Serial.println("Abrir portao");
              digitalWrite(Led_Portao, HIGH); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);       
           }
      
      if(comando_Desligar==true){
              if(digitalRead(Led_Portao)==LOW){
                //Senhor a TV já está desligada 
              }
              else{
              //Será um prazer atender  
              }
              digitalWrite(Led_Portao, LOW); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);                  
           }
      break;


      default:
        Serial.println("Record function undefined");
        break;
  
    }
    /** voice recognized */
    printVR(buf);
  }

// Calcular tempo de espera sem resposta


if(comando_Arduino==true){
      tempo_espera = millis() - tempo_limite;
      if(tempo_espera > 8000){
        Serial.println("Tempo esgotado!");
        comando_Arduino = false;
        comando_Ligar = false;
        comando_Desligar = false;
        digitalWrite(Led_Arduino, LOW);
        digitalWrite(Led_Ligar, LOW);
        digitalWrite(Led_Desligar, LOW);
      }
  }

        
}

 

Link para o comentário
Compartilhar em outros sites

@Christian Branco ,

 

voce continuou usando a softserial.h , meu amigo, quando não precisa e na verdade complica no seu caso pois isso é feito por software e não foi feito para ter duas conversas seriais ao mesmo tempo; enquanto você está ocupado com uma delas pode estar perdendo dados na outra.

 

Veja aqui outras pessoas com o mesmo tipo de problema seu :

 

https://stackoverflow.com/questions/12463605/two-port-receive-using-software-serial-on-arduino

 

 

Porisso que te falei para usar as interfaces seriais por hardware, você não perde nada.....

 

Por acaso qual é a velocidade da comunicação serial com cada um dos seus periféricos ?

 

Não posso te ajudar nessa linguagem infelizmente, só posso dar palpites no hardware como um todo.

 

Mas sei que o que você precisa é algo deste tipo :

 

https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html

 

 

Paulo

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Permita-me corroborar Paulão. Nunca tive contato com os hw's em questão mas em linhas gerais me parece ser mais inteligente usar o hw do mc. O problema é que informação de como manipular isso não é facilmente encontrável na net. Meio hard se comparada à 'moleza' do soft.

 

Antes de apelar pra assembly, tenta consultar o datasheet do mc pra acessar seus registros em questão. Me lembro que fiz pra um atmega ou attiny algo como (pseudo código)
 

void tx(dado)
{
while(flag_transmitindo);//aguarda transmissão anterior...aqui calha um timeout...
byte_a_transmitir=dado;
}

tenho um google home mini que conversa com interruptor sonoff mas...

...bem joinha este módulo de voz...

Link para o comentário
Compartilhar em outros sites

@Isadora Ferraz ,

 

À vontade, minha cara e idosa companheira de Fórum !!!!

 

Em termos de hardware, existem 4 seriais independentes no Atmega2560, cada uma com um buffer de 1 byte , o único senão é que todas compartilham a mesma interrupção, mas é fácil isolar e tratar cada uma delas.

 

Existem bibliotecas para Arduino que já implementam esse tratamento, como a alt qqr coisa que postei acima .

 

Eu particularmente trato isso fácil no Bascom, ele prevê as seriais por hardware e implementa os famosos ring buffers independentes de até 255 bytes para cada serial, e separados para RX e TX também.

 

Mas não faço ideia como a IDE do Arduino trata isso ....


Paulo

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
15 horas atrás, aphawk disse:

Mas não faço ideia como a IDE do Arduino trata isso .

E eu menos ainda. Mas penso que pode fazer uma recepção 'na raça' . Mas não sem antes preparar o hw pra interrupt serial, claro.

Um tradicional minimalismo, algo como:

unsigned char i0,i1, buffer0[255],buffer1[255];
interrupt rxserial()
{
if (flag0) buffer0[i0++]=rxbuffer0; //flag:qual serial, rxbuffer registro que acabou de receber o dado
if (flag1) buffer1[i1++]=rxbuffer1;
//if (flagx) bufferx[ix++]=rxbufferx;
}

kichute hein...

 

Já o tx... te vira...

 

49 minutos atrás, Christian Branco disse:

perguntar pra algum professores meus também

...e pra tirar nota boa conosco também, publique sua solução. É disso que o forum se alimenta...

  • Haha 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!