Acelerómetro y transistor

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 una señal al microcontrolador.

  3. Cuando muevo el sensor y si el voltaje supera los 2V, el microcontrolador envía 1,5V 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 el multímetro digital, sigue mostrando 1,5 V incluso si no cambia la posición del sensor.

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

Respuestas (1)

No está utilizando la readingvariable en la instrucción if. Su instrucción if está verificando volts, y esto nunca cambia, siempre estará en 170 (cambiará a 77 durante algunos ciclos de reloj, luego volverá a 170).

Además, no debe declarar sus variables en el bucle. Y su retraso se establece en un segundo, no en 5. Debe agregar un retraso después 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
    }
}

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

  1. outputPin1poderes a ~ 3.3v
  2. lectura obtiene el valor deanalogPin
  3. 1 segundo de pausa
  4. si reading >= 100la potencia de salidaPin2 a ~ 1.5v de lo contrario 0v
  5. repetir

Para ser más eficiente, no necesita la variable voltsy reading. outputPin1no necesita estar en el bucle. También puse el retraso delante de usted analogRead(analogPin), por lo que su instrucción if se ejecuta inmediatamente después de la lectura, y al encenderse le da tiempo a su acelerómetro para encenderse. También eliminé el Serial.begin(9600);porque no lo estabas usando. Todo su código 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 referencia futura, debe usar la serie Serial.println("helpfull info");para ayudarlo a depurar su código. Echa un vistazo a este ejemplo. Cada vez que toma una lectura, transmite la lectura a la computadora para que pueda ver lo que está pasando.

Editar

Cargue esto y use una terminal en serie para ver qué sucede cuando mueve 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);
}
Gracias por su ayuda. Subí tu segundo código y lo probé. Parece que el acelerómetro está funcionando correctamente, lo que envía un voltaje diferente cuando cambio la posición, PERO cuando medí el voltaje de salidaPin2, Pin D5, sigue mostrando 1.5V incluso si cambio la dirección del sensor que tiene que mostrar 0V. ¿Significa que el microcontrolador no recibe la señal del acelerómetro correctamente o falta alguna parte en el código?
@ redcomet782 podría significar cosas diferentes. Lo primero que hay que probar sería cambiar analogRead(analogPin) >= 100a analogRead(analogPin) >= 50, o quizás bajar y ver qué pasa. Echa un vistazo a mi edición para obtener más ayuda.