Autor Thema: TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?  (Gelesen 3685 mal)

Offline Maui

  • Full Member
  • ***
  • Beiträge: 497
Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
« Antwort #15 am: 25 August 2018, 20:47:50 »
Danke dir. Endlich läuft es. Dein Modell hat echt noch optimierungsbedarf  ;)
Aber faul wie ich bin habe ich’s genommen und mit heisskleber nachgeholfen.
Jetzt mal die erste Nacht schauen, wie stabil es läuft. Aber bisher ziemlich gut.
Endlich kann ich da ein Haken hinter machen

Offline Maui

  • Full Member
  • ***
  • Beiträge: 497
Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
« Antwort #16 am: 26 August 2018, 11:46:54 »
So, nach der ersten Nacht kann ich sagen. Läuft super. Danke für deine Hilfe und den Code. Habe ihn fast 1:1 laufen, habe nur die Kalibrierung raus genommen und den Counter von 2 auf 4 gesetzt. Habe einen Zähler mit 75 Umdrehungen bis zur kWh und hab mal grob überschlagen. Im schlimmsten Fall bekomme ich nur 8 Signale mit red. Du hast ja einen 150er Zähler, also quasi das gleiche, da deiner doppelt so schnell dreht. Auch die Berechnungen habe ich von dir übernommen und angepasst. Ich bau mir jetzt noch eine für Standby (Strom nachts) und eine für den letzten Tag. Stelle ich dann noch hier rein, falls es mal wem hilft.
Bei mir ist zwar der Abstand zwischen rot und silber ziemlich klein, 8 gegen 12, aber dafür läuft es erstaunlich sauber.

Offline Dr.E.Witz

  • Jr. Member
  • **
  • Beiträge: 68
Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
« Antwort #17 am: 02 April 2019, 23:08:11 »
Hallo mal wieder.
Ich hatte die letzten Tage bissi mehr zu tun und konnte nicht mehr wirklich basteln geschweige denn mich melden.

Einen Schaltplan habe ich mal gezeichnet und auch meinen aktuellen Quellcode werde ich anhängen. Evtl. kann jemand etwas damit anfangen.
Ganz nach dem Motto "der Schuster hat die schlechtesten Schuhe" den Quellcode mit Bedacht einsetzen wobei es mittlerweile echt gut läuft ;)


SourceCode:


Hättest Du noch die verwendeten Bauteile?
Danke und Gruß,

Michael
#include "ESP8266WiFi.h"
#include <PubSubClient.h>

WiFiClient espClient;
PubSubClient client(espClient);



#define D0 16
#define D1 5 // I2C Bus SCL (clock)
#define D2 4 // I2C Bus SDA (data)
#define D3 0
#define D4 2 // Same as "LED_BUILTIN", but inverted logic
#define D5 14 // SPI Bus SCK (clock)
#define D6 12 // SPI Bus MISO
#define D7 13 // SPI Bus MOSI
#define D8 15 // SPI Bus SS (CS)
#define D9 3 // RX0 (Serial console)
#define D10 1 // TX0 (Serial console)



// WiFi parameters
const char* ssid = "SID";
const char* password = "HierKönnteIhrPasswortStehen";
const char* mqtt_server = "Zahlen oder Hostname";


const char* outTopicPower     = "MCU_STROM/CurrentPower";
const char* outTopicTrigger   = "MCU_STROM/Trigger";
const char* outTopicLight     = "MCU_STROM/LightValue";
const char* inTopicValueRed   = "MCU_STROM/ValueRed";
const char* inTopicValueSilver= "MCU_STROM/ValueSilver";
const char* inTopicDebugMode  = "MCU_STROM/DebugMode";


int sensorValue;


int sensorValueRed;
int sensorValueSilver;

int sensorValueAutoCalibrationCheckTimes = 50;

int sensorValueRedAutoCalibration = 0;
int sensorValueRedAutoCalibrationTimes = 0;

int sensorValueSilverAutoCalibration = 0;
int sensorValueSilverAutoCalibrationTimes = 0;


boolean oRedDetected = false;
boolean oDebugMode = false;

unsigned long timeStamp = 0;
unsigned long timeStampForCheck = 0;
unsigned long timeToCheck = 25;

int nBufferCountRed     = 0;
int nBufferCountSilver  = 0;
 
