HB-UNI-Sen-TEMP-MAX6675
Moderator: Co-Administratoren
-
- Beiträge: 681
- Registriert: 09.12.2019, 21:24
- Hat sich bedankt: 151 Mal
- Danksagung erhalten: 61 Mal
Re: HB-UNI-Sen-TEMP-MAX6675
Du hast ja recht und Arduino IDE geht bei mir auch ganz gut. Bin irgendwie bei BASIC in den 80 hängen geblieben 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. Dazu kommt, das ich täglich mit SPS arbeite und dadurch auch ständig abgelenkt werde.
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.
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
Re: HB-UNI-Sen-TEMP-MAX6675
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!
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!
Re: HB-UNI-Sen-TEMP-MAX6675
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.
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.
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.
-
- 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
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.
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 ) ein Display verpasst.
Kann aber nicht genau sagen, ob das noch in den 328p reinpasst.
#define USE_OLED trägt doch recht dick auf.
Re: HB-UNI-Sen-TEMP-MAX6675
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?
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?
-
- Beiträge: 12115
- Registriert: 20.11.2016, 20:01
- Hat sich bedankt: 848 Mal
- Danksagung erhalten: 2150 Mal
- Kontaktdaten:
Re: HB-UNI-Sen-TEMP-MAX6675
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() {
}
Re: HB-UNI-Sen-TEMP-MAX6675
Super, hat geklappt. Wie das mit den Class, privat, public, etc. funktioniert muss ich mir nochmal genauer anschauen. Danke!!!
-
- Beiträge: 2
- Registriert: 02.10.2021, 22:09
- System: keine Zentrale (nur Pairing, FHEM etc.)
Re: HB-UNI-Sen-TEMP-MAX6675
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.
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.