HB-UNI-Sen-TEMP-MAX6675

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

Moderator: Co-Administratoren

Martin62
Beiträge: 681
Registriert: 09.12.2019, 21:24
Hat sich bedankt: 151 Mal
Danksagung erhalten: 61 Mal

Re: HB-UNI-Sen-TEMP-MAX6675

Beitrag von Martin62 » 09.04.2021, 16:30

Du hast ja recht und Arduino IDE geht bei mir auch ganz gut. Bin irgendwie bei BASIC in den 80 hängen geblieben :lol: und in meinem Kopf will einfach nichts mehr neues rein. Ein paar Kleinigkeiten bekomme ich auch bei Asksin dazwischen nur das große ganze will einfach nicht klick machen. :wink: Dazu kommt, das ich täglich mit SPS arbeite und dadurch auch ständig abgelenkt werde. :lol:
Habe mich auch mal mi C++ beschäftigt, ist ja im Ansatz alles logisch aber... Und Jérôme, dich schätzte ich als sehr Intelligent ein, fällt dir alles etwas leichter. Ich bin Durchschnitt und musste und muss mir das alles schwer erarbeiten. Und so geht es hier vielen. Deshalb auch noch mal danke an alle die uns "Deppen" immer wieder helfen. Wirklich ein tolles Forum.
Gruß Martin

coronaxxl
Beiträge: 31
Registriert: 07.01.2017, 19:20
Danksagung erhalten: 3 Mal

Re: HB-UNI-Sen-TEMP-MAX6675

Beitrag von coronaxxl » 13.04.2021, 19:11

Hallo Zusammen,

ich gebe ja recht, man kann auch einiges selber machen und sich in neue Materien einarbeiten. Manchmal fehlt hier halt auch was, Zeit, etc.
Ich dachte nur, das wäre für geschulte Leute eine super schnelle Sache mit dem zusätzlichen LCD, deswegen meine Frage.

Aber ich habe es nun selber binnen ein paar Stunden hinbekommen und bin mit meinem Ergebnis zufrieden. Ein paar Erweiterungen möchte ich nun noch mit einbauen, aber für den nächsten Pizzaabend reicht es erstmal so.

Ich muss auch eingestehen, dass es Spaß gemacht hat und mein Verständnis ist dadurch nicht geschrumpft. Auch von mir ein Dankeschön an Jerome für seine tolle Arbeit, auf der man für seine eigenen Bedürfnisse aufbauen kann!
20210413_185641.jpg

Martin62
Beiträge: 681
Registriert: 09.12.2019, 21:24
Hat sich bedankt: 151 Mal
Danksagung erhalten: 61 Mal

Re: HB-UNI-Sen-TEMP-MAX6675

Beitrag von Martin62 » 14.04.2021, 10:02

Bist du auch bereit das mal zu veröffentlichen wie du das gemacht hast.
Gruß Martin

coronaxxl
Beiträge: 31
Registriert: 07.01.2017, 19:20
Danksagung erhalten: 3 Mal

Re: HB-UNI-Sen-TEMP-MAX6675

Beitrag von coronaxxl » 14.04.2021, 18:25

Hallo Martin,
natürlich teile ich sehr gerne. Aber Vorweg, ich habe das zum ersten mal gemacht.
Ausgangspunkt war HB-UNI-Sen-TEMP-MAX6675-DT.ino, hier brauchte ich nur den Wert für den ersten Sensor.
Im folgenden Quelltext sind nun vier Blöcke die das LCD benötigt, zuerkennen am Kommentar //LCD. Braucht man das LCD nicht reicht es aus die #define USE_LCD //LCD
#define LCD_ADDRESS 0x27 //LCD

auszukommentieren.

Code: Alles auswählen

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

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

#define USE_LCD                               //LCD
#define LCD_ADDRESS 0x27                      //LCD

#define EI_NOTEXTERNAL
#include <EnableInterrupt.h>
#include <SPI.h>
#include <AskSinPP.h>
#include <LowPower.h>

#include <Register.h>
#include <MultiChannelDevice.h>
#include <sensors/Max6675.h>

#ifdef USE_LCD                                //LCD
#include <Wire.h>                             //LCD
#include <LiquidCrystal_I2C.h>                //LCD
LiquidCrystal_I2C lcd(LCD_ADDRESS, 16, 2);    //LCD
#endif                                        //LCD

#define LED_PIN           4
#define CONFIG_BUTTON_PIN 8

