Acelerómetro y Transistor

1

Aquí está mi programa, quiero:

  1. El microcontrolador, Arduino UNO R3 envía 3.3V al sensor, Acelerómetro, MMA7361

  2. El sensor se enciende y envía la señal al microcontrolador.

  3. Cuando muevo el sensor y si el voltaje llega a más de 2 V, el microcontrolador envía 1,5 V al Transistor. De lo contrario envíe 0V.

int outputPin1 = 3;   // Pin D3    
int outputPin2 = 5;  // Pin D5    
int analogPin = 0;  // Input Pin A0

void setup()    
{    
  pinMode (outputPin1, OUTPUT);   
  pinMode (outputPin2, OUTPUT);   
  Serial.begin(9600);   
}

void loop()    
{   
    int volts = 170; // send signals of 3.3v   
    analogWrite(outputPin1, volts);  // to Accelerometer   

    int reading = analogRead(analogPin);  //  receive signal
    delay(1000);    // delay 5sec.

    if (volts >= 100)    // Input voltage is more than 2.0V
    {
    int volts = 77; // send signals of 1.5V
    analogWrite(outputPin2, volts);  // to Transistor
    }
    else
      {
      int volts = 0;
      analogWrite(outputPin2, volts);  // to Transistor
      }
}

Cuando mido con un multímetro digital, sigue mostrando 1.5V aunque no cambia la posición del sensor.

Supongo que hay algún problema en la línea if, else.

    
pregunta redcomet782

1 respuesta

2

No está utilizando la variable reading en la sentencia if. Su declaración if está marcando volts , y esto nunca se cambia, siempre estará en 170 (cambiará a 77 durante algunos ciclos de reloj, luego volverá a 170.)

Tampoco debes declarar tus variables en el bucle. Y su retraso se establece en un segundo, no en 5. Debe agregar un retraso después de analogWrite(outputPin1, volts); para que el acelerómetro tenga tiempo de encenderse.

int outputPin1 = 3; // Pin D3
int outputPin2 = 5; // Pin D5
int analogPin = 0; // Input Pin A0
int volts = 170;
int reading = 0;    

void setup()
{
    pinMode (outputPin1, OUTPUT);
    pinMode (outputPin2, OUTPUT);
    Serial.begin(9600);
}

void loop()    
{   
    analogWrite(outputPin1, volts);  // send signals of 3.3v to Accelerometer   
    delay(200);    // delay .2 sec

    reading = analogRead(analogPin);  //  receive signal
    delay(1000);    // delay 1sec.

    if (reading >= 100)    // Input voltage is more than 2.0V
    {
        volts = 77; // send signals of 1.5V
        analogWrite(outputPin2, volts);  // to Transistor
    }
    else
    {
        volts = 0;
        analogWrite(outputPin2, volts);  // to Transistor
    }
}

Aquí está lo que el código está haciendo ahora (suponiendo que su matemática de voltaje es correcta):

  1. outputPin1 poderes a ~ 3.3v
  2. la lectura obtiene el valor de analogPin
  3. pausa de 1 segundo
  4. si reading >= 100 power outputPin2 a ~ 1.5v else 0v
  5. repetir

Para ser más eficiente, no necesita la variable volts y reading . outputPin1 no necesita estar en el bucle. También coloco la demora antes de que analogRead(analogPin) , por lo que su sentencia if se ejecuta inmediatamente después de la lectura, y al encenderla, le permite al acelerómetro acelerar su encendido. También quité el Serial.begin(9600); ya que no lo estabas usando. Tu código completo podría verse así:

int outputPin1 = 3; // Pin D3
int outputPin2 = 5; // Pin D5
int analogPin = 0; // Input Pin A0

void setup()
{
    pinMode (outputPin1, OUTPUT);
    pinMode (outputPin2, OUTPUT);
    analogWrite(outputPin1, 170);  // send signals of 3.3v to Accelerometer
}

void loop()    
{
    delay(1000);    // delay 1sec.

    if (analogRead(analogPin) >= 100)    // Input voltage is more than 2.0V
    {
        analogWrite(outputPin2, 77);  // send signals of 1.5V to Transistor
    }
    else
    {
        analogWrite(outputPin2, 0);  // 0v to Transistor
    }
}

Para futuras referencias, debe usar el serial Serial.println("helpfull info"); para ayudarlo a depurar su código. Eche un vistazo a este ejemplo . Cada vez que se realiza una lectura, se transmite la lectura a la computadora para que pueda ver lo que está pasando.

Editar

Sube esto y usa un terminal en serie para ver qué sucede cuando mueves el acelerómetro.

int analogPin = 0;
int value = 0;

void setup()
{
  Serial.begin(9600);          //  setup serial
}

void loop()
{
  value = analogRead(analogPin);    // read the input pin
  Serial.println(value);             // debug value
  delay(1000);
}
    
respondido por el Garrett Fogerlie

Lea otras preguntas en las etiquetas