Einfachste Variante für 4fach Taster mit Übertragung der Batteriespannung gesucht

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

Moderator: Co-Administratoren

Antworten
J.C.
Beiträge: 15
Registriert: 13.08.2020, 19:11
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

Einfachste Variante für 4fach Taster mit Übertragung der Batteriespannung gesucht

Beitrag von J.C. » 28.08.2020, 21:04

Guten Abend liebes Forum,

ich suche nach der einfachsten Software-Lösung für ein AskSin-Device, welches einen 4fach Taster implementiert und auch periodisch aufwachen kann, um die Batteriespannung und ggfls. Klimadaten (Temp/Hum/Press, zB von BME280 wie bereits erfolgreich via HB-UNI-SENS... funktionierend) zu übertragen.
Leider muss ich zugeben, dass ich noch nicht ausreichend hinter die Softwarearchitektur von AskSinPP und auch nicht von Homematic gestiegen bin. Meine Überlegungen ist: es gibt kein Originalgerät, welches diese Anforderungen erfüllt (https://wiki.fhem.de/wiki/Homematic-Ger ... BCbersicht), daher werde ich etwas eigenes implementieren bzw. anpassen müssen, inclusive rf-*.xml Datei für die CCU.

Welche Software-Basis wäre wohl diejenige, welche die wenigsten Anpassungen erfordert? Vllt. ausgehend von https://github.com/jp112sdl/Beispiel_As ... PBU-FM.ino die Batteriespannung und Klimadaten ergänzen? Oder hättet ihr einen anderen Vorschlag?
Wenn via RC-2-PBU-FM.ino, gibt es einen anderen möglichst einfachen AskSin-Sourcecode, welcher ein periodisches Aufwachen implementiert und an dem ich mich orientieren kann um erstmal eine regelmäßige Batteriespannungsübertragung (ist ein kleiner 300mAh LiPo) einzurichten?

Ganz herzlichen Dank,

Joost

PS: PCB existiert bereits, nicht allzu schön aber hardwareseitig funktionierend mit implementiertem Voltagedivider, 4 Microswitches und I2C-Pins. Bitte seht mir nach, dass ich nur selten hobbymäßig mit Programmierung zu tun habe, und dann auch noch am seltensten mit C++ :cry: ...

PPS: Ich habe natürlich schon bei Tom Major /HB-UNI-SENS reingeschaut und damit auch die Batt.spannung und Klimadaten übertragen können (tolle Sache, vielen Dank für das Engagement/die Bereitstellung!). Für mich ist allerdings der Programmablauf im Vergleich zu den originalen AskSin-Beispielen zu unterschiedlich, als dass ich das ohne tiefere C-Kenntnisse integrieren/zusammenführen könnte.


Habe gerade https://github.com/jp112sdl/HB-UNI-Sen-CAP-MOIST gesehen, werde morgen mal schauen, ob ich daraus und aus der .xml die Batt.spannung und das aufwachen herausbekomme.

jp112sdl
Beiträge: 6194
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 285 Mal
Danksagung erhalten: 579 Mal
Kontaktdaten:

Re: Einfachste Variante für 4fach Taster mit Übertragung der Batteriespannung gesucht

Beitrag von jp112sdl » 28.08.2020, 22:26

Du brauchst als Vorlage einen Sketch mit VirtChannels, da du unterschiedliche Kanaltypen (RemoteChannel, MeasureChannel) in einem Gerät vereinen willst.
Das HB-RC-4-Dis-TH ist ein 4fach Taster mit ePaper und Temperatursensor, der auch die Batteriespannung überträgt.
Wenn du das ePaper Zeug weg lässt, hast du eigentlich schon was du brauchst
https://github.com/jp112sdl/HB-RC-4-Dis-TH

VG,
Jérôme ☕️

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

J.C.
Beiträge: 15
Registriert: 13.08.2020, 19:11
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

Re: Einfachste Variante für 4fach Taster mit Übertragung der Batteriespannung gesucht

Beitrag von J.C. » 29.08.2020, 08:25

Guten Morgen,

vielen Dank für die Info mit den VirtChannels und für den Vorschlag mit dem RC4-Dis-TH! Habe leider die HomeMatic-Arch. leider noch nicht richtig geblickt (habe zuvor einige MySensors-Projekte gemacht; dort präsentiert sich ein jedes Device mit seinen jeweiligen Funktionen allein aus dem eigenen Sketch/Programm heraus und es gibt keine Channels und auch keine festgelegte serverseitige Konfiguration). Meine Hauptquelle bzgl. Doku ist gerade https://wiki.fhem.de/wiki/HomeMatic, die AskSin-Site und die Quellcodes eurer Devices/Programme.

Werde mich am Wochenende daran machen, allen Display-Code "rauszurupfen".

VG & ein angenehmes Wochenende,

Joost

J.C.
Beiträge: 15
Registriert: 13.08.2020, 19:11
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

Re: Einfachste Variante für 4fach Taster mit Übertragung der Batteriespannung gesucht

Beitrag von J.C. » 30.08.2020, 10:21

Guten Morgen,

leider kam es wie es kommen musste :roll: ; ich habe das Programm zusammengekürzt (s.u.), leide jetzt jedoch unter wiederkehrenden reboots während des ersten Broadcasts...
Aus meiner Sicht "crasht" bzw. rebooted es in

Code: Alles auswählen

void broadcastEvent (Message& msg) {
    DPRINT("In broadcastEvent...\n");

    msg.clearAck();
          DPRINT("1...\n");

    msg.burstRequired(false);
      DPRINT("2...\n");

    msg.setBroadcast();
      DPRINT("3...\n");

    send(msg,HMID::broadcast);
          DPRINT("4...\n");

    hal->sendPeer();
              DPRINT("5...\n");

  }
(debug-Ausgaben natürlich von mir zugefügt), vllt. auf Grund doch einer fehlender Initialisierung eines Feldes (durch mein Kürzen des Hauptsketches, s.u.?) .
Verwendetes Device ist ein Arduino Pro Mini; Speicher reicht noch Entfernung der epaperdisplay.h aus:
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM: [======= ] 70.8% (used 1450 bytes from 2048 bytes)
Flash: [========= ] 91.6% (used 28126 bytes from 30720 bytes)
Bei diesem gibt es leider zwei Besonderheiten; zum Einen ist es auf Grund falscher Lieferung ein 5V/16MHz, welchen ich aber als
[env:pro8MHzatmega328]
platform = atmelavr
board = pro8MHzatmega328
per PlatformIO flashe (das hat mit anderen einfachen AskSin-Programme ohne für mich offensichtliches Problem funktioniert inkl. zuverlässigem Senden); zum Einen ist der Arduino schon einmal mit einem anderen AskSin-Programm benutzt worden. Dieses Device habe ich dann via Homematic-UI entlernt und factory resetted, was mir auch in der HM-UI bestätig wurde. Könnten von dem Vorgänger programm vllt. dennoch Reste im EEPROM sein, welche nun stören?

Vllt. hätte hier noch jemand eine Idee zu?
Hier der aktuelle Code, im Anschluss das serielle Log incl. der Debug-Marker:

PS: ein SHT31 ist aktuell nicht dran; hatte allerdings das identische (Reboot)-Problem mit auskommentierter sensor.init() Methode und Rückgabe von zwei Dummy-Werte aus measure().

PPS: ein Anlernen funktioniert in diesem Zustand nicht

Code: Alles auswählen

//- -----------------------------------------------------------------------------------------------------------------------
// AskSin++
// 2016-10-31 papa Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/
// 2020-08-01 jp112sdl Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/
//- -----------------------------------------------------------------------------------------------------------------------

// use Arduino IDE Board Setting: BOBUINO Layout

// #define SENSOR_ONLY
#define DEVICE_CHANNEL_COUNT 4

#define EI_NOTEXTERNAL
#include <EnableInterrupt.h>

//#include "LcdDisplay.h"
#include <SPI.h>
#include <AskSinPP.h>

#include <LowPower.h>
#include <Register.h>
#include <MultiChannelDevice.h>
#include <Remote.h>
#include <Wire.h>
#include <sensors/Sht31.h>

#define CC1101_CS_PIN       10 // PB4
#define CC1101_GDO0_PIN      2 // PD2
#define BTN01_PIN           5 // PC4
#define BTN02_PIN           6 // PC5
#define BTN03_PIN           28 // PC6
#define BTN04_PIN           29 // PC7
#define CONFIG_BUTTON_PIN    8 // PD5
#define LED_PIN_1            5 // PB1
#define LED_PIN_2            4 // PB0

#define BATTERY_CRITICAL    30 // initial value

// #define TEXT_LENGTH               10
#define PEERS_PER_CHANNEL          8

#define SENSOR       Sht31<>
//#include "ePaperDisplay.h"

using namespace as;

const struct DeviceInfo PROGMEM devinfo = {
  {0xf3, 0x2f, 0x01},       // Device ID
  "JPRCDISTH1",             // Device Serial
  {0xf3, 0x2f},             // Device Model
  0x10,                     // Firmware Version
  as::DeviceType::Remote,   // Device Type
  {0x00, 0x00}              // Info Bytes
};


typedef LibSPI<CC1101_CS_PIN> SPIType;
typedef Radio<SPIType, CC1101_GDO0_PIN> RadioType;
typedef DualStatusLed<LED_PIN_1, LED_PIN_2> LedType;
typedef AskSin<LedType, IrqInternalBatt, RadioType> Hal;
Hal hal;


DEFREGISTER(Reg0, MASTERID_REGS, DREG_LOWBATLIMIT, DREG_LEDMODE, DREG_BACKONTIME, 0x03)
class HBList0 : public RegList0<Reg0> {
  public:
    HBList0(uint16_t addr) : RegList0<Reg0>(addr) {}

    // uint8_t defaultDisplayMode () const { return this->readRegister(0x03,0); }
    // bool defaultDisplayMode (uint8_t value) const { return this->writeRegister(0x03,value); }

    void defaults () {
      clear();
      lowBatLimit(24);
      backOnTime(10);
      // defaultDisplayMode(0);
      ledMode(1);
    }
};

DEFREGISTER(RCEPReg1, CREG_LONGPRESSTIME, CREG_AES_ACTIVE, CREG_DOUBLEPRESSTIME,
    0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
    0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
    0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
    0x90)
class RCEPList1 : public RegList1<RCEPReg1> {
  public:
    RCEPList1 (uint16_t addr) : RegList1<RCEPReg1>(addr) {}

    // bool showHeader (uint8_t value) const { return this->writeRegister(0x90, 0x01, 0, value & 0xff); }
    // bool showHeader () const { return this->readRegister(0x90, 0x01, 0, false); }

    // bool headerText (uint8_t value[TEXT_LENGTH]) const { for (int i = 0; i < TEXT_LENGTH; i++) { this->writeRegister(0x36 + i, value[i] & 0xff); } return true; }
    // String headerText () const { String a = ""; for (int i = 0; i < TEXT_LENGTH; i++) { byte b = this->readRegister(0x36 + i, 0x20); if (b == 0x00) b = 0x20; a += char(b); } return a; }

    // bool mainText1 (uint8_t value[TEXT_LENGTH]) const { for (int i = 0; i < TEXT_LENGTH; i++) { this->writeRegister(0x46 + i, value[i] & 0xff); } return true; }
    // String mainText1 () const { String a = ""; for (int i = 0; i < TEXT_LENGTH; i++) { byte b = this->readRegister(0x46 + i, 0x20); if (b == 0x00) b = 0x20; a += char(b); } return a; }

    // bool mainText2 (uint8_t value[TEXT_LENGTH]) const { for (int i = 0; i < TEXT_LENGTH; i++) { this->writeRegister(0x56 + i, value[i] & 0xff); } return true; }
    // String mainText2 () const { String a = ""; for (int i = 0; i < TEXT_LENGTH; i++) { byte b = this->readRegister(0x56 + i, 0x20); if (b == 0x00) b = 0x20; a += char(b); } return a; }


    void defaults () {
      clear();
      //aesActive(false);
      // uint8_t initValues[TEXT_LENGTH];
      // memset(initValues, 0x00, TEXT_LENGTH);
      // headerText(initValues);
      // mainText1(initValues);
      // mainText2(initValues);
    }
};

DEFREGISTER(THReg1, 0x01, 0x02, 0x20, 0x21)
class THList1 : public RegList1<THReg1> {
  public:
    THList1 (uint16_t addr) : RegList1<THReg1>(addr) {}

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

    bool TemperatureOffset (int8_t value) const { return this->writeRegister(0x01, (value) & 0xff); }
    int8_t TemperatureOffset () const { return (int8_t)(this->readRegister(0x01, 0)); }

    bool HumidityOffset (int8_t value) const { return this->writeRegister(0x02, (value) & 0xff); }
    int8_t HumidityOffset () const { return (int8_t)(this->readRegister(0x02, 0)); }

    void defaults () {
      clear();
      TemperatureOffset(0);
      HumidityOffset(0);
      sendIntervall(30);
    }
};

class ConfigChannel : public RemoteChannel<Hal,PEERS_PER_CHANNEL,HBList0, RCEPList1>  {
public:
  ConfigChannel () : RemoteChannel()  {}
    virtual ~ConfigChannel () {}

    void configChanged() {
      RemoteChannel::configChanged();

      // uint8_t idx = number() -1;

      // String ht = this->getList1().headerText();
      // String mt1 = this->getList1().mainText1();
      // String mt2 = this->getList1().mainText2();

      // ht.trim();
      // mt1.trim();
      // mt2.trim();

      // typedef struct rmap { char in; String out; } rmap_t;
      // const rmap_t rplmap[] = { { '{', "ä" }, { '|', "ö" }, { '}', "ü" }, { '[', "Ä" }, { '#', "Ö" }, { '$', "Ü" }, { '~', "ß" }, { '\'', "=" } };
      // for (uint8_t i = 0; i < 8; i++) {
      //    ht.replace(String(rplmap[i].in), rplmap[i].out);
      //    mt1.replace(String(rplmap[i].in), rplmap[i].out);
      //    mt2.replace(String(rplmap[i].in), rplmap[i].out);
      // }

      // DisplayFields[idx].showHeader = this->getList1().showHeader();
      // DisplayFields[idx].HeaderText = ht;
      // DisplayFields[idx].MainText1 = mt1;
      // DisplayFields[idx].MainText2 = mt2;


      //DPRINT(F("RC (#"));DDEC(number());DPRINT(F(") showHeader : "));DDECLN(this->getList1().showHeader());
      //DPRINT(F("RC (#"));DDEC(number());DPRINT(F(") HeaderText : "));DPRINTLN(ht);
      //DPRINT(F("RC (#"));DDEC(number());DPRINT(F(") MainText1  : "));DPRINTLN(mt1);
      //DPRINT(F("RC (#"));DDEC(number());DPRINT(F(") MainText2  : "));DPRINTLN(mt2);
    }
};

class WeatherEventMsg : public Message {
  public:
    void init(uint8_t msgcnt, int16_t temp, uint8_t humidity, bool batlow, uint8_t bvolt) {
      uint8_t t1 = (temp >> 8) & 0x7f;
      uint8_t t2 = temp & 0xff;
      if ( batlow == true ) {
        t1 |= 0x80; // set bat low bit
      }
      Message::init(0xd, msgcnt, 0x70, BIDI | WKMEUP, t1, t2);
      pload[0] = humidity & 0xff;
      pload[1] = bvolt & 0xff;
    }
};

class WeatherChannel : public Channel<Hal, THList1, EmptyList, List4, PEERS_PER_CHANNEL, HBList0>, public Alarm {

    WeatherEventMsg msg;
    int16_t         temp;
    uint8_t         humidity;

    SENSOR          sensor;
    uint16_t        millis;

  public:
    WeatherChannel () : Channel(), Alarm(5), temp(0), humidity(0), millis(0) {}
    virtual ~WeatherChannel () {}


    // here we do the measurement
    void measure () {
      DPRINT("Measure...\n");
       sensor.measure();

       temp = sensor.temperature();
       humidity = sensor.humidity();
      // temp =11; //JC
      // humidity=99;

      DPRINT(F("T/H = "));DDEC(temp);DPRINT(F("/"));DDECLN(humidity);
    }

    virtual void trigger (__attribute__ ((unused)) AlarmClock& clock) {

      // reactivate for next measure
      uint16_t updCycle = max(10,this->getList1().sendIntervall());
      tick = seconds2ticks(updCycle);
      clock.add(*this);

      measure();

      //send message
      DPRINT("Vor Senden...\n");
      msg.init(device().nextcount(), temp, humidity, device().battery().low(), device().battery().current());
      DPRINT("Nach msg.init...\n");

      device().getList0().ledMode(false);
      DPRINT("Nach ledMode...\n");

      device().broadcastEvent(msg);
      DPRINT("Nach device.broadcastevent...\n");

      device().getList0().ledMode(true);
      DPRINT("Nach device.getlist...\n");

      // //update display
      // Display.setWeatherValues(temp, humidity, device().battery().current(), device().getList0().lowBatLimit());
      // if (Display.currentScreen() == SCREEN_TEMPERATURE) Display.showTemp();
    }

    void setup(Device<Hal, HBList0>* dev, uint8_t number, uint16_t addr) {
      Channel::setup(dev, number, addr);
      sensor.init(); 
      sysclock.add(*this);
    }

    uint8_t status () const { return 0; }

    uint8_t flags () const { return 0; }

    virtual void configChanged () {
      DPRINT(F("WC (#"));DDEC(number());DPRINT(F(") TEMP OFFSET : "));DDECLN(this->getList1().TemperatureOffset());
      DPRINT(F("WC (#"));DDEC(number());DPRINT(F(") HUMI OFFSET : "));DDECLN(this->getList1().HumidityOffset());
      DPRINT(F("WC (#"));DDEC(number());DPRINT(F(") SEND INTERV : "));DDECLN(this->getList1().sendIntervall());
    }
};

class MixDevice : public ChannelDevice<Hal, VirtBaseChannel<Hal, HBList0>, DEVICE_CHANNEL_COUNT+1, HBList0> {
  public:
      VirtChannel<Hal, WeatherChannel, HBList0> weatherChannel;
      VirtChannel<Hal, ConfigChannel,  HBList0> remChannel[DEVICE_CHANNEL_COUNT];
  public:
    typedef ChannelDevice<Hal, VirtBaseChannel<Hal, HBList0>, DEVICE_CHANNEL_COUNT+1, HBList0> DeviceType;
    MixDevice (const DeviceInfo& info, uint16_t addr) : DeviceType(info, addr) {
      DeviceType::registerChannel(weatherChannel, 5);
      for (uint8_t i = 0; i < DEVICE_CHANNEL_COUNT; ++i) DeviceType::registerChannel(remChannel[i], i + 1);
    }
    virtual ~MixDevice () {}

    ConfigChannel& btnChannel (uint8_t c) {
      return remChannel[c - 1];
    }

    virtual void configChanged () {
      // uint8_t disptimeout = getList0().backOnTime();
      // //DPRINT(F("List0 DISP TIMEOUT         : ")); DDECLN(this->getList0().backOnTime());
      // Display.setScreenKeysTimeout(disptimeout);

      // if (getList0().defaultDisplayMode() != Display.defaultDisplayMode()) {
      //   uint8_t ddm = getList0().defaultDisplayMode();
      //   //DPRINT(F("List0 DEFAULT DISPLAYMODE  : ")); DDECLN(this->getList0().defaultDisplayMode());
      //   Display.defaultDisplayMode(ddm);
      //   if (Display.currentScreen() == SCREEN_TEMPERATURE) {
      //     Display.set(seconds2ticks(8), sysclock);
      //   }
      // }

      uint8_t lowbat = getList0().lowBatLimit();
      if( lowbat > 0 ) {
        battery().low(lowbat);
        battery().critical(lowbat - 2); // set critical bat value to "low bat" - 0.2V
      }
      //DPRINT(F("List0 LOWBAT               : ")); DDECLN(this->getList0().lowBatLimit());
    }
};

MixDevice sdev(devinfo, 0x20);


class ConfBtn : public ConfigButton<MixDevice>  {
public:
  ConfBtn (MixDevice& i) : ConfigButton(i) {}
  virtual ~ConfBtn () {}

  virtual void state (uint8_t s) {
    uint8_t old = ButtonType::state();
    ButtonType::state(s);
    // if( s == ButtonType::released ) {
    //   if (Display.currentScreen() != SCREEN_KEYLABELS)
    //     Display.setNextScreen(Screen::SCREEN_KEYLABELS);
    // }
    // else 
    if( s == ButtonType::longreleased ) {
      sdev.startPairing();
    }
    else if( s == ButtonType::longpressed ) {
      if( old == ButtonType::longpressed ) {
        if( sdev.getList0().localResetDisable() == false ) {
          sdev.reset(); // long pressed again - reset
        }
      }
      else {
        sdev.led().set(LedStates::key_long);
      }
    }
  }
};

ConfBtn cfgBtn(sdev);
void setup() {
  DINIT(19200, ASKSIN_PLUS_PLUS_IDENTIFIER);

  // Display.init();
  uint8_t serial[11];
  sdev.getDeviceSerial(serial);
  serial[10] = 0;
  // Display.showInitScreen((char*)serial, sdev.getMasterID() > 0);

  sdev.init(hal);

  hal.battery.init(seconds2ticks(60UL*60),sysclock);
  hal.battery.critical(BATTERY_CRITICAL);

  remoteChannelISR(sdev.btnChannel(1), BTN01_PIN);
  remoteChannelISR(sdev.btnChannel(2), BTN02_PIN);
  remoteChannelISR(sdev.btnChannel(3), BTN03_PIN);
  remoteChannelISR(sdev.btnChannel(4), BTN04_PIN);

  buttonISR(cfgBtn, CONFIG_BUTTON_PIN);
  while (hal.battery.current() == 0);
  sdev.initDone();
}


void loop() {
  bool worked = hal.runready();
  bool poll = sdev.pollRadio();
  if ( worked == false && poll == false ) {
    if (hal.battery.critical()) {
      hal.activity.sleepForever(hal);
    }
    hal.activity.savePower<Sleep<>>(hal);
  }
}
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at http://bit.ly/pio-monitor-filters
--- Miniterm on /dev/ttyUSB0 38400,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
AskSin++ V4.1.6 (Aug 30 2020 09:41:41)
SHT31 ERROR
Address Space: 32 - 419
CC init1
CC Version: 04
- ready
WC (#5) TEMP OF␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀AskSin++ V4.1.6 (Aug 30 2020 09:41:41)
SHT31 ERROR
Address Space: 32 - 419
CC init1
CC Version: 04
- ready
WC (#5) TEMP OFFSET : -1
WC (#5) HUMI OFFSET : -1
WC (#5) SEND INTERV : 65535
Measure...
T/H = 0/0
Vor Senden...
Nach msg.init...
Nach ledMode...
In broadcastEvent...
1...
2...
3...
AskSin++ V4.1.6 (Aug 30 2020 09:41:41)
SHT31 ERROR
Address Space: 32 - 419
CC init1
CC Version: 04
- ready
WC (#5) TEMP OFFSET : -1
WC (#5) HUMI OFFSET : -1
WC (#5) SEND INTERV : 65535
Measure...
T/H = 0/0
Vor Senden...
Nach msg.init...
Nach ledMode...
In broadcastEvent...
1...
2...
3...
Vielen Dank für etwaige Ideen und Grüße,

Joost

jp112sdl
Beiträge: 6194
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 285 Mal
Danksagung erhalten: 579 Mal
Kontaktdaten:

Re: Einfachste Variante für 4fach Taster mit Übertragung der Batteriespannung gesucht

Beitrag von jp112sdl » 30.08.2020, 11:56

J.C. hat geschrieben:
30.08.2020, 10:21
auf Grund falscher Lieferung ein 5V/16MHz, welchen ich aber als
[env:pro8MHzatmega328]
platform = atmelavr
board = pro8MHzatmega328
Das birgt 2 Fehlerquellen:
1.) Der Takt vom Quarz kommt doppelt so schnell wie kompiliert, d.h. alle Timer laufen doppelt so schnell
Siehst du schon an der Tatsache, dass du im Sketch 19200 Baud angibst, im seriellen Monitor aber bei 38400 Baud Ausgaben bekommst
2.) Die Pegel an IO Pins vom CC1101 sind 5V, was der u.U. (nicht lange) verträgt.
J.C. hat geschrieben:
30.08.2020, 10:21
Könnten von dem Vorgänger programm vllt. dennoch Reste im EEPROM sein, welche nun stören?
Ein Initialisierung kannst du erzwingen, indem du den Configbutton gedrückt hältst bis RESET im seriellen Monitor erscheint

VG,
Jérôme ☕️

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

J.C.
Beiträge: 15
Registriert: 13.08.2020, 19:11
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

Re: Einfachste Variante für 4fach Taster mit Übertragung der Batteriespannung gesucht

Beitrag von J.C. » 30.08.2020, 13:10

Hallo,

vielen Dank. Habe es zur Vermeidung jeglicher Unklarheiten und unnötiger "Hilfe-Arbeit" mit einem anderen Arduino aufgesetzt (diesmal richtig Pro Mini 8MHz/3V3); leider das selbe Problem:
> Executing task in folder AskSin-RC4-DIS-TH-Redux: platformio device monitor <

--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at http://bit.ly/pio-monitor-filters
--- Miniterm on /dev/ttyUSB0 57600,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
AskSin++ V4.1.6 (Aug 30 2020 12:55:18)
SHT31 ERROR
Address Space: 32 - 419
CC init1
CC Version: 04
- ready
Config Freq: 0x2165BA
WC (#5) TEMP OFFSET : 0
WC (#5) HUMI OFFSET : 0
WC (#5) SEND INTERV : 30
Measure...
T/H = 0/0
Vor Senden...
Nach msg.init...
Nach ledMode...
In broadcastEvent...
1...
2...
3...
AskSin++ V4.1.6 (Aug 30 2020 12:55:18)
SHT31 ERROR
Address Space: 32 - 419
CC init1
CC Version: 04
- ready
Config Freq: 0x2165BA
WC (#5) TEMP OFFSET : 0
WC (#5) HUMI OFFSET : 0
WC (#5) SEND INTERV : 30
Measure...
T/H = 0/0
Vor Senden...
Nach msg.init...
Nach ledMode...
In broadcastEvent...
1...
2...
3...
AskSin++ V4.1.6 (Aug 30 2020 12:55:18)
SHT31 ERROR
Address Space: 32 - 419
CC init1
CC Version: 04
- ready
Config Freq: 0x2165BA
WC (#5) TEMP OFFSET : 0
WC (#5) HUMI OFFSET : 0
WC (#5) SEND INTERV : 30
Measure...
T/H = 0/0
Vor Senden...
Nach msg.init...
Nach ledMode...
In broadcastEvent...
1...
2...
3...
Quelltext bis auf die geänderte serielle Baudrate identisch.
Zum resetten des EPROMs scheint das Programm nicht lange genug zu laufen.

Bzgl. des CC1101; waren immer nur 3,3V drauf, hatte zum Glück schon vorher von der 5V Intoleranz gelesen. Aber dadurch lief halt der Pro Mini "out of spec" mit den 16MHz bei 3V. Ist aber jetzt hinfällig, da nicht mehr verwendet.

J.C.
Beiträge: 15
Registriert: 13.08.2020, 19:11
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

Re: Einfachste Variante für 4fach Taster mit Übertragung der Batteriespannung gesucht

Beitrag von J.C. » 30.08.2020, 13:24

Add.: Habe per sdev.reset() das EPROM resetted; keine Änderung.

Da ich damit die Frequenzanpassung überschrieben habe, steckt nun die manuelle Frequenzkorrektur mit

Code: Alles auswählen

  ...buttonISR(cfgBtn, CONFIG_BUTTON_PIN);
  while (hal.battery.current() == 0);


  // Set frequency for CC1101
  hal.radio.initReg(CC1101_FREQ2, 0x21);
  hal.radio.initReg(CC1101_FREQ1, 0x65);
  hal.radio.initReg(CC1101_FREQ0, 0xBA);

  sdev.initDone();
  }
drin.

Nun hat sich der Loop geändert, in viel höherer Frequenz kommt nun
AskSin++ V4.1.6 (Aug 30 2020 13:26:38)
SHT31 ERROR
Address Space: 32 - 419
CC init1
CC Version: 04
- ready
Config Freq�␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀AskSin++ V4.1.6 (Aug 30 2020 13:26:38)
SHT31 ERROR
Address Space: 32 - 419
CC init1
CC Version: 04
- ready
Config Freq␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀AskSin++ V4.1.6 (Aug 30 2020 13:26:38)
SHT31 ERROR
Address Space: 32 - 419
CC init1
CC Version: 04
- ready
Config Freq␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀AskSin++ V4.1.6 (Aug 30 2020 13:26:38)
SHT31 ERROR
Address Space: 32 - 419
CC init1
CC Version: 04
- ready
Config Freq␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀AskSin++ V4.1.6 (Aug 30 2020 13:26:38)
SHT31 ERROR
Address Space: 32 - 419
CC init1
CC Version: 04
- ready
Config Freq␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀AskSin++ V4.1.6 (Aug 30 2020 13:26:38)
SHT31 ERROR
Address Space: 32 - 419
CC init1
CC Version: 04
- ready
Config Freq␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀AskSin++ V4.1.6 (Aug 30 2020 13:26:38)
SHT31 ERROR
Address Space: 32 - 419
CC init1
CC Version: 04
- ready
Config Freq␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀AskSin++ V4.1.6 (Aug 30 2020 13:26:38)
SHT31 ERROR
Address Space: 32 - 419
CC init1
CC Version: 04
- ready
Config Freq�␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀AskSin++ V4.1.6 (Aug 30 2020 13:26:38)
SHT31 ERROR
Address Space: 32 - 419
CC init1
CC Version: 04
- ready
Config Freq�␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀AskSin++ V4.1.6 (Aug 30 2020 13:26:38)
SHT31 ERROR
Address Space: 32 - 419
CC init1
CC Version: 04
- ready
Config Freq␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀
Vllt. ist der crash gar nicht in direktem Zusammenhang mit broadcastEvent() ?

jp112sdl
Beiträge: 6194
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 285 Mal
Danksagung erhalten: 579 Mal
Kontaktdaten:

Re: Einfachste Variante für 4fach Taster mit Übertragung der Batteriespannung gesucht

Beitrag von jp112sdl » 30.08.2020, 13:34

J.C. hat geschrieben:
30.08.2020, 13:24
Da ich damit die Frequenzanpassung überschrieben habe, steckt nun die manuelle Frequenzkorrektur mit
Nein, die Freq bleibt beim RESET trotzdem im EEPROM erhalten.

VG,
Jérôme ☕️

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

jp112sdl
Beiträge: 6194
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 285 Mal
Danksagung erhalten: 579 Mal
Kontaktdaten:

Re: Einfachste Variante für 4fach Taster mit Übertragung der Batteriespannung gesucht

Beitrag von jp112sdl » 30.08.2020, 13:47

Ein Fehler wird sicher auch sein, dass die BTN_PINS 28 und 29 nicht mit einem Pro Mini funktionieren

VG,
Jérôme ☕️

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

J.C.
Beiträge: 15
Registriert: 13.08.2020, 19:11
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

Re: Einfachste Variante für 4fach Taster mit Übertragung der Batteriespannung gesucht

Beitrag von J.C. » 30.08.2020, 14:16

jp112sdl hat geschrieben:
30.08.2020, 13:47
Ein Fehler wird sicher auch sein, dass die BTN_PINS 28 und 29 nicht mit einem Pro Mini funktionieren
Das war's; reboot-Schleife behoben!!

:D :D

Tausend Dank!

Edit: noch ganz kurz als Ergänzung/Abschluss:

Pin 29 ist beim ATMEga328 "Reset" ( :D ) und Pin 28 "A7", welcher nur als Analogeingang funktioniert.

Antworten

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