void setup ()
{
  Serial.begin (115200);

  sensorValueRed   = 58;
  sensorValueSilver  = 65;

  // Turn on LED for contrast
  pinMode(D1, OUTPUT);
  digitalWrite(D1, HIGH);

  Serial.println("Setup WiFi");
  setup_wifi();

  Serial.println("Setup Client");
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

  Serial.println("Setup done"); 
}

void loop ()
{
  if (!client.connected()) {
    reconnect();
  }
  client.loop(); 

  // read sensor every X milliseconds
  if (millis() - timeStampForCheck > timeToCheck)
  {
    timeStampForCheck = millis();
 
 
    // get value from sensor
    sensorValue = analogRead (A0);
 //   Serial.println (sensorValue, DEC);

    if (oDebugMode == true)
    {
      String sSensorValue = String(sensorValue);
      client.publish(outTopicLight, (char*)sSensorValue.c_str());
      Serial.println (sensorValue, DEC);
   }
 
    if (sensorValue <= sensorValueRed && oRedDetected == false)
    {
      if (nBufferCountRed >= 2)
      {
        oRedDetected = true;
   
        // set bufferCount to 0. Used to check before setting trigger to False.
        nBufferCountSilver = 0;
        nBufferCountRed = 0;
   
        // sent trigger value 1 to MQTT
        String sTriggerCount = "1";
        client.publish(outTopicTrigger, (char*)sTriggerCount.c_str());

        Serial.print("timeStamp: ");
        Serial.println(timeStamp);

       // start counting for energy
        if (timeStamp != 0)
        {
            unsigned long timeDiff = millis() - timeStamp;
            Serial.print ("timeDiff: ");
            Serial.println (timeDiff);
   
            float timeDiffSec = timeDiff / 1000;
   
            float energy = 0.006666 * (1/(timeDiffSec/3600));
            Serial.print ("energy in kW: ");
            Serial.println (energy);
   
            // get in Watt
            energy = energy * 1000;   
   
            String sCurrentPower = String(energy);
            client.publish(outTopicPower, (char*)sCurrentPower.c_str());

            // start auto calibration for red
            if (sensorValueRedAutoCalibrationTimes >= sensorValueAutoCalibrationCheckTimes)
            {
              Serial.print("use sensorValueRedAutoCalibration [");
              Serial.print(sensorValueRedAutoCalibration);
              Serial.print("] for red calculation divided by [");
              Serial.print(sensorValueAutoCalibrationCheckTimes);
              Serial.print("] and base value: ");
              Serial.println(sensorValueRed);
             
              // calculate new red value
              int sensorValueRedTemp = sensorValueRedAutoCalibration / sensorValueAutoCalibrationCheckTimes;
              if (sensorValueRedTemp < sensorValueSilver)
              {
                // check if the RED value is below Silver - otherwise it will not work ; )

               
                sensorValueRed = sensorValueRedTemp;
 
                // add buffer to actual value
                sensorValueRed = sensorValueRed + 3;
 
                sensorValueRedAutoCalibration = 0;
                     
                Serial.print("new calculated sensorValueRed: ");
                Serial.println(sensorValueRed);
                sensorValueRedAutoCalibrationTimes = 0;
               
                String sNewSensorValueRed = String(sensorValueRed);
                client.publish(inTopicValueRed, (char*)sNewSensorValueRed.c_str());                   
              }
              else
              {
                // cleanup values.
                sensorValueRedAutoCalibration = 0;
                sensorValueRedAutoCalibrationTimes = 0;
              }
         
            }
            else
            {
              // sum value to get average
              sensorValueRedAutoCalibration = sensorValueRedAutoCalibration + sensorValue;
              sensorValueRedAutoCalibrationTimes++;

              Serial.print("have now sensorValueRedAutoCalibration [");
              Serial.print(sensorValueRedAutoCalibration);
              Serial.print("] for the [ ");
              Serial.print(sensorValueRedAutoCalibrationTimes);
              Serial.print("] run for current sensor value: ");
              Serial.println(sensorValue);

            }
 
        }
   
        timeStamp = millis();
      }
      else
      {
        nBufferCountRed++;
      }

    }
    else if (sensorValue >= sensorValueSilver && oRedDetected == true)
    {
      // check 10 times before set trigger back to false
      if (nBufferCountSilver >= 5)
      {
        nBufferCountSilver = 0;
        nBufferCountRed = 0;
        oRedDetected = false;

        // start auto calibration for silver
        if (sensorValueSilverAutoCalibrationTimes >= sensorValueAutoCalibrationCheckTimes)
        {
          // calculate new red value
          Serial.print("use sensorValueSilverAutoCalibration [");
          Serial.print(sensorValueSilverAutoCalibration);
          Serial.print("] for silver calculation divided by [");
          Serial.print(sensorValueAutoCalibrationCheckTimes);
          Serial.print("] and base value: ");
          Serial.println(sensorValueSilver);

          int sensorValueSilverTemp = sensorValueSilverAutoCalibration / sensorValueAutoCalibrationCheckTimes;
          if (sensorValueSilverTemp > sensorValueRed)
          {
            // check if SILVER is above red value

            sensorValueSilver = sensorValueSilverTemp;
                           
            Serial.print("new calculated sensorValueSilver: ");
            Serial.println(sensorValueSilver);
            sensorValueSilverAutoCalibrationTimes = 0;

            // add buffer to actual value
            sensorValueSilver = sensorValueSilver - 3;
             
            sensorValueSilverAutoCalibration = 0;

            String sNewSensorValueSilver = String(sensorValueSilver);
            client.publish(inTopicValueSilver, (char*)sNewSensorValueSilver.c_str()); 
 
          }
          else
          {
            sensorValueSilverAutoCalibration = 0;
            sensorValueSilverAutoCalibrationTimes = 0;
          }
 
        }
        else
        {
          // sum value to get average
          sensorValueSilverAutoCalibration = sensorValueSilverAutoCalibration + sensorValue;
          sensorValueSilverAutoCalibrationTimes++;

          Serial.print("have now sensorValueSilverAutoCalibration [");
          Serial.print(sensorValueSilverAutoCalibration);
          Serial.print("] for the [ ");
          Serial.print(sensorValueSilverAutoCalibrationTimes);
          Serial.print("] run for current sensor value: ");
          Serial.println(sensorValue);
        }       
      }
      else
      {
        nBufferCountSilver++;
      }
     
    }

  }

}




