RegenMENGENmessung gesucht

Entwicklung und Bau von Hardware aller Art, die im HM-Umfeld eingesetzt werden kann

Moderator: Co-Administratoren

HMSteve
Beiträge: 296
Registriert: 20.08.2019, 06:23
Hat sich bedankt: 7 Mal
Danksagung erhalten: 51 Mal

Re: RegenMENGENmessung gesucht

Beitrag von HMSteve » 23.09.2021, 20:27

EnricoL hat geschrieben:
23.09.2021, 17:13
Hallo Stephan,

danke für den Info und hin weiß!
Wenn alles gut geht, bekomme ich eine tmStamp Platine!
Da ist ja alles dran, an Sicherheit. :D


Muss mal ein paar Fragen, zu meiner Zeichnung fragen.
Was haben die für eine Aufgabe?
1: R4 - 10k
2: R1 - 100k
3: D2 - BAS358
4: T2 - Si 2365

Gruß Enrico
R4 und R2 sind pull-up Widerstaende, die sorgen fuer einen definierten High-Pegel der Eingangspins, solange die Eingaenge nicht durch die Schaltung davor explizit auf Low-Pegel gezogen werden.

R1 ist theoretisch unnoetig und kann praktisch auch im MOhm-Bereich liegen, sorgt praktisch fuer den Ausschluss „komischer Effekte“ bei offenem Gate, also dafuer, dass T2 sicher sperrt, wenn das Gate nicht durch D4 des Arduino auf Masse gezogen wird. Funktion also analog R4 und R2.

T2 schaltet die Betriebsspannung des CC1101 ab, wenn D4 des Arduino nicht auf Low liegt, dient dem BI-Schutz, da der CC1101 auch schon beim Dauersenden beobachtet wurde, wenn Arduino schon schlaeft.

D2 soll wohl eine parasitaere Speisung des CC1101 verhindern, ganz logisch finde ich das zwar nicht, die Diode ist aber in diversen Designs so zu finden und ich habe sie auch eingesetzt, kann jedoch vermutlich auch weggelassen werden.

Ansonsten nochmal der Tipp, hier im Selbstbau-Forum intensiv zu lesen. Gerade das Thema BI-Schutz ist schon viel diskutiert, da kann man sehr viel lernen.

Viele Gruesse,
Stephan

TomMajor
Beiträge: 1591
Registriert: 30.08.2017, 23:25
Hat sich bedankt: 147 Mal
Danksagung erhalten: 319 Mal
Kontaktdaten:

Re: RegenMENGENmessung gesucht

Beitrag von TomMajor » 23.09.2021, 22:35

Als Ergänzung zu D2:
das Teil ist bei bei einigen eQ-3 Geräten mit Batt.betrieb verbaut wenn dort der CC1101 abschaltbar ist.
Wurde u.a. von Jerome schon mal hier thematisiert.
Finale Klärung imho ohne Beitrag der eQ-3 Entwickler, die das verbockt entwickelt haben - schwierig.

Für die CC1101 Abschaltung ggf. interessant:
viewtopic.php?f=76&t=66483

ein paar Hinweise zur Beschaffung der Bauteile bei Jeromes/meinem Step-Up Board was auch für den MCP-111 gelten kann:
https://github.com/TomMajor/SmartHome/t ... nd-max1724
Viele Grüße,
Tom

EnricoL
Beiträge: 156
Registriert: 11.12.2017, 17:46
Hat sich bedankt: 4 Mal
Danksagung erhalten: 1 Mal

Re: RegenMENGENmessung gesucht

Beitrag von EnricoL » 24.09.2021, 07:37

Guten Morgen,

vielen Dank für die vielen Informationen und Aufklärung!

Wenn ich das langsam richtig versteh!
Sind die Nachbauten mit den Arduino Board und CC1101 Funkmodul. Baugleich wie die Geräte von eQ-3 mit Funk?

Gruß Enrico

EnricoL
Beiträge: 156
Registriert: 11.12.2017, 17:46
Hat sich bedankt: 4 Mal
Danksagung erhalten: 1 Mal

Re: RegenMENGENmessung gesucht

Beitrag von EnricoL » 11.10.2021, 17:17

Hallo,
ich habe den Sketch von HMSteve angepasst für die tmStamp!
Könnt ihr da mal rüber schauen, ob das so richtig ist.
Die Batterie Messung unter Last, ist ihr ja auch A0 und A1.
Der Taser, LED und der Regensensorgeber.
BUTTON_PIN 4
LED_PIN 3
RAIN_COUNTER_PIN 5

Code: Alles auswählen

//---------------------------------------------------------
// HB-UNI-SEN-RainCounter 2020-07-28 HMSteve (Stephan) 
// https://creativecommons.org/licenses/by-nc-sa/4.0/
// You are free to Share & Adapt under the following terms:
// Give Credit, NonCommercial, ShareAlike
// +++
// AskSin++ 2016-10-31 papa Creative Commons
// HB-UNI-Sensor1 2019-10-09 Tom Major (Creative Commons)
//---------------------------------------------------------

//---------------------------------------------------------
// !! NDEBUG sollte aktiviert werden wenn die Sensorentwicklung und die Tests abgeschlossen sind und das Gerät in den 'Produktionsmodus' geht.
// Insbesondere die RAM-Einsparungen sind wichtig für die Stabilität / dynamische Speicherzuweisungen etc.
// Dies beseitigt dann auch die mögliche Arduino-Warnung 'Low memory available, stability problems may occur'.
//
//#define NDEBUG

//---------------------------------------------------------
// define this to read the device id, serial and device type from bootloader section
// #define USE_OTA_BOOTLOADER

#define EI_NOTEXTERNAL
#include <EnableInterrupt.h>
#include <AskSinPP.h>
#include <LowPower.h>
#include <MultiChannelDevice.h>
#include <Register.h>
#include "Sensors/tmBattery.h"

//---------------------------------------------------------
// Alle Device Parameter werden aus einer .h Datei (hier im Beispiel Cfg/Device_Example.h) geholt um mehrere Geräte ohne weitere Änderungen des
// Sketches flashen zu können. Für mehrere Geräte einfach mehrere .h Dateien anlegen und dort die Unterschiede zwischen den Geräten definieren. Die
// konfigurierbaren Device Parameter in der .h Datei sind im Einzelnen:
// - Device ID und Device Serial
// - Aktivierung der verwendeten Sensoren
// - Pin Definitionen Allgemein
// - Pin und Address Definitionen der Sensoren
// - Clock Definition
// - Schaltungsvariante und Pins für Batteriespannungsmessung
// - Schwellwerte für Batteriespannungsmessung


// unique device radio ID and logic serial
#define cDEVICE_ID      { 0xF8, 0x21, 0x01 }
#define cDEVICE_SERIAL  "SGSENRNC01"


