[SOLUCIONADO] Detectar corriente!

Hola a todos nuevamente, quería consultar su ayuda, tengo este código:

double Detectar;
unsigned long task_time_ms=0;

void setup()
{
Serial.begin(9600);
pinMode(2, INPUT);
  Detectar = 0;
}
void loop()
{

    if ((!digitalRead(2))) {
      Detectar = (Detectar + 1);
      if((millis()-task_time_ms)>=500){
        task_time_ms=millis();
        if ((Detectar < 40)) {
          Serial.println("Apagado"); //apagado

        }
        if ((Detectar > 40)) {
          Serial.println(String("Encendido")); //encendido
          Detectar = 0;

        }
      }
   }
}

con el que trato de detectar corriente en el pin 2, siguiendo las instrucciones de este video:

pero no logro que cuando esta apagado escriba "Apagado"..
ahora si conecto la corriente (220v, segun el esquema del video) si escribe en monitor "Encendido",
como puedo hacer para que funcione? que cuando lo apago también escriba en monitor "Apagado ???
gracias espero me puedan ayudar...

Any.

Probe con este código y funciona:

void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
pinMode(2, INPUT);
digitalWrite(13, HIGH);
//Detectar = 0;

}
void loop()
{
    if (digitalRead(2) == HIGH) {
          //Serial.println(String("Apagado"));
          Serial.println("Apagado"); 
    delay(100);
     }
    if (digitalRead(2) == LOW) {
          //Serial.println(String("Encendido"));
          Serial.println("Encendido");  
 delay(100);
 }
}

pero no estoy segura de que sea un buen código...el otro que puso en el primer post me parece mas adecuado, el tema que en el video del link funciona a la perfección, pero a mi no me funciona, la placa es la misma y todo lo demás también, no se porque no me anda..
nadie que me pueda dar una mano?

Vamos haber campeón:

Los datos de corriente alterna, al encender un Led, por ejemplo en este circuito:

Muy importante saber que el Led no está encendido cuando se funde un fusible, sino que se enciende y se apaga 50 veces por segundo. Parace que está encendido pero no es así, lo hacen tan rápido que para el ojo humano está encendido.

Hay que mirarlo bien en ese aspecto.

Hola Metaconta, primero de ultima campeona si queres, y si así fuera no preguntaría en el foro...
segundo, yo puse el link de video porque a el le funciona tal cual el código de mi primer post, lo que yo no entiendo es porque a mi no me funciona, y lo que no me funciona es la parte que debería escribir en monitor apagado, porque al activar la corriente si escribe en monitor Encendido...

¿Haz probado poner 115200 baudios en vez de 9600?

Los baudios están bien en 9600...

Consulto, podría ser que estoy usando un optoacoplador 4N35 que es de 1 solo led, y no uno de 2 leds como el que muestra el esquema del video? o eso no debería influir en la manera que se comporta el código?

Hola:

En cuantos lo baudios está bien o no eso depende para lo que lo quieras usar. en temas de velocidad de datos, cuanto más alta mejor. No en tu caso.

Si ha puesto para alterna con un solo Led, no servirá, te cargará dicho led, ya que no tiene por donde pasar la otra parte del semiciclo, en el cual intenta hacerlo por el mismo diodo, como no puede, se quemará.

Para pasiguar con un solo led, metes otro en paralelo como indica abajo, te puede valer un diodo rectificador como el 1N4007. Así no quemas el optoacoplador 4N35.

Solo hace el cruce por cero por cada 20 ms. No será igual, ya que solo incluye un Led. Mejor usar el H1AA1.

Funciona los dos Led.

Si quieres que funcione a 10 ms los ciclos, pues tienes que poner un puente rectificador tal como indica abajo.

Exactamente este aquí abajo.

Saludos.

A pesar de estar usando un opto H11AA1 sigue sin funcionar correctamente cuando se corta la energía..

con este código:

const int inputPin = 2;
 
int value = 0;
 
void setup() {
  Serial.begin(9600);
  pinMode(inputPin, INPUT_PULLUP);
}
 
void loop(){
  value = digitalRead(inputPin);
 
  
  if (value == HIGH) {
      Serial.println("Encendido");
  }
  else {
      Serial.println("Apagado");
  }
  delay(1000);
}

funciona, tanto el encendido como el apagado, aunque a veces mientras esta encendido, tira un par de apagados pero vuelve a encendido y sigue así sin mayores problemas...

aunque sigo sin entender porque no puedo hacerlo tal como el ejemplo del video que parece un código, que de funcionar, seria muy confiable..

Ya vas avanzando.

Como lo que vas a contar en la entrada es más rápido de lo que puedes hacer en un dedo o la mano en un pulsador una y otra vez, tienes que usar otro método.

attachInterrupt(0, rpm_fun, RISING); //habilitamos la interrupcion y seleccionamos la subida del pulso como accion.

Aquí los fundamentos de los contadores para que se tenga en cuenta.
http://materias.fi.uba.ar/6644/info/contadores/basico/contadores.pdf

Aquí indica un ejemplo de como hacerlo en la web oficial.

const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}

void loop() {
  digitalWrite(ledPin, state);
}

void blink() {
  state = !state;
}

Algo similar pero en español.

Espero que te haya servido de algo, al menos para tener ideas, así no ocurre cosas raras.

Saludos camarada.

Hola Metaconta, gracias lo voy a revisar..

Avisa y pon tu ejemplo de código que quiero verlo como curiosidad y demás visitantes.

El del vídeo usa un lenguaje tipo puzzles y no me convence.

Si algo ocurre cada 10 o 20 mseg para que pones un delay(1000) que detiene todo en tu código AnyPopins?

Solo debes hacer lo que Metaconta te esta diciendo.
Una interrupción que mira cada cruce por cero sea 10 o 20 mseg y con toda seguridad si las conexiones del H11AA1 estan bien hechas no habrá problemas.

Ahora lo importante es que hace tu interrupción y que verás en el loop.

Este código es una mezcla de lo que te sugiere Metaconta usando la interrupción y lo que tu querias

const byte ledPin       = 13;
const byte interruptPin =  2;
unsigned long task_time_ms;
volatile unsigned long Detectar;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), zeroCross, CHANGE);
}

void loop() {
  if ( millis()- task_time_ms >500 ){
      task_time_ms = millis();
      if (Detectar < 40) {
          Serial.println("Apagado"); //apagado
          digitalWrite(ledPin, LOW);
      }
      if ((Detectar > 40)) {
          Serial.println(String("Encendido")); //encendido
          digitalWrite(ledPin, HIGH);
          Detectar = 0;
      }
  }
} 

void zeroCross() {
  Detectar++;
}

Hola surbyte, genial como siempre,el código funciona perfecto..gracias tmb a Metaconta por su aporte..
se puede cerrar el tema, esta solucionado..

Felicidades.

Para que la gente lo sepan. Se recomienda poner en el título del post o tema principal esto:

[SOLUCIONADO] Detectar corriente!

Gracias ante todo.

ahí esta, pero en el titulo principal como hago?..saludos