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?