// pin definitions
#define CONFIG_BUTTON_PIN   4
#define LED_PIN             3
#define RAIN_COUNTER_PIN    5

// l/sqm per rain counter tick 
#define RAIN_COUNTER_SCALE  0.5

// Clock options
// CLOCK_SYSCLOCK: 8MHz Quarz an XTAL oder 8MHz int. RC-Oszillator, Sleep Strom ca. 4uA
// CLOCK_RTC:      8MHz int. RC-Oszillator, 32.768kHz Quarz an XTAL, Sleep Strom ca. 1uA
#define CLOCK_SYSCLOCK


// Schaltungsvariante und Pins für Batteriespannungsmessung, siehe README
// 1) Standard: tmBattery, UBatt = Betriebsspannung AVR: #define BAT_SENSOR tmBattery
// 2) für StepUp/StepDown: tmBatteryResDiv, sense pin A0, activation pin A1, Faktor = Rges/Rlow*1000, z.B. 470k/100k, Faktor 570k/100k*1000 = 5700: #define BAT_SENSOR tmBatteryResDiv<A0, A1, 5700>
// 3) Echte Batteriespannungsmessung unter Last: tmBatteryLoad: sense pin A0, activation pin D9, Faktor = Rges/Rlow*1000, z.B. 10/30 Ohm, Faktor 40/10*1000 = 4000, 200ms Belastung vor Messung: //#define BAT_SENSOR tmBatteryLoad<A0, 9, 4000, 200>
#define BAT_SENSOR tmBatteryLoad<A0, A2, 4000, 200>


// Schwellwerte für Batteriespannungsmessung
#define BAT_VOLT_LOW        18  // 1.8V
#define BAT_VOLT_CRITICAL   16  // 1.6V


// number of available peers per channel
#define PEERS_PER_CHANNEL 6


// all library classes are placed in the namespace 'as'
using namespace as;

volatile uint32_t _raincounter_isr_counter = 0;

void raincounterISR() {
  _raincounter_isr_counter++;
}

#ifdef CLOCK_SYSCLOCK
#define CLOCK sysclock
#define SAVEPWR_MODE Sleep<>
#elif defined CLOCK_RTC
#define CLOCK rtc
#define SAVEPWR_MODE SleepRTC
#undef seconds2ticks
#define seconds2ticks(tm) (tm)
#else
#error INVALID CLOCK OPTION
#endif

// define all device properties
const struct DeviceInfo PROGMEM devinfo = {
    cDEVICE_ID,        // Device ID
    cDEVICE_SERIAL,    // Device Serial
    { 0xF8, 0x21 },    // Device Model  // SG: changed for Rain counter. Unisensor1 is 0xF1, 0x03, need mechanism to avoid duplicates!!!
    // Firmware Version 
    // die CCU Addon xml Datei ist mit der Zeile <parameter index="9.0" size="1.0" cond_op="E" const_value="0x13" />
    // fest an diese Firmware Version gebunden! cond_op: E Equal, GE Greater or Equal
    // bei Änderungen von Payload, message layout, Datenpunkt-Typen usw. muss die Version an beiden Stellen hochgezogen werden!
    0x10,                        
    as::DeviceType::THSensor,    // Device Type
    { 0x01, 0x01 }               // Info Bytes
};

// Configure the used hardware
typedef AvrSPI<10, 11, 12, 13>                 SPIType;
typedef Radio<SPIType, 2>                      RadioType;
typedef StatusLed<LED_PIN>                     LedType;
typedef AskSin<LedType, BAT_SENSOR, RadioType> BaseHal;

class Hal : public BaseHal {
public:
    void init(const HMID& id)
    {
        BaseHal::init(id);
#ifdef CLOCK_RTC
        rtc.init();    // init real time clock - 1 tick per second
#endif
        // measure battery every 12h
        battery.init(seconds2ticks(12UL * 60 * 60), CLOCK); 
        battery.low(BAT_VOLT_LOW);
        battery.critical(BAT_VOLT_CRITICAL);
    }

    bool runready() { return CLOCK.runready() || BaseHal::runready(); }
} hal;

class WeatherEventMsg : public Message {
public:
    void init(uint8_t msgcnt, uint16_t rainCount, uint16_t batteryVoltage, bool batLow)
    {

        uint8_t bl = 0;
        if (batLow == true) {
            bl = 0x80;    // set bat low bit
        }

        // als Standard wird BCAST gesendet um Energie zu sparen, siehe Beschreibung unten.
        // Bei jeder 20. Nachricht senden wir stattdessen BIDI|WKMEUP, um eventuell anstehende Konfigurationsänderungen auch
        // ohne Betätigung des Anlerntaster übernehmen zu können (mit Verzögerung, worst-case 20x Sendeintervall).
        uint8_t flags = BCAST;
        if ((msgcnt % 20) == 1) {
            flags = BIDI | WKMEUP;
        }
        Message::init(15, msgcnt, 0x70, flags, bl, 0);

        // Message Length (first byte param.): 11 + payload
        //  1 Byte payload -> length 12
        // 12 Byte payload -> length 23
        // max. payload: 17 Bytes (https://www.youtube.com/watch?v=uAyzimU60jw)

        // BIDI|WKMEUP: erwartet ACK vom Empfänger, ohne ACK wird das Senden wiederholt
        // LazyConfig funktioniert, d.h. eine anstehende Conf.Änderung von der CCU wird nach dem nächsten Senden übernommen. Aber erhöhter
        // Funkverkehr wegen ACK
        //
        // BCAST: ohne ACK zu Erwarten, Standard für HM Sensoren.
        // LazyConfig funktioniert nicht, d.h. eine anstehende Conf.Änderung von der CCU muss durch den Config Button am Sensor übernommen
        // werden!!

        // papa:
        // BIDI - fordert den Empfänger auf ein Ack zu schicken. Das wird auch zwingend für AES-Handling gebraucht. BCAST - signalisiert
        // eine Broadcast-Message. Das wird z.B. verwendet, wenn mehrere Peers vor einen Sensor existieren. Es wird dann an einen Peer
        // gesndet und zusätzlich das BCAST-Flag gesetzt. So dass sich alle die Nachrricht ansehen. Ein Ack macht dann natürlich keinen Sinn
        // - es ist ja nicht klar, wer das senden soll.
        //
        // WKMEUP - wird für LazyConfig verwendet. Ist es in einer Message gesetzt, so weiss
        // die Zentrale, dass das Geräte noch kurz auf weitere Nachrichten wartet. Die Lib setzt diese Flag für die StatusInfo-Message
        // automatisch. Außerdem bleibt nach einer Kommunikation der Empfang grundsätzlich für 500ms angeschalten.

        // rain counter value
        pload[0] = (rainCount >> 8) & 0xff;
        pload[1] = rainCount & 0xff;
        
        // battery voltage
        pload[2] = (batteryVoltage >> 8) & 0xff;
        pload[3] = batteryVoltage & 0xff;
    }
};