#define MAX6675_SCK       7
#define MAX6675_1_SO      6
#define MAX6675_1_CS      9
#define MAX6675_2_SO      3
#define MAX6675_2_CS      A0

#define BATT_EN_PIN       5
#define BATT_MEAS_PIN     A1
#define BATTERY_MEASURE_INTERVAL  60UL*60*12 //every 12h

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

#define SYSCLOCK_FACTOR   0.88

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

// define all device properties
const struct DeviceInfo PROGMEM devinfo = {
  {0xf3, 0x10, 0x00},     // Device ID
  "JPTHMXDT00",           // Device Serial
  {0xf3, 0x10},           // Device Model Indoor
  0x10,                   // Firmware Version
  as::DeviceType::THSensor, // Device Type
  {0x01, 0x00}            // Info Bytes
};

/**
   Configure the used hardware
*/
typedef LibSPI<10> SPIType;
typedef Radio<SPIType, 2> RadioType;
typedef StatusLed<LED_PIN> LedType;
typedef AskSin<LedType, BatterySensorUni<BATT_MEAS_PIN, BATT_EN_PIN>, RadioType> BaseHal;
class Hal : public BaseHal {
public:
  void init (const HMID& id) {
    BaseHal::init(id);
    battery.init(seconds2ticks(BATTERY_MEASURE_INTERVAL),sysclock);
  }
} hal;


DEFREGISTER(Reg0, MASTERID_REGS, DREG_LOWBATLIMIT, 0x20, 0x21)
class UList0 : public RegList0<Reg0> {
  public:
    UList0(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();
      updIntervall(180);
      lowBatLimit(22);
    }
};

class MeasureEventMsg : public Message {
  public:
    void init(uint8_t msgcnt, int tempValues[4], bool batlow, uint8_t batval) {
      Message::init(0x18, msgcnt, 0x53, (msgcnt % 20 == 1) ? (BIDI | WKMEUP) : BCAST, batlow ? 0x80 : 0x00, 0x41);
      for (uint8_t i = 0; i < 4; i++) {
        pload[i * 3] = (tempValues[i] >> 8) & 0xff;
        pload[(i * 3) + 1] = (tempValues[i]) & 0xff;
        pload[(i * 3) + 2] = 0x42 + i;
      }
      pload[12] = batval & 0xff;
    }
};

class WeatherChannel : public Channel<Hal, List1, EmptyList, List4, PEERS_PER_CHANNEL, UList0> {
  private:
    uint8_t flgs;
  public:
    WeatherChannel () : Channel(), flgs(0) {}
    virtual ~WeatherChannel () {}

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

    uint8_t status () const {
      return 0;
    }

    void flags(uint8_t f) {
      flgs = f;
    }

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

class UType : public MultiChannelDevice<Hal, WeatherChannel, 4, UList0> {

    class SensorArray : public Alarm {
        UType& dev;
        MAX6675<MAX6675_SCK, MAX6675_1_CS, MAX6675_1_SO> max6675_1;
        MAX6675<MAX6675_SCK, MAX6675_2_CS, MAX6675_2_SO> max6675_2;
        bool    sens_1_OK;
        bool    sens_2_OK;
        uint8_t last_flgs;

      public:
        int16_t tempValues[4] = {0, 0, 0, 0};
        SensorArray (UType& d) : Alarm(0), dev(d), sens_1_OK(true), sens_2_OK(true), last_flgs(0xff) { }

        virtual void trigger (__attribute__ ((unused)) AlarmClock& clock) {
          tick = seconds2ticks(dev.getList0().updIntervall() * SYSCLOCK_FACTOR);
          sysclock.add(*this);

          sens_1_OK = max6675_1.measure();
          sens_2_OK = max6675_2.measure();

          tempValues[0] = max6675_1.temperature();
          tempValues[1] = max6675_2.temperature();


          tempValues[2] = tempValues[0] - tempValues[1];
          tempValues[3] = tempValues[1] - tempValues[0];

          DPRINT("T:"); DDEC(tempValues[0]); DPRINT(";"); DDEC(tempValues[1]); DPRINT(";"); DDEC(tempValues[2]); DPRINT(";"); DDECLN(tempValues[3]);

#ifdef USE_LCD                                                                        //LCD
char PufferFuerAusgabe[50];                                                           //LCD
sprintf (PufferFuerAusgabe, "Temperatur %3d\xDF""C", max6675_1.temperature()/10);     //LCD
lcd.setCursor(0, 1);                                                                  //LCD
lcd.print(PufferFuerAusgabe);                                                         //LCD
#endif                                                                                //LCD
          

          MeasureEventMsg& msg = (MeasureEventMsg&)dev.message();

          msg.init(dev.nextcount(), tempValues, dev.battery().low(), dev.battery().current());
          dev.send(msg, dev.getMasterID());

          uint8_t flgs = dev.battery().low() ? 0x80 : 0x00;

          if (sens_1_OK == false) flgs |= 0x01 << 1;
          if (sens_2_OK == false) flgs |= 0x02 << 1;

          dev.channel(1).flags(flgs);

          if (flgs != last_flgs) {
            last_flgs = flgs;
            _delay_ms(400);
            dev.channel(1).changed(true);
          }
        }

