Cómo amplificar la señal de un fototransistor TCRT5000

2

Estoy intentando leer la señal IR de mi medidor de potencia Itron C1S . Tiene un emisor que se ilumina durante 10 ms cada Wh de consumo.

Esta pregunta se basa en mi pregunta anterior: Use un fotoresistor para leer un LED IR de un medidor de energía Itron . He conectado el transistor

Lo conecté, pero nunca recibí ninguna respuesta ... parece que el Fototransistor no es lo suficientemente preciso ... ¿Hay alguna forma de amplificarlo?

aquí está mi conexión (tenga en cuenta que estoy usando el fototransistor TCRT5000 , no el de la imagen ):

micódigofuncionabienylaconexiónfuncionasicolocounreflectorenlapartesuperiordelemisor(¡ysiloconecto!).

Aquíestámicódigohastaahora:

#include<SPI.h>#include<Dhcp.h>#include<Dns.h>#include<Ethernet.h>#include<EthernetClient.h>#include<Temboo.h>#include"TembooAccount.h" // Contains Temboo account information

byte ethernetMACAddress[] = ETHERNET_SHIELD_MAC;
EthernetClient client;


// Energy meter ini
int inputPulse= 8;
int StateOld = 0;

int PowerMeterSimPin = 4;
int PowerMeterSimCounter = 0;
int PowerMeterSimCounterOn = 0;
boolean PowerMeterOnStatus = false;


boolean myState = false;

unsigned long diffTime_ms, startTime, p_w;






void setup() {
  Serial.begin(9600);

  // For debugging, wait until the serial console is connected.
  //delay(4000);
  //while(!Serial);
  /*
  Serial.print("DHCP:");
  if (Ethernet.begin(ethernetMACAddress) == 0) {
    Serial.println("FAIL");
    while(true);
  }
  Serial.println("OK");
  */
  delay(5000);


  pinMode(inputPulse,INPUT);
  pinMode(PowerMeterSimPin,OUTPUT);
  digitalWrite(PowerMeterSimPin, LOW);


  Serial.println("Setup complete.\n");
}

void loop() {


  int state = digitalRead(inputPulse);
  unsigned long now = millis();

  // simulate the power meter: 
  // each 5 sec, consume 1 Wh. 

  /*PowerMeterSimCounter++;

  if (PowerMeterSimCounter >= 5*1000){
    PowerMeterSimCounterOn = 0;
    PowerMeterSimCounter = 0;
    PowerMeterOnStatus = true;
    digitalWrite(PowerMeterSimPin, HIGH);
    Serial.println("Meter is on");

  }


  if (PowerMeterOnStatus){
    PowerMeterSimCounterOn++;
    if(PowerMeterSimCounterOn >= 10){
      PowerMeterSimCounterOn = 0;
      digitalWrite(PowerMeterSimPin, LOW);
      Serial.println("Meter is off");
      PowerMeterOnStatus = false;
    }
  }
  */
  diffTime_ms = now - startTime;

  // detect rising edge of IR detector
  if ((state == true) && (StateOld == false))
  {
    // new start Time
    startTime = now;
    StateOld = true;

    // we know the energy is 1Wh = 3600 Ws
    // calculate the power as p = E/dt
    p_w = 3600UL*1000UL/diffTime_ms;

    Serial.print("Time[ms]; ");
    Serial.println(diffTime_ms);
    Serial.print("Power[W]: ");
    Serial.println(p_w);
    Serial.print("Energy[Wh]: ");
    Serial.println(1);
    if (myState){
      digitalWrite(PowerMeterSimPin, LOW);
      myState = false;
    }else{
      digitalWrite(PowerMeterSimPin, HIGH);
      myState = true;
    }

    /*


      TembooChoreo CreateObjectChoreo(client);

      // Invoke the Temboo client
      CreateObjectChoreo.begin();

      // Set Temboo account credentials
      CreateObjectChoreo.setAccountName(TEMBOO_ACCOUNT);
      CreateObjectChoreo.setAppKeyName(TEMBOO_APP_KEY_NAME);
      CreateObjectChoreo.setAppKey(TEMBOO_APP_KEY);

      // Set profile to use for execution
      CreateObjectChoreo.setProfile("EnergyMeter");

      // Set Choreo inputs
      String ObjectContentsValue = "{\"value_Wh\":1}";
      CreateObjectChoreo.addInput("ObjectContents", ObjectContentsValue);

      // Identify the Choreo to run
      CreateObjectChoreo.setChoreo("/Library/Parse/Objects/CreateObject");

      // Run the Choreo; when results are available, print them to serial
      CreateObjectChoreo.run();

      while(CreateObjectChoreo.available()) {
        char c = CreateObjectChoreo.read();
        Serial.print(c);
      }
      CreateObjectChoreo.close();
    */
    // don't want to read short pulses as 3600*1000/100 = 36 kW


  }
  if ((diffTime_ms>100)&& (state == false))
    {
      StateOld = false;
    }
  delay(1);
}

(ten en cuenta que las cosas temboo están comentadas)

NOTA: De acuerdo con la Guía de referencia técnica de Itron, el medidor tiene un LED infrarrojo:

ACTUALIZACIÓN:segúnlorecomendadoportman,realicéunalecturaduranteunlargoperíododelvaloranalógicodelmedidor.Aquíestánlosresultados:

Como puedes ver, tenemos algún efecto del sol. Ignora eso. Como puede ver, la señal salta entre 1013 y 970 casi todo el tiempo (ruido) y algunas veces se reduce a alrededor de 870. No estoy seguro si esto es cuando el LED del medidor está encendido. Debería ser de 10 ms, y no estoy seguro de cuánto tiempo hay entre las mediciones (¿no debería ser de alrededor de 2 ms?). Mido con la misma configuración y este código:

#include <SD.h>
const int chipSelect = 4;
void setup()
{
  Serial.begin(9600);
  pinMode(10, OUTPUT);
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    return;
  }
}

void loop()
{
  String dataString = "";
   int sensor = analogRead(A0);
    dataString += String(sensor);
  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
  }  
  else {
    // do nothing
  } 
  delay(1);
}

¿Es correcto usar más de 1 fototransistor (conectado en paralelo) para amplificar la cantidad de luz captada?

    
pregunta otmezger

1 respuesta

2

Realmente he hecho esto antes, y he encontrado que un solo fototransistor no amplificado no es suficiente. Hice algunas mediciones de corrientes claras y oscuras y encontré el circuito que se muestra a continuación para producir una buena señal digital limpia (no usé un ADC). Tenga en cuenta que simplemente usé piezas que ya tenía en la mano, el uso de los transistores 2N2222 no es crítico.

simular este circuito : esquema creado usando CircuitLab

En mi caso particular, monté el fototransistor IR en la tapa de un bolígrafo barato y utilicé una ventosa para colocarlo temporalmente en la parte superior del medidor (por supuesto, debe tener cuidado de no dañarlo el metro). Uno puede simplemente acumular pulsos de Wh y calcular el uso de energía, por supuesto, pero también es posible medir el tiempo entre los pulsos y determinar la demanda (en vatios).

Una vez que esté todo ensamblado, se pueden verificar los cálculos usando una bombilla incandescente. Sucedió que tenía una bombilla de 100 vatios y, como no había nadie más en casa, noté la demanda con la bombilla apagada y luego la encendí nuevamente. En mi caso, hubo una diferencia de 100W, por lo que quedó claro que todo funcionaba como estaba diseñado.

    
respondido por el Edward

Lea otras preguntas en las etiquetas