Pregunta bien escrita: cuanta más información se proporcione como sea posible, gracias por su esfuerzo.
Esta parte de tu código está absolutamente bien.
const uint8_t ledPin = 13; // Digital output pin that has the on board LED
const uint8_t zeroPin = 2; // Digital input pin to which the zero crossing detector is connected
uint8_t zeroCounter = 0;
bool zeroState = 0;
bool ledState = 0;
void setup() {
Serial.begin(9600);
pinMode( ledPin , OUTPUT ); // Enable output driver for LED pin
pinMode( zeroPin , INPUT );
}
Esto no tanto.
void loop() {
Serial.println(digitalRead(zeroPin));
while ( digitalRead(zeroPin) == zeroState ) { // Wait for the state of the zero crossing detector to change
zeroState != zeroState;
zeroCounter++;
if ( zeroCounter == 50 ) { // Every 50 zero crossings change the LED state
Serial.println(zeroState);
ledState != ledState;
digitalWrite( ledPin , ledState );
zeroCounter = 0;
}
};
}
Limpié el formato para que el flujo de control sea más evidente.
-
Serial.println(digitalRead(zeroPin));
solo genera el estado del detector de cruce por cero cada vez que el bucle principal comienza nuevamente. No sé por qué haces esto, pero está bien.
- Los bucles de bloque
while ( digitalRead(zeroPin) == zeroState ) {...
siempre y cuando el pin de cruce por cero se lea como igual en valor a la variable estado cero. Como zeroState se establece en 0 al inicio del programa y luego nunca se modifica nuevamente, esto es equivalente a while ( digitalRead(zeroPin) == 0 ) {...
, que probablemente no sea su intención. Si digitalRead (zeroPin) siempre devuelve 1 cualquier cosa dentro del bucle while en realidad nunca se ejecuta.
-
zeroState != zeroState;
no hace nada útil. ! = es un operador relacional, no un operador "invertir y asignar". Si desea invertir el valor de zeroState de 0 a 1 y viceversa, desea escribir zeroState = !zeroState;
.
- El código de activación de led está bien, de nuevo con la excepción de
zeroState != zeroState;
, que no tiene sentido. Probablemente quieras zeroState = !zeroState;
- Finalmente, el punto y coma en
};
es superfluo, es el final del bloque while ( digitalRead(zeroPin) == zeroState ) {
. Mientras que los bucles solo los necesitan si omites el cuerpo del bucle, por ejemplo. while(condition);
¿Qué intenta lograr con la variable zeroState en general? ¿Estás intentando solo contar cada otro cruce por cero?
Mi opinión sobre el código:
const uint8_t ledPin = 13; // Digital output pin that has the on board LED
const uint8_t zeroPin = 2; // Digital input pin to which the zero crossing detector is connected
uint8_t zeroCounter = 0;
bool ledState = 0;
void setup() {
Serial.begin(9600);
pinMode( ledPin , OUTPUT ); // Enable output driver for LED pin
pinMode( zeroPin , INPUT );
}
void loop() {
while ( digitalRead(zeroPin) != 0 ); //wait until zeroPin is low, to make sure that the same zero crossing isn't detected multiple times.
while ( digitalRead(zeroPin) == 0 ); //wait until zeroPin is high, that's when a zero crossing occurs.
zeroCounter++;
if ( zeroCounter >= 50 ) { // Every 50 zero crossings change the LED state
zeroCounter = 0;
Serial.println("50 zero crossings have occurred and 500ms have passed.");
ledState = !ledState;
digitalWrite( ledPin , ledState );
}
}