// die "freien" Register 0x20/21 werden hier als 16bit memory für das Update
// Intervall in Sek. benutzt siehe auch hb-uni-sensor1.xml, <parameter
// id="Sendeintervall"> 
DEFREGISTER(Reg0, MASTERID_REGS, DREG_LEDMODE, DREG_LOWBATLIMIT, DREG_TRANSMITTRYMAX, 0x20, 0x21)
class SensorList0 : public RegList0<Reg0> {
public:
    SensorList0(uint16_t addr)
        : RegList0<Reg0>(addr)
    {
    }

    bool     updIntervall(uint16_t value) const { return this->writeRegister(0x20, (value >> 8) & 0xff) && this->writeRegister(0x21, value & 0xff); }
    uint16_t updIntervall() const { return (this->readRegister(0x20, 0) << 8) + this->readRegister(0x21, 0); }

    void defaults()
    {
        clear();
        ledMode(1);
        lowBatLimit(BAT_VOLT_LOW);
        transmitDevTryMax(6);
        updIntervall(10);
    }
};

class WeatherChannel : public Channel<Hal, List1, EmptyList, List4, PEERS_PER_CHANNEL, SensorList0>, public Alarm {

    WeatherEventMsg msg;

    uint16_t rainCount;
    uint16_t batteryVoltage;
    bool     regularWakeUp;


public:
    WeatherChannel()
        : Channel()
        , Alarm(seconds2ticks(60))
        , rainCount(0)
        , batteryVoltage(0)
        , regularWakeUp(true)
    {
    }
    virtual ~WeatherChannel() {}

    virtual void trigger(AlarmClock& clock)
    {
        measure();
        uint8_t msgcnt = device().nextcount();
        msg.init(msgcnt, rainCount, batteryVoltage, device().battery().low());
        if (msg.flags() & Message::BCAST) {
          device().broadcastEvent(msg, *this);
        }
        else
        {
          device().sendPeerEvent(msg, *this);
        }
         // reactivate for next measure
        uint16_t updCycle = this->device().getList0().updIntervall();
        set(seconds2ticks(updCycle));
        clock.add(*this);
        regularWakeUp = true;
    }

    void forceSend()
    {
        CLOCK.cancel(*this);
        regularWakeUp = false;    // Verhindert enableINT in trigger()
        trigger(CLOCK);           // Messen/Senden
        delay(250);               // Verzögerung für wiederholtes Senden bzw. digitalInput Entprellen
    }

    void measure(){
      // rain counter
       if ((uint32_t)((float)_raincounter_isr_counter * RAIN_COUNTER_SCALE * 10.0) > 0xFFFF) {
        _raincounter_isr_counter = 0;
       }
       rainCount = (uint16_t)(RAIN_COUNTER_SCALE * (float)_raincounter_isr_counter * 10);
       DPRINT(F("RAIN COUNTER     : ")); DDECLN(_raincounter_isr_counter);
       DPRINT(F("RAIN AMOUNT * 10 : ")); DDECLN(rainCount);
       
       // battery
       batteryVoltage = device().battery().current();    // BatteryTM class, mV resolution
    }

    void initSensors()
    {
       _raincounter_isr_counter = 0;
       DPRINTLN(F("Rain counter initilised."));
       DPRINT(F("Serial: "));
       DPRINTLN(cDEVICE_SERIAL);
    }

    void setup(Device<Hal, SensorList0>* dev, uint8_t number, uint16_t addr)
    {
        Channel::setup(dev, number, addr);
        initSensors();
        set(seconds2ticks(5));    // first message in 5 sec.
        CLOCK.add(*this);
    }

    void configChanged()
    {
        // DPRINTLN(F("Config changed: List1"));
    }

    uint8_t status() const { return 0; }

    uint8_t flags() const { return 0; }
};

class SensChannelDevice : public MultiChannelDevice<Hal, WeatherChannel, 1, SensorList0> {
public:
    typedef MultiChannelDevice<Hal, WeatherChannel, 1, SensorList0> TSDevice;
    SensChannelDevice(const DeviceInfo& info, uint16_t addr)
        : TSDevice(info, addr)
    {
    }
    virtual ~SensChannelDevice() {}

    virtual void configChanged()
    {
        TSDevice::configChanged();
        DPRINTLN(F("Config Changed: List0"));

        uint8_t ledMode = this->getList0().ledMode();
        DPRINT(F("ledMode: "));
        DDECLN(ledMode);

        uint8_t lowBatLimit = this->getList0().lowBatLimit();
        DPRINT(F("lowBatLimit: "));
        DDECLN(lowBatLimit);
        battery().low(lowBatLimit);

        uint8_t txDevTryMax = this->getList0().transmitDevTryMax();
        DPRINT(F("transmitDevTryMax: "));
        DDECLN(txDevTryMax);

        uint16_t updCycle = this->getList0().updIntervall();
        DPRINT(F("updCycle: "));
        DDECLN(updCycle);
    }
};

SensChannelDevice               sdev(devinfo, 0x20);
ConfigButton<SensChannelDevice> cfgBtn(sdev);

void setup()
{
    DINIT(57600, ASKSIN_PLUS_PLUS_IDENTIFIER);
    sdev.init(hal);
    buttonISR(cfgBtn, CONFIG_BUTTON_PIN);
    sdev.initDone();

    pinMode(RAIN_COUNTER_PIN, INPUT_PULLUP);
    if ( digitalPinToInterrupt(RAIN_COUNTER_PIN) == NOT_AN_INTERRUPT ) 
      enableInterrupt(RAIN_COUNTER_PIN, raincounterISR, FALLING); 
    else 
      attachInterrupt(digitalPinToInterrupt(RAIN_COUNTER_PIN), raincounterISR, FALLING);
     
}

void loop()
{
    bool worked = hal.runready();
    bool poll   = sdev.pollRadio();
    if (worked == false && poll == false) {
        // deep discharge protection
        // if we drop below critical battery level - switch off all and sleep forever
        if (hal.battery.critical()) {
            // this call will never return
            hal.activity.sleepForever(hal);
        }
        // if nothing to do - go sleep
        hal.activity.savePower<SAVEPWR_MODE>(hal);
    }
}
Wenn man auf Überprüfen geht, kommt ein Fehler Meldunmg!
HB-UNI-SEN-RainCounter.jpg
Gruß Enrico

HMSteve
Beiträge: 296
Registriert: 20.08.2019, 06:23
Hat sich bedankt: 7 Mal
Danksagung erhalten: 51 Mal