void setup_wifi() {

  delay(50);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.hostname("ESP_STROM");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  delay(500);

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}


void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP_STROM")) {
      Serial.println("connected");

      client.subscribe(inTopicDebugMode);
      client.subscribe(inTopicValueRed);
      client.subscribe(inTopicValueSilver);
     
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 1,5 seconds");
      // Wait 5 seconds before retrying
      delay(1500);
    }
  }
}


void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");

  String sMessage = "";
  for (int i=0;i<length;i++) {
    Serial.print((char)payload[i]);
    sMessage += (char)payload[i];
  }
  Serial.println();

  if (strcmp (topic, inTopicValueRed) == 0 )
  {
    sensorValueRed = sMessage.toInt();
   
  }
  else if (strcmp (topic, inTopicValueSilver) == 0 )
  {
    sensorValueSilver = sMessage.toInt();
  }
  else if (strcmp (topic, inTopicDebugMode) == 0 )
  {
    oDebugMode = sMessage == "1";
    Serial.print("oDebugMode ");
    Serial.println(oDebugMode);
  }


 
}




fhem Code:

## define Stromzähler NodeMCU MQTT Device

define MCU_STROM MQTT_DEVICE
attr MCU_STROM subscribeReading_CurrentPower MCU_STROM/CurrentPower
attr MCU_STROM subscribeReading_Trigger MCU_STROM/Trigger
attr MCU_STROM subscribeReading_LightValue MCU_STROM/LightValue
attr MCU_STROM subscribeReading_ValueRed MCU_STROM/ValueRed
attr MCU_STROM subscribeReading_ValueSilver MCU_STROM/ValueSilver

attr MCU_STROM publishSet_DebugMode MCU_STROM/DebugMode
attr MCU_STROM publishSet_ValueRed MCU_STROM/ValueRed
attr MCU_STROM publishSet_ValueSilver MCU_STROM/ValueSilver



define MCU_STROM_DEBUG dummy
attr MCU_STROM_DEBUG webCmd state
attr MCU_STROM_DEBUG setList state:on,off
define N_MCU_STROM_DEBUG_OM notify MCU_STROM_DEBUG:on set MCU_STROM DebugMode 1
define N_MCU_STROM_DEBUG_OFF notify MCU_STROM_DEBUG:off set MCU_STROM DebugMode 0


