Go Down

Topic: acionamento de Motor DC 12V por transistor não funciona com "DigitalWrite" (Read 325 times) previous topic - next topic

Thalysson_Hiago

Fiz um circuito com transistor e diodo para acionar um motor DC 12V através da resposta de um sensor analógico de gás MQ-2. Testei o programa simples abaixo e o motor funcionou bem.

int Pincooler = 8;
int PinA0 = A0;
 
int leitura_sensor = 30;
void setup() {
  pinMode(PinA0, INPUT);
  pinMode(Pincooler, OUTPUT);
  Serial.begin(9600);

}

void loop() {
  int valor_analogico = analogRead(PinA0);
Serial.print("Leitura: ");
Serial.println(valor_analogico);
 if (valor_analogico > leitura_sensor){
 Serial.print("Limpando ambiente contaminado\n");
  digitalWrite(Pincooler, HIGH);
 delay(10000);
 }else{
 digitalWrite(Pincooler, LOW);
 }
 delay(100);

}

Quando carreguei outro programa no arduino, com mais linhas de programação, porém com o mesmo princípio de acionamento do motor, ele não funciona. Dá apenas um "click", ou um "passo".

#define PIN_MQ2 (0)
#define RL (5)
#define FATOR_AR_LIMPO (9.62)
                                                     
#define ITERACOES_CALIBRACAO (50)   
#define ITERACOES_LEITURA (5)     

#define PinCooler  (8)

                                                 
                                                   
float CurvaFumaca[3] = {2.3,0.53,-0.44};   
                                         
float Ro = 10;
int Limiar_Acionamento = 5000;

void setup()
{
  Serial.begin(9600);                             
  Serial.print("Calibrando o sensor MQ2...\n");               
  Ro = Calibracao_Ro(PIN_MQ2);      //calibra o sensor MQ2                                 
  Serial.print("Finalizando a calibracao...\n");
  Serial.print("Calibracao concluida...\n");
  Serial.print("Valor de Ro=");
  Serial.print(Ro);
  Serial.print("kohm");
  Serial.print("\n");
}

void loop()
{
 
   float PPM = calculaPPMGas(leitura_MQ2(PIN_MQ2)/Ro,CurvaFumaca);   
   Serial.print("Concentracao de Fumaca:");
   Serial.print(PPM);
   Serial.print( "ppm    " );
   Serial.println("");
   
   if (PPM > Limiar_Acionamento){
     Serial.print("Ambiente contaminado\n");
     Serial.print("Limpando ambiente contaminado\n");
     digitalWrite(PinCooler, HIGH);
     delay(10000);
     }else{
     digitalWrite(PinCooler, LOW);
     }
   delay(100);
}

float calcularRSArLimpo(int tensao_bits)   //funcao que recebe o tensao (dado cru) e calcula a resistencia efetuada pelo sensor. O sensor e a resistência de carga forma um divisor de tensão.
{
  return (((float)RL*(1023-tensao_bits)/tensao_bits));
}

float Calibracao_Ro(int mq_pin)   
{
  int i;
  float valor=0;

  for (i=0;i<ITERACOES_CALIBRACAO;i++) {   
    valor += calcularRSArLimpo(analogRead(mq_pin));
    delay(500);
  }
  valor = valor/ITERACOES_CALIBRACAO;       

  valor = valor/FATOR_AR_LIMPO;
  return valor;
}

float leitura_MQ2(int mq_pin)
{
  int i;
  float rs=0;

  for (i=0;i<ITERACOES_LEITURA;i++) {
    rs += calcularRSArLimpo(analogRead(mq_pin));
    delay(50);
  }

  rs = rs/ITERACOES_LEITURA;

  return rs; 
}

   

 int  calculaPPMGas(float rs_ro, float *pcurve)
{
  return (pow(10,( ((log(rs_ro)-pcurve[1])/pcurve[2]) + pcurve[0])));
}

Onde vocês acham que está o erro?

bubulindo

E se tentasses fazer algo como... colocar Serial.print no teu código para entender o que se passa?

Aquele delay de 10 segundos diz-me que deveria andar pelo menos 10 segundos e não fazer um click.
Logo o próximo passo será saber como estás a alimentar o projecto e como tens tudo ligado.
This... is a hobby.

Go Up