Re: RegenMENGENmessung gesucht

Beitrag von HMSteve » 11.10.2021, 18:25

Du musst zunächst die Bibliothek EnableInterrupt über die Arduino IDE einbinden.

Viele Grüße,
Stephan

jp112sdl
Beiträge: 9553
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 596 Mal
Danksagung erhalten: 1405 Mal
Kontaktdaten:

Re: RegenMENGENmessung gesucht

Beitrag von jp112sdl » 11.10.2021, 18:28

Und da du anschließend auf den nächsten Fehler laufen wirst, installier bitte die Low-Power Lib gleich mit.
Es muss unbedingt die von hier sein: https://github.com/rocketscream/Low-Power

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

PN sind deaktiviert!

EnricoL
Beiträge: 156
Registriert: 11.12.2017, 17:46
Hat sich bedankt: 4 Mal
Danksagung erhalten: 1 Mal

Re: RegenMENGENmessung gesucht

Beitrag von EnricoL » 11.10.2021, 20:21

Habe jetzt Arduino IDE Bibliothek dazu geführt!
EnableInterrupt
AskSinPP
LowPower
MultiChannelDevice und Register habe ich nicht gefunden! Google kommt dies raus?
https://github.com/pa-pa/AskSinPP/blob/ ... elDevice.h
https://github.com/pa-pa/AskSinPP/blob/ ... Register.h
Sind das die richtigen?
Wenn man die weg lässt, die beiden und wieder auf Prüfen geht!
Kommt Fehler Sensors/tmBattery.
Habe die Datei ihr gefunden!
https://github.com/HMSteve/HB-UNI-Sen-R ... er/Sensors
Wie kann man die mit in die Bibliothek bekommen?
Muss das nicht eine zip Datei sein und noch drin, .cpp, .txt, .h?

Gruß Enrico

HMSteve
Beiträge: 296
Registriert: 20.08.2019, 06:23
Hat sich bedankt: 7 Mal
Danksagung erhalten: 51 Mal

Re: RegenMENGENmessung gesucht

Beitrag von HMSteve » 11.10.2021, 20:37

MultiChannelDevice und Register sind Teil der AskSinPP und muessen nicht separat eingebunden werden.tmBattery muss in einem Verzeichnis Sensors unterhalb des Verzeichnisses liegen, in dem der eigentliche Sketch liegt. Also genau die Struktur in Github.

Viele Gruesse,
Stephan

EnricoL
Beiträge: 156
Registriert: 11.12.2017, 17:46
Hat sich bedankt: 4 Mal
Danksagung erhalten: 1 Mal

Re: RegenMENGENmessung gesucht

Beitrag von EnricoL » 12.10.2021, 16:27

Habe den tmBattery in die Arduino IDE Bibliothek rein bekommen.
Es kam aber noch mal zu ein Fehler mit tmBattery. Weil in der Seile wo #include "Sensors/tmBattery.h" seht im Sketch. Dahabe ich das Sensors/ weg gemacht und es läuft durch. Siehe Bild!
HB-UNI-SEN-RainCounter_1.jpg
Jetzt sollte doch der angepasste Sketch für das tmStamp Platine passen oder?

Code: Alles auswählen

//---------------------------------------------------------
// HB-UNI-SEN-RainCounter 2020-07-28 HMSteve (Stephan) 
// https://creativecommons.org/licenses/by-nc-sa/4.0/
// You are free to Share & Adapt under the following terms:
// Give Credit, NonCommercial, ShareAlike
// +++
// AskSin++ 2016-10-31 papa Creative Commons
// HB-UNI-Sensor1 2019-10-09 Tom Major (Creative Commons)
//---------------------------------------------------------

//---------------------------------------------------------
// !! NDEBUG sollte aktiviert werden wenn die Sensorentwicklung und die Tests abgeschlossen sind und das Gerät in den 'Produktionsmodus' geht.
// Insbesondere die RAM-Einsparungen sind wichtig für die Stabilität / dynamische Speicherzuweisungen etc.
// Dies beseitigt dann auch die mögliche Arduino-Warnung 'Low memory available, stability problems may occur'.
//
//#define NDEBUG

//---------------------------------------------------------
// define this to read the device id, serial and device type from bootloader section
// #define USE_OTA_BOOTLOADER

#define EI_NOTEXTERNAL
#include <EnableInterrupt.h>
#include <AskSinPP.h>
#include <LowPower.h>
#include <MultiChannelDevice.h>
#include <Register.h>
#include "tmBattery.h"

//---------------------------------------------------------
// Alle Device Parameter werden aus einer .h Datei (hier im Beispiel Cfg/Device_Example.h) geholt um mehrere Geräte ohne weitere Änderungen des
// Sketches flashen zu können. Für mehrere Geräte einfach mehrere .h Dateien anlegen und dort die Unterschiede zwischen den Geräten definieren. Die
// konfigurierbaren Device Parameter in der .h Datei sind im Einzelnen:
// - Device ID und Device Serial
// - Aktivierung der verwendeten Sensoren
// - Pin Definitionen Allgemein
// - Pin und Address Definitionen der Sensoren
// - Clock Definition
// - Schaltungsvariante und Pins für Batteriespannungsmessung
// - Schwellwerte für Batteriespannungsmessung


// unique device radio ID and logic serial
#define cDEVICE_ID      { 0xF8, 0x21, 0x01 }
#define cDEVICE_SERIAL  "SGSENRNC01"


// pin definitions
#define CONFIG_BUTTON_PIN   4
#define LED_PIN             3
#define RAIN_COUNTER_PIN    5

// l/sqm per rain counter tick 
#define RAIN_COUNTER_SCALE  0.5

// Clock options
// CLOCK_SYSCLOCK: 8MHz Quarz an XTAL oder 8MHz int. RC-Oszillator, Sleep Strom ca. 4uA
// CLOCK_RTC:      8MHz int. RC-Oszillator, 32.768kHz Quarz an XTAL, Sleep Strom ca. 1uA
#define CLOCK_SYSCLOCK


// Schaltungsvariante und Pins für Batteriespannungsmessung, siehe README
// 1) Standard: tmBattery, UBatt = Betriebsspannung AVR: #define BAT_SENSOR tmBattery
// 2) für StepUp/StepDown: tmBatteryResDiv, sense pin A0, activation pin A1, Faktor = Rges/Rlow*1000, z.B. 470k/100k, Faktor 570k/100k*1000 = 5700: #define BAT_SENSOR tmBatteryResDiv<A0, A1, 5700>
// 3) Echte Batteriespannungsmessung unter Last: tmBatteryLoad: sense pin A0, activation pin D9, Faktor = Rges/Rlow*1000, z.B. 10/30 Ohm, Faktor 40/10*1000 = 4000, 200ms Belastung vor Messung: //#define BAT_SENSOR tmBatteryLoad<A0, 9, 4000, 200>
#define BAT_SENSOR tmBatteryLoad<A0, A2, 4000, 200>


