Aquí está mi programa, quiero:
El microcontrolador, Arduino UNO R3 envía 3.3V al sensor, Acelerómetro, MMA7361
El sensor se enciende y envía una señal al microcontrolador.
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.
No está utilizando la reading
variable 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):
outputPin1
poderes a ~ 3.3vanalogPin
reading >= 100
la potencia de salidaPin2 a ~ 1.5v de lo contrario 0vPara ser más eficiente, no necesita la variable volts
y reading
. outputPin1
no 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);
}
usuario16741
garrett fogerlie
analogRead(analogPin) >= 100
aanalogRead(analogPin) >= 50
, o quizás bajar y ver qué pasa. Echa un vistazo a mi edición para obtener más ayuda.