Go Down

Topic: Mysensors Regenwassertank Sketch (Read 254 times) previous topic - next topic

Wuffi0815

Kann mir wer helfen? Ich habe 1-2 oder mehrere Fehler im Sketch.
Mein Pro mini hängt bzw die befehle von FHEM nimmt er nicht mehr an.
Serial ausgabe geht noch.

Code: [Select]
// Enable debug prints
#define MY_DEBUG
#define MY_NODE_ID 103

// Enable and select radio type attached
#define MY_RADIO_NRF24

#define MY_REPEATER_FEATURE

#include <SPI.h>
#include <MySensors.h> 
#include <NewPing.h>

#define CHILD_ID_V 2
#define CHILD_ID_D 3
#define TRIGGER_PIN  6  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     5  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 300 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

#define RELAY_PIN  4  // Arduino Digital I/O pin number for first relay
#define NUMBER_OF_RELAYS 1 // Total number of attached relays
#define RELAY_ON 1  // GPIO value to write to turn on attached relay
#define RELAY_OFF 0 // GPIO value to write to turn off attached relay

//constant to calculate the volume of the tank
#define high_water_level 230 //tank depth from the lowest point to the max water level
#define distance_sensor 10 //distance in cm between the max water level and the sensor
#define tank_volume 15000 //tank volume when it is fitted to the max water level
unsigned long SLEEP_TIME = 36000; // Sleep time between reads (in milliseconds)3600000 = 1h

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
MyMessage volume_msg(CHILD_ID_V, V_VOLUME);
MyMessage distance_msg(CHILD_ID_D, V_DISTANCE);
int lastDist;
bool metric = true;

void before()
{
    for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
        // Then set relay pins in output mode
        pinMode(pin, OUTPUT);
    }
}

void setup() 
{
  metric = getControllerConfig().isMetric;
}

void presentation()
{
  // Send the sketch version information to the gateway and Controller
  sendSketchInfo("Rain Water Tank", "1.0");

    for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
        // Register all sensors to gw (they will be created as child devices)
        present(sensor, S_BINARY);
    }
 
  // Register all sensors to gw (they will be created as child devices)
  present(CHILD_ID_V, S_WATER);
  present(CHILD_ID_D, S_DISTANCE);
}

void loop()     
{
  int dist = metric?sonar.ping_cm():sonar.ping_in();
  Serial.print("Volume ");
  Serial.print(tank_level("liters"));
  Serial.println("L");
  Serial.print("Ping: ");
  Serial.print(dist); // Convert ping time to distance in cm and print result (0 = outside set distance range)
  Serial.println(metric?" cm":" in");

  if (dist != lastDist) {
      send(distance_msg.set(dist));
      lastDist = dist;
  }

  send(volume_msg.set(tank_level("liters")));
  sleep(SLEEP_TIME);
}

void receive(const MyMessage &message)
{
    // We only expect one type of message from controller. But we better check anyway.
    if (message.type==V_STATUS) {
        // Change relay state
        digitalWrite(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF);
        // Store state in eeprom
        saveState(message.sensor, message.getBool());
        // Write some debug info
        Serial.print("Incoming change for sensor:");
        Serial.print(message.sensor);
        Serial.print(", New status: ");
        Serial.println(message.getBool());
    }
}

//function to measure and convert the tank volume
int tank_level(String unit)
{
  int level_liters = 0,level_percent = 0, echo_us = 0, echo_cm = 0, water_level_cm = 0;
  echo_us = sonar.ping_median(); //return the median time of 5measures between the ping and the echo in microseconds
  echo_cm = echo_us / US_ROUNDTRIP_CM; //convert the echo time to distance in cm.
  water_level_cm = high_water_level - (echo_cm - distance_sensor);
  level_liters = water_level_cm * ((tank_volume) / high_water_level);
  level_percent = (water_level_cm * 100) / high_water_level;
  if (unit == "liters")
  {
    return level_liters;
  }
  else if (unit == "percent")
  {
    return level_percent;
  }
  else
  {
    return 0;
  }
}

gregorss

Ich habe 1-2 oder mehrere Fehler im Sketch.
Kannst Du die Fehler eingrenzen? Lass Dir z. B. die Werte verschiedener Variablen auf der seriellen Schnittstelle ausgeben. Erscheinen beim Compilieren Fehlermeldungen oder Warnungen?

Ich würde erstmal alle #define-Sachen durch Variablen ersetzen. Der Präprozessor macht mit dem #define-Zeugs nur eine stupide Textersetzung. Dadurch wird die Typprüfung des Compilers umgangen.

Gruß

Gregor
Wenn man keine Probleme hat, kann man sich welche machen (Häuptling „Großes Lötauge" der M3-Hopi)
Ich mache mir Pizza.

HotSystems

Du solltest einfach nur die Tankauswertung für sich prüfen und erst mal alle "FHEM-Funktionen" entfernen.
Damit kannst du prüfen, ob der Fehler in der Auswertung liegt.

Was zeigt er denn in der seriellen Ausgabe an ?
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Wuffi0815

#3
Jan 14, 2018, 10:26 am Last Edit: Jan 14, 2018, 10:32 am by Wuffi0815
Die Tankauswertung läuft super hab ich schon eine im Öltank.
Das Relay läuft auch alleine.
Nur beim zusammenfügen habe ich irgendwas falsch gemacht. Hatte 2 fertige Sketches.

ich denke das mit was zu tun hat.
Code: [Select]
#define MY_REPEATER_FEATURE
Aber wenn ich die Output Pins extra angebe kann ich das Relay nicht ansteuern oder?

Serielle Ausgabe hat mal die Verbindung verloren. Nach neustart ging es wieder.
Aber wieso kann ich nicht sagen.

Gruß und Danke

HotSystems

Ok, da ich mich mit FHEM nicht auskenne, muss ich hier passen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Go Up