// Schwellwerte für Batteriespannungsmessung
#define BAT_VOLT_LOW        18  // 1.8V
#define BAT_VOLT_CRITICAL   16  // 1.6V


// number of available peers per channel
#define PEERS_PER_CHANNEL 6


// all library classes are placed in the namespace 'as'
using namespace as;

volatile uint32_t _raincounter_isr_counter = 0;

void raincounterISR() {
  _raincounter_isr_counter++;
}

#ifdef CLOCK_SYSCLOCK
#define CLOCK sysclock
#define SAVEPWR_MODE Sleep<>
#elif defined CLOCK_RTC
#define CLOCK rtc
#define SAVEPWR_MODE SleepRTC
#undef seconds2ticks
#define seconds2ticks(tm) (tm)
#else
#error INVALID CLOCK OPTION
#endif

// define all device properties
const struct DeviceInfo PROGMEM devinfo = {
    cDEVICE_ID,        // Device ID
    cDEVICE_SERIAL,    // Device Serial
    { 0xF8, 0x21 },    // Device Model  // SG: changed for Rain counter. Unisensor1 is 0xF1, 0x03, need mechanism to avoid duplicates!!!
    // Firmware Version 
    // die CCU Addon xml Datei ist mit der Zeile <parameter index="9.0" size="1.0" cond_op="E" const_value="0x13" />
    // fest an diese Firmware Version gebunden! cond_op: E Equal, GE Greater or Equal
    // bei Änderungen von Payload, message layout, Datenpunkt-Typen usw. muss die Version an beiden Stellen hochgezogen werden!
    0x10,                        
    as::DeviceType::THSensor,    // Device Type
    { 0x01, 0x01 }               // Info Bytes
};

// Configure the used hardware
typedef AvrSPI<10, 11, 12, 13>                 SPIType;
typedef Radio<SPIType, 2>                      RadioType;
typedef StatusLed<LED_PIN>                     LedType;
typedef AskSin<LedType, BAT_SENSOR, RadioType> BaseHal;

class Hal : public BaseHal {
public:
    void init(const HMID& id)
    {
        BaseHal::init(id);
#ifdef CLOCK_RTC
        rtc.init();    // init real time clock - 1 tick per second
#endif
        // measure battery every 12h
        battery.init(seconds2ticks(12UL * 60 * 60), CLOCK); 
        battery.low(BAT_VOLT_LOW);
        battery.critical(BAT_VOLT_CRITICAL);
    }

    bool runready() { return CLOCK.runready() || BaseHal::runready(); }
} hal;

class WeatherEventMsg : public Message {
public:
    void init(uint8_t msgcnt, uint16_t rainCount, uint16_t batteryVoltage, bool batLow)
    {

        uint8_t bl = 0;
        if (batLow == true) {
            bl = 0x80;    // set bat low bit
        }

        // als Standard wird BCAST gesendet um Energie zu sparen, siehe Beschreibung unten.
        // Bei jeder 20. Nachricht senden wir stattdessen BIDI|WKMEUP, um eventuell anstehende Konfigurationsänderungen auch
        // ohne Betätigung des Anlerntaster übernehmen zu können (mit Verzögerung, worst-case 20x Sendeintervall).
        uint8_t flags = BCAST;
        if ((msgcnt % 20) == 1) {
            flags = BIDI | WKMEUP;
        }
        Message::init(15, msgcnt, 0x70, flags, bl, 0);

        // Message Length (first byte param.): 11 + payload
        //  1 Byte payload -> length 12
        // 12 Byte payload -> length 23
        // max. payload: 17 Bytes (https://www.youtube.com/watch?v=uAyzimU60jw)

        // BIDI|WKMEUP: erwartet ACK vom Empfänger, ohne ACK wird das Senden wiederholt
        // LazyConfig funktioniert, d.h. eine anstehende Conf.Änderung von der CCU wird nach dem nächsten Senden übernommen. Aber erhöhter
        // Funkverkehr wegen ACK
        //
        // BCAST: ohne ACK zu Erwarten, Standard für HM Sensoren.
        // LazyConfig funktioniert nicht, d.h. eine anstehende Conf.Änderung von der CCU muss durch den Config Button am Sensor übernommen
        // werden!!

        // papa:
        // BIDI - fordert den Empfänger auf ein Ack zu schicken. Das wird auch zwingend für AES-Handling gebraucht. BCAST - signalisiert
        // eine Broadcast-Message. Das wird z.B. verwendet, wenn mehrere Peers vor einen Sensor existieren. Es wird dann an einen Peer
        // gesndet und zusätzlich das BCAST-Flag gesetzt. So dass sich alle die Nachrricht ansehen. Ein Ack macht dann natürlich keinen Sinn
        // - es ist ja nicht klar, wer das senden soll.
        //
        // WKMEUP - wird für LazyConfig verwendet. Ist es in einer Message gesetzt, so weiss
        // die Zentrale, dass das Geräte noch kurz auf weitere Nachrichten wartet. Die Lib setzt diese Flag für die StatusInfo-Message
        // automatisch. Außerdem bleibt nach einer Kommunikation der Empfang grundsätzlich für 500ms angeschalten.

        // rain counter value
        pload[0] = (rainCount >> 8) & 0xff;
        pload[1] = rainCount & 0xff;
        
        // battery voltage
        pload[2] = (batteryVoltage >> 8) & 0xff;
        pload[3] = batteryVoltage & 0xff;
    }
};

// die "freien" Register 0x20/21 werden hier als 16bit memory für das Update
// Intervall in Sek. benutzt siehe auch hb-uni-sensor1.xml, <parameter
// id="Sendeintervall"> 
DEFREGISTER(Reg0, MASTERID_REGS, DREG_LEDMODE, DREG_LOWBATLIMIT, DREG_TRANSMITTRYMAX, 0x20, 0x21)
class SensorList0 : public RegList0<Reg0> {
public:
    SensorList0(uint16_t addr)
        : RegList0<Reg0>(addr)
    {
    }

    bool     updIntervall(uint16_t value) const { return this->writeRegister(0x20, (value >> 8) & 0xff) && this->writeRegister(0x21, value & 0xff); }
    uint16_t updIntervall() const { return (this->readRegister(0x20, 0) << 8) + this->readRegister(0x21, 0); }

    void defaults()
    {
        clear();
        ledMode(1);
        lowBatLimit(BAT_VOLT_LOW);
        transmitDevTryMax(6);
        updIntervall(10);
    }
};