Viel Spaß und viele Grüße ; )
Christian


*Edit - Bugfix in der Auto-Calibration der Helligkeit des Sensors für Rot/Silber...*

Offline huhu

  • Jr. Member
  • **
  • Beiträge: 76
Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
« Antwort #18 am: 25 Juni 2019, 08:41:08 »
Hallo zusammen,

ich verwende seit ein paar Wochen ebenfalls den TRCT5000 in Verbindung mit einem D1 Mini. Einbindung und Auswertung in FHEM funktioniert prima, leider funktioniert das Konstrukt immer nur wenige Tage, dann muss ich am Sensor die Empfindlichkeit neu justieren (Zähler wird meistens zu empfindlich und zählt dann auch Stellen die nicht rot markiert sind).

Anfangs dachte ich, es liegt am Klebeband welches sich immer wieder verschiebt. Das Gehäuse habe ich mittlerweile mit drei Heißklebepunkten fixiert und kann ausgeschlossen werden.

Kennt jemand vielleicht die Ursache? Den Sensor habe ich bereits getauscht, gleiches Ergebnis. Die Poti Einstellung habe ich nach einer justierung markiert, hier ändert sich zumindest optisch nichts, dennoch muss nachjustiert werden... Gibt es vielleicht noch bessere Sensoren?

Viele Grüße
huhu

Offline Maui

  • Full Member
  • ***
  • Beiträge: 497
Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
« Antwort #19 am: 25 Juni 2019, 10:27:31 »
Moin du brauchst doch nur den Thread hier durchlesen.
Zwar kein Fertig Sensor, aber funktioniert dafür bestens.

Gruß
Maui

Offline huhu

  • Jr. Member
  • **
  • Beiträge: 76
Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
« Antwort #20 am: 11 Juli 2019, 09:32:19 »
Hallo mal wieder.
Ich hatte die letzten Tage bissi mehr zu tun und konnte nicht mehr wirklich basteln geschweige denn mich melden.

Einen Schaltplan habe ich mal gezeichnet und auch meinen aktuellen Quellcode werde ich anhängen. Evtl. kann jemand etwas damit anfangen.
Ganz nach dem Motto "der Schuster hat die schlechtesten Schuhe" den Quellcode mit Bedacht einsetzen wobei es mittlerweile echt gut läuft ;)


SourceCode:

#include "ESP8266WiFi.h"
#include <PubSubClient.h>

WiFiClient espClient;
PubSubClient client(espClient);



#define D0 16
#define D1 5 // I2C Bus SCL (clock)
#define D2 4 // I2C Bus SDA (data)
#define D3 0
#define D4 2 // Same as "LED_BUILTIN", but inverted logic
#define D5 14 // SPI Bus SCK (clock)
#define D6 12 // SPI Bus MISO
#define D7 13 // SPI Bus MOSI
#define D8 15 // SPI Bus SS (CS)
#define D9 3 // RX0 (Serial console)
#define D10 1 // TX0 (Serial console)



// WiFi parameters
const char* ssid = "SID";
const char* password = "HierKönnteIhrPasswortStehen";
const char* mqtt_server = "Zahlen oder Hostname";


const char* outTopicPower     = "MCU_STROM/CurrentPower";
const char* outTopicTrigger   = "MCU_STROM/Trigger";
const char* outTopicLight     = "MCU_STROM/LightValue";
const char* inTopicValueRed   = "MCU_STROM/ValueRed";
const char* inTopicValueSilver= "MCU_STROM/ValueSilver";
const char* inTopicDebugMode  = "MCU_STROM/DebugMode";


int sensorValue;


int sensorValueRed;
int sensorValueSilver;

int sensorValueAutoCalibrationCheckTimes = 50;

int sensorValueRedAutoCalibration = 0;
int sensorValueRedAutoCalibrationTimes = 0;

int sensorValueSilverAutoCalibration = 0;
int sensorValueSilverAutoCalibrationTimes = 0;


boolean oRedDetected = false;
boolean oDebugMode = false;

unsigned long timeStamp = 0;
unsigned long timeStampForCheck = 0;
unsigned long timeToCheck = 25;

int nBufferCountRed     = 0;
int nBufferCountSilver  = 0;
 
