Optoisolator, ¿lo conecté bien? (Arduino Uno)

1

Aquí está mi conexión para el optoaislador,  2cables,amarilloyrojosonparacorrientealterna.Otros3enmiarduino,orangepin2,bluegroundandred5Vpower.

Ydiagrama.

Hojadedatosparaeloptoaislador: enlace

Estoy usando h11aa1 optoisolator.

Aquí está mi 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 zeroState = 0;
bool ledState = 0;

void setup() {
  Serial.begin(9600);
  pinMode( ledPin , OUTPUT );                       // Enable output driver for LED pin
  pinMode( zeroPin , INPUT );
}

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);
    digitalWrite( ledPin , ledState );
    zeroCounter = 0;
  }
  };
}

Siempre obtengo 1 para digitalRead(zeroPin) y debido a que Serial.println(zeroState) nunca se ejecutará ...

¿Alguien puede ayudarme a hacer que esto funcione?

    
pregunta Vladimir Djukic

3 respuestas

1

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 );
    }
}
    
respondido por el jms
2

¿Estás conectando un 10k entre 5V y el número de pin 5? Si no, puede haber dañado el optoaislador. El 10k es necesario para dar lugar a la caída de voltaje cuando se enciende el opto. También, como dijo jms, probablemente quieras hacer algo como zeroState =! ZeroState;

Si piensas en los pines 4 y amp; 5 del opto como interruptor, lo ideal sería que si atravesara el interruptor conduciría toda la tensión de 5 V a tierra. Ahora, si 5V era una fuente ideal, eso significa que I = V / R, I = 5V / 0, que es infinito. Ahora, en realidad, lo que está sucediendo es el interruptor cerrado y probablemente superó la disipación de potencia máxima del transistor en el opto, que en este caso es de 200 mW. Podría haberlo roto, podría no haberlo hecho. Simplemente verifíquelo con un voltímetro que tenga el modo diodo, el pin 5-4 debe tener aproximadamente 0.7V hacia adelante y hacia adelante o abierto con los cables invertidos, y el pin 5-6 tiene aproximadamente 0.7V y está abierto cuando los cables están invertidos. p>     

respondido por el VI_Spaghetti
1

Para saber si el circuito funciona, es bastante simple, simplemente no conecte CA, use un 5v de arduino y conecte un resistor en serie como 330 ohm, luego observe si algo cambia. No se han visto 10k y esos 33k monitores en el protoboard, ¿los has conectado? En segundo lugar, las resistencias de entrada 33k + 33k = 66k pueden ser muy elevadas: 230V * 1,41 = 325V pico, 325 / 66k = 4.9mA, no sé si la corriente directa es suficiente incluso en el voltaje máximo para cambiar el estado óptico.

    
respondido por el Marko Buršič

Lea otras preguntas en las etiquetas