class WeatherChannel : public Channel<Hal, List1, EmptyList, List4, PEERS_PER_CHANNEL, SensorList0>, public Alarm {

    WeatherEventMsg msg;

    uint16_t rainCount;
    uint16_t batteryVoltage;
    bool     regularWakeUp;


public:
    WeatherChannel()
        : Channel()
        , Alarm(seconds2ticks(60))
        , rainCount(0)
        , batteryVoltage(0)
        , regularWakeUp(true)
    {
    }
    virtual ~WeatherChannel() {}

    virtual void trigger(AlarmClock& clock)
    {
        measure();
        uint8_t msgcnt = device().nextcount();
        msg.init(msgcnt, rainCount, batteryVoltage, device().battery().low());
        if (msg.flags() & Message::BCAST) {
          device().broadcastEvent(msg, *this);
        }
        else
        {
          device().sendPeerEvent(msg, *this);
        }
         // reactivate for next measure
        uint16_t updCycle = this->device().getList0().updIntervall();
        set(seconds2ticks(updCycle));
        clock.add(*this);
        regularWakeUp = true;
    }

    void forceSend()
    {
        CLOCK.cancel(*this);
        regularWakeUp = false;    // Verhindert enableINT in trigger()
        trigger(CLOCK);           // Messen/Senden
        delay(250);               // Verzögerung für wiederholtes Senden bzw. digitalInput Entprellen
    }

    void measure(){
      // rain counter
       if ((uint32_t)((float)_raincounter_isr_counter * RAIN_COUNTER_SCALE * 10.0) > 0xFFFF) {
        _raincounter_isr_counter = 0;
       }
       rainCount = (uint16_t)(RAIN_COUNTER_SCALE * (float)_raincounter_isr_counter * 10);
       DPRINT(F("RAIN COUNTER     : ")); DDECLN(_raincounter_isr_counter);
       DPRINT(F("RAIN AMOUNT * 10 : ")); DDECLN(rainCount);
       
       // battery
       batteryVoltage = device().battery().current();    // BatteryTM class, mV resolution
    }

    void initSensors()
    {
       _raincounter_isr_counter = 0;
       DPRINTLN(F("Rain counter initilised."));
       DPRINT(F("Serial: "));
       DPRINTLN(cDEVICE_SERIAL);
    }

    void setup(Device<Hal, SensorList0>* dev, uint8_t number, uint16_t addr)
    {
        Channel::setup(dev, number, addr);
        initSensors();
        set(seconds2ticks(5));    // first message in 5 sec.
        CLOCK.add(*this);
    }

    void configChanged()
    {
        // DPRINTLN(F("Config changed: List1"));
    }

    uint8_t status() const { return 0; }

    uint8_t flags() const { return 0; }
};

class SensChannelDevice : public MultiChannelDevice<Hal, WeatherChannel, 1, SensorList0> {
public:
    typedef MultiChannelDevice<Hal, WeatherChannel, 1, SensorList0> TSDevice;
    SensChannelDevice(const DeviceInfo& info, uint16_t addr)
        : TSDevice(info, addr)
    {
    }
    virtual ~SensChannelDevice() {}

    virtual void configChanged()
    {
        TSDevice::configChanged();
        DPRINTLN(F("Config Changed: List0"));

        uint8_t ledMode = this->getList0().ledMode();
        DPRINT(F("ledMode: "));
        DDECLN(ledMode);

        uint8_t lowBatLimit = this->getList0().lowBatLimit();
        DPRINT(F("lowBatLimit: "));
        DDECLN(lowBatLimit);
        battery().low(lowBatLimit);

        uint8_t txDevTryMax = this->getList0().transmitDevTryMax();
        DPRINT(F("transmitDevTryMax: "));
        DDECLN(txDevTryMax);

        uint16_t updCycle = this->getList0().updIntervall();
        DPRINT(F("updCycle: "));
        DDECLN(updCycle);
    }
};

SensChannelDevice               sdev(devinfo, 0x20);
ConfigButton<SensChannelDevice> cfgBtn(sdev);

void setup()
{
    DINIT(57600, ASKSIN_PLUS_PLUS_IDENTIFIER);
    sdev.init(hal);
    buttonISR(cfgBtn, CONFIG_BUTTON_PIN);
    sdev.initDone();

    pinMode(RAIN_COUNTER_PIN, INPUT_PULLUP);
    if ( digitalPinToInterrupt(RAIN_COUNTER_PIN) == NOT_AN_INTERRUPT ) 
      enableInterrupt(RAIN_COUNTER_PIN, raincounterISR, FALLING); 
    else 
      attachInterrupt(digitalPinToInterrupt(RAIN_COUNTER_PIN), raincounterISR, FALLING);
     
}

void loop()
{
    bool worked = hal.runready();
    bool poll   = sdev.pollRadio();
    if (worked == false && poll == false) {
        // deep discharge protection
        // if we drop below critical battery level - switch off all and sleep forever
        if (hal.battery.critical()) {
            // this call will never return
            hal.activity.sleepForever(hal);
        }
        // if nothing to do - go sleep
        hal.activity.savePower<SAVEPWR_MODE>(hal);
    }
}
Gruß Enrico

EnricoL
Beiträge: 156
Registriert: 11.12.2017, 17:46
Hat sich bedankt: 4 Mal
Danksagung erhalten: 1 Mal

Re: RegenMENGENmessung gesucht

Beitrag von EnricoL » 15.10.2021, 20:37

Hallo,

habe den Arduino pro mini das Sketch hochgeladen aber mit den USB ISP-Programmer!
Mit den FTDI Adapter habe ich es nicht hinbekommen und es kam Verbindunsfehler.

Code: Alles auswählen