void setup ()
{
  Serial.begin (115200);

  sensorValueRed   = 58;
  sensorValueSilver  = 65;

  // Turn on LED for contrast
  pinMode(D1, OUTPUT);
  digitalWrite(D1, HIGH);

  Serial.println("Setup WiFi");
  setup_wifi();

  Serial.println("Setup Client");
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

  Serial.println("Setup done"); 
}

void loop ()
{
  if (!client.connected()) {
    reconnect();
  }
  client.loop(); 

  // read sensor every X milliseconds
  if (millis() - timeStampForCheck > timeToCheck)
  {
    timeStampForCheck = millis();
 
 
    // get value from sensor
    sensorValue = analogRead (A0);
 //   Serial.println (sensorValue, DEC);

    if (oDebugMode == true)
    {
      String sSensorValue = String(sensorValue);
      client.publish(outTopicLight, (char*)sSensorValue.c_str());
      Serial.println (sensorValue, DEC);
   }
 
    if (sensorValue <= sensorValueRed && oRedDetected == false)
    {
      if (nBufferCountRed >= 2)
      {
        oRedDetected = true;
   
        // set bufferCount to 0. Used to check before setting trigger to False.
        nBufferCountSilver = 0;
        nBufferCountRed = 0;
   
        // sent trigger value 1 to MQTT
        String sTriggerCount = "1";
        client.publish(outTopicTrigger, (char*)sTriggerCount.c_str());

        Serial.print("timeStamp: ");
        Serial.println(timeStamp);

       // start counting for energy
        if (timeStamp != 0)
        {
            unsigned long timeDiff = millis() - timeStamp;
            Serial.print ("timeDiff: ");
            Serial.println (timeDiff);
   
            float timeDiffSec = timeDiff / 1000;
   
            float energy = 0.006666 * (1/(timeDiffSec/3600));
            Serial.print ("energy in kW: ");
            Serial.println (energy);
   
            // get in Watt
            energy = energy * 1000;   
   
            String sCurrentPower = String(energy);
            client.publish(outTopicPower, (char*)sCurrentPower.c_str());

            // start auto calibration for red
            if (sensorValueRedAutoCalibrationTimes >= sensorValueAutoCalibrationCheckTimes)
            {
              Serial.print("use sensorValueRedAutoCalibration [");
              Serial.print(sensorValueRedAutoCalibration);
              Serial.print("] for red calculation divided by [");
              Serial.print(sensorValueAutoCalibrationCheckTimes);
              Serial.print("] and base value: ");
              Serial.println(sensorValueRed);
             
              // calculate new red value
              int sensorValueRedTemp = sensorValueRedAutoCalibration / sensorValueAutoCalibrationCheckTimes;
              if (sensorValueRedTemp < sensorValueSilver)
              {
                // check if the RED value is below Silver - otherwise it will not work ; )

               
                sensorValueRed = sensorValueRedTemp;
 
                // add buffer to actual value
                sensorValueRed = sensorValueRed + 3;
 
                sensorValueRedAutoCalibration = 0;
                     
                Serial.print("new calculated sensorValueRed: ");
                Serial.println(sensorValueRed);
                sensorValueRedAutoCalibrationTimes = 0;
               
                String sNewSensorValueRed = String(sensorValueRed);
                client.publish(inTopicValueRed, (char*)sNewSensorValueRed.c_str());                   
              }
              else
              {
                // cleanup values.
                sensorValueRedAutoCalibration = 0;
                sensorValueRedAutoCalibrationTimes = 0;
              }
         
            }
            else
            {
              // sum value to get average
              sensorValueRedAutoCalibration = sensorValueRedAutoCalibration + sensorValue;
              sensorValueRedAutoCalibrationTimes++;

              Serial.print("have now sensorValueRedAutoCalibration [");
              Serial.print(sensorValueRedAutoCalibration);
              Serial.print("] for the [ ");
              Serial.print(sensorValueRedAutoCalibrationTimes);
              Serial.print("] run for current sensor value: ");
              Serial.println(sensorValue);

            }
 
        }
   
        timeStamp = millis();
      }
      else
      {
        nBufferCountRed++;
      }

    }
    else if (sensorValue >= sensorValueSilver && oRedDetected == true)
    {
      // check 10 times before set trigger back to false
      if (nBufferCountSilver >= 5)
      {
        nBufferCountSilver = 0;
        nBufferCountRed = 0;
        oRedDetected = false;

        // start auto calibration for silver
        if (sensorValueSilverAutoCalibrationTimes >= sensorValueAutoCalibrationCheckTimes)
        {
          // calculate new red value
          Serial.print("use sensorValueSilverAutoCalibration [");
          Serial.print(sensorValueSilverAutoCalibration);
          Serial.print("] for silver calculation divided by [");
          Serial.print(sensorValueAutoCalibrationCheckTimes);
          Serial.print("] and base value: ");
          Serial.println(sensorValueSilver);

          int sensorValueSilverTemp = sensorValueSilverAutoCalibration / sensorValueAutoCalibrationCheckTimes;
          if (sensorValueSilverTemp > sensorValueRed)
          {
            // check if SILVER is above red value

            sensorValueSilver = sensorValueSilverTemp;
                           
            Serial.print("new calculated sensorValueSilver: ");
            Serial.println(sensorValueSilver);
            sensorValueSilverAutoCalibrationTimes = 0;

            // add buffer to actual value
            sensorValueSilver = sensorValueSilver - 3;
             
            sensorValueSilverAutoCalibration = 0;

            String sNewSensorValueSilver = String(sensorValueSilver);
            client.publish(inTopicValueSilver, (char*)sNewSensorValueSilver.c_str()); 
 
          }
          else
          {
            sensorValueSilverAutoCalibration = 0;
            sensorValueSilverAutoCalibrationTimes = 0;
          }
 
        }
        else
        {
          // sum value to get average
          sensorValueSilverAutoCalibration = sensorValueSilverAutoCalibration + sensorValue;
          sensorValueSilverAutoCalibrationTimes++;

          Serial.print("have now sensorValueSilverAutoCalibration [");
          Serial.print(sensorValueSilverAutoCalibration);
          Serial.print("] for the [ ");
          Serial.print(sensorValueSilverAutoCalibrationTimes);
          Serial.print("] run for current sensor value: ");
          Serial.println(sensorValue);
        }       
      }
      else
      {
        nBufferCountSilver++;
      }
     
    }

  }

}