        void initSensor() {
          sens_1_OK = max6675_1.init();
          sens_2_OK = max6675_2.init();
        }

    } sensarray;

  public:
    typedef MultiChannelDevice<Hal, WeatherChannel, 4, UList0> TSDevice;
    UType(const DeviceInfo& info, uint16_t addr) : TSDevice(info, addr), sensarray(*this) {}
    virtual ~UType () {}

    virtual void configChanged () {
      TSDevice::configChanged();
      DPRINTLN("Config Changed List0");
      DPRINT("tParamSelect: "); DDECLN(this->getList0().tParamSelect());
      DPRINT("localResetDisable: "); DDECLN(this->getList0().localResetDisable());
      DPRINT("updIntervall: "); DDECLN(this->getList0().updIntervall());

      uint8_t lb = max(10, this->getList0().lowBatLimit());
      DPRINT("LOWBAT ");DDECLN(lb);
      battery().low(lb);
    }

    void init (Hal& hal) {
      TSDevice::init(hal);
      sensarray.set(seconds2ticks(2));
      sensarray.initSensor();
      sysclock.add(sensarray);
    }
};

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

void setup () {
  DINIT(57600, ASKSIN_PLUS_PLUS_IDENTIFIER);
  
#ifdef USE_LCD                                        //LCD
  lcd.begin();                                        //LCD
  lcd.setCursor(2, 0);                                //LCD
  lcd.print("Holzbackofen");                          //LCD
  lcd.setCursor(0, 1);                                //LCD
#endif                                                //LCD

  sdev.init(hal);
  buttonISR(cfgBtn, CONFIG_BUTTON_PIN);
  sdev.initDone();
}

void loop() {
  bool worked = hal.runready();
  bool poll = sdev.pollRadio();
  if ( worked == false && poll == false ) {
    if ( hal.battery.critical() ) {
      hal.sleepForever();
    }
    hal.sleep<>();
  }
}

Das LCD wird an den PIN´s A4 --> SDA & A5 --> SCL des Arduino angeschlossen. Des weiteren benötigt das Display 5V, somit nutze ich einen 9V Block an RAW mit einem vorgeschalteten DCDC 5V Wandler.

Das wars erstmal. Ich möchte aber noch einen Button zum Backlight Ein-&Ausschalten integrieren, das hat aber erstmal noch zeit.
Ich hoffe es genügt dir erstmal.

Martin62
Beiträge: 681
Registriert: 09.12.2019, 21:24
Hat sich bedankt: 151 Mal
Danksagung erhalten: 61 Mal

Re: HB-UNI-Sen-TEMP-MAX6675

Beitrag von Martin62 » 14.04.2021, 18:33

Danke! Das sieht besser aus als mein gestümper.
Gruß Martin

der-pw
Beiträge: 435
Registriert: 26.01.2019, 13:39
Wohnort: Wolfenbüttel
Hat sich bedankt: 126 Mal
Danksagung erhalten: 100 Mal
Kontaktdaten:

Re: HB-UNI-Sen-TEMP-MAX6675

Beitrag von der-pw » 14.04.2021, 20:10

coronaxxl hat geschrieben:
14.04.2021, 18:25
natürlich teile ich sehr gerne. Aber Vorweg, ich habe das zum ersten mal gemacht.
Danke fürs Teilen. Ja, die Scheu kenne ich.
Aber besser man veröffentlicht es, und wird ggf. noch auf den ein oder anderen Patzer hingewiesen, als wenn man im stillen Kämmerlein für sich dahinwerkelt.
coronaxxl hat geschrieben:
14.04.2021, 18:25
Des weiteren benötigt das Display 5V, somit nutze ich einen 9V Block an RAW mit einem vorgeschalteten DCDC 5V Wandler.
Vielleicht ist ein kleines OLED ja auch eine stromsparende Alternative?
https://github.com/der-pw/AskSinAnalyze ... niffer328P
Hier habe ich dem Sniffer des AsksinAnalyzers (also eigentlich war es mehr Jérôme :mrgreen: ) ein Display verpasst.
Kann aber nicht genau sagen, ob das noch in den 328p reinpasst.
#define USE_OLED trägt doch recht dick auf. ;)
Grüße,
Patrick

https://github.com/der-pw

coronaxxl
Beiträge: 31
Registriert: 07.01.2017, 19:20
Danksagung erhalten: 3 Mal

Re: HB-UNI-Sen-TEMP-MAX6675

Beitrag von coronaxxl » 15.04.2021, 15:13

Ja, mit dem Oled wäre Klasse gewesen, beim nächsten mal.

Ich habe aber nun doch noch etwas Probleme beim realisieren eines Tasters an A2 zum Ein- & Ausschalten des Backlights.
Ich verstehe nicht wie man einen Button richtig definiert und diesem dann, z.B. oben genannte Funktion zuweisen kann.
Ich habe mir HB-UNI-Sen-CURRENT.ino angeschaut, hier scheint es per Zeitgesteuert zu werden, das braucht es hier nicht. Aber ich blicke es gar nicht.

Hat einer eine Ansatz für mich?

jp112sdl
Beiträge: 12084
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 847 Mal
Danksagung erhalten: 2139 Mal
Kontaktdaten:

Re: HB-UNI-Sen-TEMP-MAX6675

Beitrag von jp112sdl » 15.04.2021, 15:54

coronaxxl hat geschrieben:
15.04.2021, 15:13
Hat einer eine Ansatz für mich?

Code: Alles auswählen

#define EI_NOTEXTERNAL
#include <EnableInterrupt.h>
#include <AskSinPP.h>

#define BACKLIGHT_BTN_PIN  A2

using namespace as;

class Backlight :  public Button {
private:
  bool isOn = false;
public:  
  virtual void state(uint8_t s) {
    Button::state(s);
    if (s==released ) {
      if (isOn == true) {
        isOn = false;
        // hier ausschalten lcd.noBacklight();
      } else {
        isOn = true;
        // hier einschalten  lcd.backlight();
      }
    }
  }
};

Backlight backlight;

void setup() {
  buttonISR(backlight, BACKLIGHT_BTN_PIN);
}

void loop() {
  
}
Nicht getestet, nur durch den Compiler geschickt

VG,
Jérôme ☕️

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

coronaxxl
Beiträge: 31
Registriert: 07.01.2017, 19:20
Danksagung erhalten: 3 Mal

Re: HB-UNI-Sen-TEMP-MAX6675

Beitrag von coronaxxl » 15.04.2021, 18:46

Super, hat geklappt. Wie das mit den Class, privat, public, etc. funktioniert muss ich mir nochmal genauer anschauen. Danke!!! :D



20210415_183916.jpg
20210415_183928.jpg

HotteFred
Beiträge: 2
Registriert: 02.10.2021, 22:09
System: keine Zentrale (nur Pairing, FHEM etc.)

Re: HB-UNI-Sen-TEMP-MAX6675

Beitrag von HotteFred » 02.10.2021, 22:16

Hallo zusammen,

versuche auch den MAX6675 zu verwenden, was mMn auch von der HW und im Seriellen Monitor funktioniert.
Allerdings kann ich das Teil nicht an FHEM sauber anlernen. Dort bekomme ich immer ein:
model: unknown
state: RESPONSE TIMEOUT:RegisterRead

Ich nutze den hm-cfg-usb Stick mit Fhem. Kann es sein, das das nicht funktioniert, weil ich das addon dort nicht zur Verfügung habe? (JP-HB-Devices-addon)?

Falls ja: Ich habe ein paar HM-WDS40-TH-I nachgebaut. Diese funktionieren hervorragend. Wäre es dann nicht möglich, die Temperatur vom Max einfach mit einem HM-WDS40-TH-I als "model" zu übertragen? Allerdings bekomme ich das warum auch immer nicht hin.

Oder habe ich etwas anderes übersehen? Oder andere Möglichkeiten?

Danke für Hilfe und Grüße
Fred.

Antworten

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