C:\Program Files (x86)\Arduino\arduino-builder -dump-prefs -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries D:\Eigene Dateien\Dokumente\Arduino\libraries -fqbn=arduino:avr:pro:cpu=8MHzatmega328 -vid-pid=16C0_2A9B -ide-version=10816 -build-path D:\Temp\arduino_build_835024 -warnings=none -build-cache D:\Temp\arduino_cache_437741 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -verbose D:\Rechner_Driver_Asus\RaspberryMatic\RegenMENGENmessung_selber_bau\HB-UNI-Sen-RainCounter-master\HB-UNI-Sen-RainCounter_Test\HB-UNI-Sen-RainCounter\HB-UNI-Sen-RainCounter.ino
C:\Program Files (x86)\Arduino\arduino-builder -compile -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries D:\Eigene Dateien\Dokumente\Arduino\libraries -fqbn=arduino:avr:pro:cpu=8MHzatmega328 -vid-pid=16C0_2A9B -ide-version=10816 -build-path D:\Temp\arduino_build_835024 -warnings=none -build-cache D:\Temp\arduino_cache_437741 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -verbose D:\Rechner_Driver_Asus\RaspberryMatic\RegenMENGENmessung_selber_bau\HB-UNI-Sen-RainCounter-master\HB-UNI-Sen-RainCounter_Test\HB-UNI-Sen-RainCounter\HB-UNI-Sen-RainCounter.ino
Using board 'pro' from platform in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr
Using core 'arduino' from platform in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr
Detecting libraries used...
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=8000000L -DARDUINO=10816 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\eightanaloginputs" "D:\\Temp\\arduino_build_835024\\sketch\\HB-UNI-Sen-RainCounter.ino.cpp" -o nul
Alternatives for EnableInterrupt.h: [EnableInterrupt@1.1.0]
ResolveLibrary(EnableInterrupt.h)
  -> candidates: [EnableInterrupt@1.1.0]
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=8000000L -DARDUINO=10816 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\eightanaloginputs" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\EnableInterrupt" "D:\\Temp\\arduino_build_835024\\sketch\\HB-UNI-Sen-RainCounter.ino.cpp" -o nul
Alternatives for AskSinPP.h: [AskSinPP@5.0.0]
ResolveLibrary(AskSinPP.h)
  -> candidates: [AskSinPP@5.0.0]
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=8000000L -DARDUINO=10816 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\eightanaloginputs" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\EnableInterrupt" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\AskSinPP" "D:\\Temp\\arduino_build_835024\\sketch\\HB-UNI-Sen-RainCounter.ino.cpp" -o nul
Alternatives for LowPower.h: [Low-Power-master@1.81]
ResolveLibrary(LowPower.h)
  -> candidates: [Low-Power-master@1.81]
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=8000000L -DARDUINO=10816 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\eightanaloginputs" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\EnableInterrupt" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\AskSinPP" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\Low-Power-master" "D:\\Temp\\arduino_build_835024\\sketch\\HB-UNI-Sen-RainCounter.ino.cpp" -o nul
Alternatives for tmBattery.h: [tmBattery]
ResolveLibrary(tmBattery.h)
  -> candidates: [tmBattery]
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=8000000L -DARDUINO=10816 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\eightanaloginputs" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\EnableInterrupt" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\AskSinPP" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\Low-Power-master" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\tmBattery" "D:\\Temp\\arduino_build_835024\\sketch\\HB-UNI-Sen-RainCounter.ino.cpp" -o nul
Using cached library dependencies for file: D:\Eigene Dateien\Dokumente\Arduino\libraries\AskSinPP\AlarmClock.cpp
Using cached library dependencies for file: D:\Eigene Dateien\Dokumente\Arduino\libraries\AskSinPP\Globals.cpp
Using cached library dependencies for file: D:\Eigene Dateien\Dokumente\Arduino\libraries\AskSinPP\HMID.cpp
Using cached library dependencies for file: D:\Eigene Dateien\Dokumente\Arduino\libraries\AskSinPP\Led.cpp
Using cached library dependencies for file: D:\Eigene Dateien\Dokumente\Arduino\libraries\AskSinPP\PhaseCut.cpp
Using cached library dependencies for file: D:\Eigene Dateien\Dokumente\Arduino\libraries\AskSinPP\aes128_dec.cpp
Using cached library dependencies for file: D:\Eigene Dateien\Dokumente\Arduino\libraries\AskSinPP\aes128_enc.cpp
Using cached library dependencies for file: D:\Eigene Dateien\Dokumente\Arduino\libraries\AskSinPP\aes_dec.cpp
Using cached library dependencies for file: D:\Eigene Dateien\Dokumente\Arduino\libraries\AskSinPP\aes_enc.cpp
Using cached library dependencies for file: D:\Eigene Dateien\Dokumente\Arduino\libraries\AskSinPP\aes_invsbox.c
Using cached library dependencies for file: D:\Eigene Dateien\Dokumente\Arduino\libraries\AskSinPP\aes_keyschedule.cpp
Using cached library dependencies for file: D:\Eigene Dateien\Dokumente\Arduino\libraries\AskSinPP\aes_sbox.c
Using cached library dependencies for file: D:\Eigene Dateien\Dokumente\Arduino\libraries\AskSinPP\gf256mul.cpp
Using cached library dependencies for file: D:\Eigene Dateien\Dokumente\Arduino\libraries\Low-Power-master\LowPower.cpp
Generating function prototypes...
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=8000000L -DARDUINO=10816 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\eightanaloginputs" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\EnableInterrupt" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\AskSinPP" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\Low-Power-master" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\tmBattery" "D:\\Temp\\arduino_build_835024\\sketch\\HB-UNI-Sen-RainCounter.ino.cpp" -o "D:\\Temp\\arduino_build_835024\\preproc\\ctags_target_for_gcc_minus_e.cpp"
"C:\\Program Files (x86)\\Arduino\\tools-builder\\ctags\\5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "D:\\Temp\\arduino_build_835024\\preproc\\ctags_target_for_gcc_minus_e.cpp"
Sketch wird kompiliert...
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=8000000L -DARDUINO=10816 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\eightanaloginputs" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\EnableInterrupt" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\AskSinPP" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\Low-Power-master" "-ID:\\Eigene Dateien\\Dokumente\\Arduino\\libraries\\tmBattery" "D:\\Temp\\arduino_build_835024\\sketch\\HB-UNI-Sen-RainCounter.ino.cpp" -o "D:\\Temp\\arduino_build_835024\\sketch\\HB-UNI-Sen-RainCounter.ino.cpp.o"
Compiling libraries...
Compiling library "EnableInterrupt"
Compiling library "AskSinPP"
Zuvor kompilierte Datei wird verwendet: D:\Temp\arduino_build_835024\libraries\AskSinPP\gf256mul.S.o
Zuvor kompilierte Datei wird verwendet: D:\Temp\arduino_build_835024\libraries\AskSinPP\aes_sbox.c.o
Zuvor kompilierte Datei wird verwendet: D:\Temp\arduino_build_835024\libraries\AskSinPP\aes_invsbox.c.o
Zuvor kompilierte Datei wird verwendet: D:\Temp\arduino_build_835024\libraries\AskSinPP\gf256mul.cpp.o
Zuvor kompilierte Datei wird verwendet: D:\Temp\arduino_build_835024\libraries\AskSinPP\aes_keyschedule.cpp.o
Zuvor kompilierte Datei wird verwendet: D:\Temp\arduino_build_835024\libraries\AskSinPP\aes_dec.cpp.o
Zuvor kompilierte Datei wird verwendet: D:\Temp\arduino_build_835024\libraries\AskSinPP\aes128_dec.cpp.o
Zuvor kompilierte Datei wird verwendet: D:\Temp\arduino_build_835024\libraries\AskSinPP\aes_enc.cpp.o
Zuvor kompilierte Datei wird verwendet: D:\Temp\arduino_build_835024\libraries\AskSinPP\aes128_enc.cpp.o
Zuvor kompilierte Datei wird verwendet: D:\Temp\arduino_build_835024\libraries\AskSinPP\HMID.cpp.o
Zuvor kompilierte Datei wird verwendet: D:\Temp\arduino_build_835024\libraries\AskSinPP\AlarmClock.cpp.o
Zuvor kompilierte Datei wird verwendet: D:\Temp\arduino_build_835024\libraries\AskSinPP\PhaseCut.cpp.o
Zuvor kompilierte Datei wird verwendet: D:\Temp\arduino_build_835024\libraries\AskSinPP\Led.cpp.o
Zuvor kompilierte Datei wird verwendet: D:\Temp\arduino_build_835024\libraries\AskSinPP\Globals.cpp.o
Compiling library "Low-Power-master"
Zuvor kompilierte Datei wird verwendet: D:\Temp\arduino_build_835024\libraries\Low-Power-master\LowPower.cpp.o
Compiling library "tmBattery"
Compiling core...
Using precompiled core: D:\Temp\arduino_cache_437741\core\core_arduino_avr_pro_cpu_8MHzatmega328_0c812875ac70eb4a9b385d8fb077f54c.a
Linking everything together...
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-gcc" -w -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega328p -o "D:\\Temp\\arduino_build_835024/HB-UNI-Sen-RainCounter.ino.elf" "D:\\Temp\\arduino_build_835024\\sketch\\HB-UNI-Sen-RainCounter.ino.cpp.o" "D:\\Temp\\arduino_build_835024\\libraries\\AskSinPP\\gf256mul.S.o" "D:\\Temp\\arduino_build_835024\\libraries\\AskSinPP\\aes_invsbox.c.o" "D:\\Temp\\arduino_build_835024\\libraries\\AskSinPP\\aes_sbox.c.o" "D:\\Temp\\arduino_build_835024\\libraries\\AskSinPP\\AlarmClock.cpp.o" "D:\\Temp\\arduino_build_835024\\libraries\\AskSinPP\\Globals.cpp.o" "D:\\Temp\\arduino_build_835024\\libraries\\AskSinPP\\HMID.cpp.o" "D:\\Temp\\arduino_build_835024\\libraries\\AskSinPP\\Led.cpp.o" "D:\\Temp\\arduino_build_835024\\libraries\\AskSinPP\\PhaseCut.cpp.o" "D:\\Temp\\arduino_build_835024\\libraries\\AskSinPP\\aes128_dec.cpp.o" "D:\\Temp\\arduino_build_835024\\libraries\\AskSinPP\\aes128_enc.cpp.o" "D:\\Temp\\arduino_build_835024\\libraries\\AskSinPP\\aes_dec.cpp.o" "D:\\Temp\\arduino_build_835024\\libraries\\AskSinPP\\aes_enc.cpp.o" "D:\\Temp\\arduino_build_835024\\libraries\\AskSinPP\\aes_keyschedule.cpp.o" "D:\\Temp\\arduino_build_835024\\libraries\\AskSinPP\\gf256mul.cpp.o" "D:\\Temp\\arduino_build_835024\\libraries\\Low-Power-master\\LowPower.cpp.o" "D:\\Temp\\arduino_build_835024/..\\arduino_cache_437741\\core\\core_arduino_avr_pro_cpu_8MHzatmega328_0c812875ac70eb4a9b385d8fb077f54c.a" "-LD:\\Temp\\arduino_build_835024" -lm
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-objcopy" -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 "D:\\Temp\\arduino_build_835024/HB-UNI-Sen-RainCounter.ino.elf" "D:\\Temp\\arduino_build_835024/HB-UNI-Sen-RainCounter.ino.eep"
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-objcopy" -O ihex -R .eeprom "D:\\Temp\\arduino_build_835024/HB-UNI-Sen-RainCounter.ino.elf" "D:\\Temp\\arduino_build_835024/HB-UNI-Sen-RainCounter.ino.hex"
Bibliothek EnableInterrupt in Version 1.1.0 im Ordner: D:\Eigene Dateien\Dokumente\Arduino\libraries\EnableInterrupt  wird verwendet
Bibliothek AskSinPP in Version 5.0.0 im Ordner: D:\Eigene Dateien\Dokumente\Arduino\libraries\AskSinPP  wird verwendet
Bibliothek Low-Power-master in Version 1.81 im Ordner: D:\Eigene Dateien\Dokumente\Arduino\libraries\Low-Power-master  wird verwendet
Bibliothek tmBattery im Ordner: D:\Eigene Dateien\Dokumente\Arduino\libraries\tmBattery (legacy) wird verwendet
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-size" -A "D:\\Temp\\arduino_build_835024/HB-UNI-Sen-RainCounter.ino.elf"
Der Sketch verwendet 19526 Bytes (63%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes.
Globale Variablen verwenden 665 Bytes (32%) des dynamischen Speichers, 1383 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -cstk500 -PCOM3 -Uflash:w:D:\Temp\arduino_build_835024/HB-UNI-Sen-RainCounter.ino.hex:i 

avrdude: Version 6.3-20190619
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf"

         Using Port                    : COM3
         Using Programmer              : stk500
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : STK500V2
         Description     : Atmel STK500
         Programmer Model: STK500
         Hardware Version: 10
         Firmware Version Master : 2.10
avrdude: stk500v2_command(): command failed
avrdude: stk500v2_getparm(): failed to get parameter 0x9a
         Topcard         : Unknown
         Vtarget         : 3.3 V
         SCK period      : 2.2 us
         Varef           : 3.3 V
         Oscillator      : Off

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "D:\Temp\arduino_build_835024/HB-UNI-Sen-RainCounter.ino.hex"
avrdude: writing flash (19526 bytes):

Writing | ################################################## | 100% 2.56s

avrdude: 19526 bytes of flash written
avrdude: verifying flash memory against D:\Temp\arduino_build_835024/HB-UNI-Sen-RainCounter.ino.hex:
avrdude: load data flash data from input file D:\Temp\arduino_build_835024/HB-UNI-Sen-RainCounter.ino.hex:
avrdude: input file D:\Temp\arduino_build_835024/HB-UNI-Sen-RainCounter.ino.hex contains 19526 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 2.01s

avrdude: verifying ...
avrdude: 19526 bytes of flash verified

avrdude done.  Thank you.


Wenn ich das richtig gelesen habe, sollte es geklappt haben.

Gruß Enrico

Antworten

Zurück zu „Hardwareentwicklung und Selbstbau von Aktoren und Sensoren“