void setup_wifi() {

  delay(50);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.hostname("ESP_STROM");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  delay(500);

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}


void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP_STROM")) {
      Serial.println("connected");

      client.subscribe(inTopicDebugMode);
      client.subscribe(inTopicValueRed);
      client.subscribe(inTopicValueSilver);
     
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 1,5 seconds");
      // Wait 5 seconds before retrying
      delay(1500);
    }
  }
}


void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");

  String sMessage = "";
  for (int i=0;i<length;i++) {
    Serial.print((char)payload[i]);
    sMessage += (char)payload[i];
  }
  Serial.println();

  if (strcmp (topic, inTopicValueRed) == 0 )
  {
    sensorValueRed = sMessage.toInt();
   
  }
  else if (strcmp (topic, inTopicValueSilver) == 0 )
  {
    sensorValueSilver = sMessage.toInt();
  }
  else if (strcmp (topic, inTopicDebugMode) == 0 )
  {
    oDebugMode = sMessage == "1";
    Serial.print("oDebugMode ");
    Serial.println(oDebugMode);
  }


 
}




fhem Code:

## define Stromzähler NodeMCU MQTT Device

define MCU_STROM MQTT_DEVICE
attr MCU_STROM subscribeReading_CurrentPower MCU_STROM/CurrentPower
attr MCU_STROM subscribeReading_Trigger MCU_STROM/Trigger
attr MCU_STROM subscribeReading_LightValue MCU_STROM/LightValue
attr MCU_STROM subscribeReading_ValueRed MCU_STROM/ValueRed
attr MCU_STROM subscribeReading_ValueSilver MCU_STROM/ValueSilver

attr MCU_STROM publishSet_DebugMode MCU_STROM/DebugMode
attr MCU_STROM publishSet_ValueRed MCU_STROM/ValueRed
attr MCU_STROM publishSet_ValueSilver MCU_STROM/ValueSilver



define MCU_STROM_DEBUG dummy
attr MCU_STROM_DEBUG webCmd state
attr MCU_STROM_DEBUG setList state:on,off
define N_MCU_STROM_DEBUG_OM notify MCU_STROM_DEBUG:on set MCU_STROM DebugMode 1
define N_MCU_STROM_DEBUG_OFF notify MCU_STROM_DEBUG:off set MCU_STROM DebugMode 0


Viel Spaß und viele Grüße ; )
Christian


*Edit - Bugfix in der Auto-Calibration der Helligkeit des Sensors für Rot/Silber...*

Die Lösung scheint interessant, ich gebe es auf mit dem TRCT5000...
Welche Widerstände werden benötigt und wie hell sollte die grüne LED sein?

Viele Grüße
huhu

Offline Maui

  • Full Member
  • ***
  • Beiträge: 497
Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
« Antwort #21 am: 11 Juli 2019, 13:56:54 »
Die Lösung scheint interessant, ich gebe es auf mit dem TRCT5000...
Welche Widerstände werden benötigt und wie hell sollte die grüne LED sein?

Viele Grüße
huhu
Moin. Ich meine die Widerstände habe ich grob wie im Link unter #13 gewählt. LED sollte halt irgendwo bei 200-300 liegen.
Ich habe einfach eine ziemlich helle grüne von CONRAD damals genommen. So teuer sind die ja nicht und du stellst ja die Flanken selbst ein.
Ich würde einfach 1-2 kaufen und ausprobieren. (Bei Reichelt ist mEn immer noch Versand frei bei Bezahlung mit paydirekt)

Gruß
Maui

Offline PeMue

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4776
Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
« Antwort #22 am: 11 Juli 2019, 15:26:03 »
Bei Reichelt ist mEn immer noch Versand frei bei Bezahlung mit paydirekt.
stimmt, bis 17.07.

Gruß Peter
1x FB7170 (29.04.88) 5.7 1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F)
1x RPi BV2LCDCSM 1.63 5.7 2xMAX HKT, 1xMAX RT, V200KW1
1xFB 7490 (113.06.05) 5.7 1xCUL V3 1.63 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 1xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU 1xRFXtrx 90 1xWT440H 1xCM160 3xTFA30.3150 5xFA21

Offline huhu

  • Jr. Member
  • **
  • Beiträge: 76
Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
« Antwort #23 am: 12 Juli 2019, 12:58:54 »
Besten Dank!

LED und Fototransistor habe ich, allerdings bin ich mir unsicher welchen Widerstand ich brauche? Auf was muss ich achten, bzw wie kann ich errechnen welcher Widerstand passt?

Danke&Grüße
huhu

Offline Maui

  • Full Member
  • ***
  • Beiträge: 497
Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
« Antwort #24 am: 12 Juli 2019, 13:37:11 »
Moin. ich würde da keine Raketen Wissenschaft draus machen.
Die LED würde auch ohne Widerstand laufen aber nimm 200 oder 300.
und beim Transistor würde ich einfach wie erwähnt einen 100k Widerstand nehmen.
Ich denke bei der LED ist das halt nur als Vorwiderstand und beim Transistor ein Pull-Up der einfach gross sein muss.
Aber nagel mich nicht auf mein Halbwissen fest.

Offline huhu

  • Jr. Member
  • **
  • Beiträge: 76
Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
« Antwort #25 am: 12 Juli 2019, 14:59:17 »
Danke,
ich habe mal ein paar bestellt!
Benutzt du als Basis den TCRT5000 noch wie bei stall.biz beschrieben?
Funktioniert das ganze auch mit einem D1 Mini?
Mein aktuelles Setup in fhem (ElectricityCalculator) ist nicht mehr nutzbar?

Viele Grüße
huhu

Offline Maui

  • Full Member
  • ***
  • Beiträge: 497
Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
« Antwort #26 am: 12 Juli 2019, 15:39:58 »
ne ich nutze das mit D1 Mini.
klar in fhem brauchst nicht viel ändern nur ein neues device mit den passenden mqtt subscribes.
kannst weiterhin electr. calc. nehmen.

Offline huhu

  • Jr. Member
  • **
  • Beiträge: 76
Morgen Maui,
klingt gut, momentan ist ESPEasy auf dem D1 Mini. Kann man das Device über die GUI zusammenbauen, oder wäre es besser hier den Source Code zu verwenden?

Viele Grüße
huhu
« Letzte Änderung: Heute um 08:38:33 von huhu »

Offline Maui

  • Full Member
  • ***
  • Beiträge: 497
Das wirst du mit espEasy oder tasmota nicht hinbekommen.
Musst den Code aufspielen.

 

decade-submarginal