Nachbau Temperatur-/Luftfeuchtesensor mit Universalplatine

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

Moderator: Co-Administratoren

micha68
Beiträge: 33
Registriert: 28.06.2017, 18:36

Nachbau Temperatur-/Luftfeuchtesensor mit Universalplatine

Beitrag von micha68 » 06.05.2018, 15:09

Hi!

Ich habe mir dank der asksinpp-Bibliothek einen eigenen Sensor gebaut.
Realisiert mit einer Universalplatine, die ich beim freundlichen Chinesen habe Fertigen lassen.

Grundsätzlich funktioniert alles - die Werte kommen in Raspberrymatic an. Allerdings zeigen einige Sensoren ein anderes Bild an den LEDs, als würden sie keine Bestätigung bekommen.
Es ist das gleiche Bild, als wenn Raspberrymatic aus ist.

Ein - in meinen Augen funktionierender Sensor - zeigt folgendes LED-Bild: Rote Led kurz, grüne LED kurz. Alles OK.
Ein nicht funktionierender Sensor (Werte kommen aber an!) zeigt folgendes Bild: Beide Leds für ca. 2s an. Nach 5s nochmal kurz die rote.
Sketch ist auf allen gleich - bis auf die Adresse.

Ich habe mal die serielle angeschlossen, leider kann ich mit der Ausgabe nichts anfangen. Könnte mal ein Wissender drüber schauen?

Danke und Gruß,
Micha

Funktionierender Sensor (am Ende 2 Übertragungen von Temperatur und Feuchte):

Code: Alles auswählen

AskSin++ V2.1.5 (May  6 2018 14:25:25)
Address Space: 32 - 73
CC init1
CC Version: 14
 - ready
Bat: 27
<- 0C 01 A0 70 345683 670BD5 00 E0 27  - 1708
waitAck: 00
<- 0C 01 A0 70 345683 670BD5 00 E0 27  - 2344
waitAck: 00
<- 0C 01 A0 70 345683 670BD5 00 E0 27  - 2981
waitAck: 00
<- 0C 01 A0 70 345683 670BD5 00 E0 27  - 3618
waitAck: 00
<- 0C 01 A0 70 345683 670BD5 00 E0 27  - 4255
waitAck: 00
<- 0C 01 A0 70 345683 670BD5 00 E0 27  - 4892
waitAck: 00
<- 0C 02 A0 70 345683 670BD5 00 F0 25  - 6537
waitAck: 00
<- 0C 02 A0 70 345683 670BD5 00 F0 25  - 7174
waitAck: 00
<- 0C 02 A0 70 345683 670BD5 00 F0 25  - 7811
waitAck: 00
<- 0C 02 A0 70 345683 670BD5 00 F0 25  - 8448
waitAck: 00
<- 0C 02 A0 70 345683 670BD5 00 F0 25  - 9084
-> 0A 02 80 02 670BD5 345683 00  - 9220
waitAck: 01
<- 0C 03 A0 70 345683 670BD5 00 FD 24  - 10260
-> 0A 03 80 02 670BD5 345683 00  - 10395
waitAck: 01
Ein nicht funktionierender (Am Ende auch 2x Temp und Feuchte)

Code: Alles auswählen

AskSin++ V2.1.5 (May  6 2018 13:34:36)
Address Space: 32 - 73
CC init1
CC Version: 14
 - ready
Bat: 28
<- 0C 01 B0 70 345681 00FFFF 00 EC 2C  - 2062
-> 0C 3F B0 70 345682 00FFFF 00 DE 24  - 2197
waitAck: 00
<- 0C 01 B0 70 345681 00FFFF 00 EC 2C  - 3055
-> 0C 3F B0 70 345682 00FFFF 00 DE 24  - 3190
waitAck: 00
<- 0C 01 B0 70 345681 00FFFF 00 EC 2C  - 4050
-> 0C 3F B0 70 345682 00FFFF 00 DE 24  - 4175
waitAck: 00
<- 0C 01 B0 70 345681 00FFFF 00 EC 2C  - 5044
-> 0C 3F B0 70 345682 00FFFF 00 DE 24  - 5171
waitAck: 00
<- 0C 01 B0 70 345681 00FFFF 00 EC 2C  - 6039
-> 0C 3F B0 70 345682 00FFFF 00 DE 24  - 6164
waitAck: 00
<- 0C 01 B0 70 345681 00FFFF 00 EC 2C  - 7032
-> 0C 3F B0 70 345682 00FFFF 00 DE 24  - 7147
waitAck: 00
<- 0C 02 B0 70 345681 00FFFF 01 03 25  - 9033
waitAck: 00
<- 0C 02 B0 70 345681 00FFFF 01 03 25  - 10022
waitAck: 00
<- 0C 02 B0 70 345681 00FFFF 01 03 25  - 11014
waitAck: 00
<- 0C 02 B0 70 345681 00FFFF 01 03 25  - 12003
waitAck: 00
<- 0C 02 B0 70 345681 00FFFF 01 03 25  - 12992
waitAck: 00
<- 0C 02 B0 70 345681 00FFFF 01 03 25  - 13983
waitAck: 00
<- 0C 03 B0 70 345681 00FFFF 01 0D 25  - 15980
waitAck: 00
<- 0C 03 B0 70 345681 00FFFF 01 0D 25  - 16969
waitAck: 00
<- 0C 03 B0 70 345681 00FFFF 01 0D 25  - 17960
waitAck: 00
<- 0C 03 B0 70 345681 00FFFF 01 0D 25  - 18950
-> 14 E5 84 5E 623C73 000000 85 35 6C 00 00 00 00 00 09 5D FE  - 19118
waitAck: 00
<- 0C 03 B0 70 345681 00FFFF 01 0D 25  - 19945
waitAck: 00
<- 0C 03 B0 70 345681 00FFFF 01 0D 25  - 20934
waitAck: 00
Sketch:

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 EI_NOTEXTERNAL
#include <EnableInterrupt.h>
#include <AskSinPP.h>
#include <LowPower.h>

#include <Adafruit_SHT31.h>
Adafruit_SHT31 sht31 = Adafruit_SHT31();

#include <MultiChannelDevice.h>
                       // https://github.com/spease/Sensirion.git
                       //#include <Sensirion.h>

                       // we use a Pro Mini
                       // Arduino pin for the LED
                       // D4 == PIN 4 on Pro Mini
#define LED_PIN 4
                       // Arduino pin for the config button
                       // B0 == PIN 8 on Pro Mini
#define CONFIG_BUTTON_PIN 8

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

                       //seconds between sending messages
#define MSG_INTERVAL 60

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

// define all device properties
const struct DeviceInfo PROGMEM devinfo = {
  {0x34, 0x56, 0x83},     // Device ID
  "HMTH000003",           // Device Serial
  //{0x00, 0x3d},           // Device Model Outdoor
  {0x00, 0x3f},           // Device Model Indoor
  0x10,                   // Firmware Version
  as::DeviceType::THSensor, // Device Type
  {0x01, 0x00}            // Info Bytes
};

/**
   Configure the used hardware
*/
typedef AvrSPI<10, 11, 12, 13> SPIType;
typedef Radio<SPIType, 2> RadioType;
typedef DualStatusLed<5,4> LedType;
typedef AskSin<LedType, BatterySensor, RadioType> BaseHal;
class Hal : public BaseHal {
  public:
    void init (const HMID& id) {
      BaseHal::init(id);
      // measure battery every 1h
      battery.init(seconds2ticks(60UL * 60), sysclock);
      battery.low(22);
      battery.critical(19);
    }

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

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

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

    WeatherEventMsg msg;
    int16_t         temp;
    uint8_t         humidity;

    //Sensirion       sht10 = Sensirion(A4, A5);
    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");
       //DPRINT("T: "); DDEC(sht31.readTemperature()); DPRINT("  H: "); DDECLN(sht31.readHumidity());
    }

    virtual void trigger (__attribute__ ((unused)) AlarmClock& clock) {
      uint8_t msgcnt = device().nextcount();
      // reactivate for next measure
      tick = delay();
      clock.add(*this);
      measure();

      msg.init(msgcnt, sht31.readTemperature()*10, sht31.readHumidity(), device().battery().low());
      device().sendPeerEvent(msg, *this);
    }

    uint32_t delay () {
      return seconds2ticks(MSG_INTERVAL);
    }
    void setup(Device<Hal, List0>* dev, uint8_t number, uint16_t addr) {
      Channel::setup(dev, number, addr);
      sysclock.add(*this);
    }

    uint8_t status () const {
      return 0;
    }

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

typedef MultiChannelDevice<Hal, WeatherChannel, 1> WeatherType;
WeatherType sdev(devinfo, 0x20);
ConfigButton<WeatherType> cfgBtn(sdev);

void setup () {
  DINIT(57600, ASKSIN_PLUS_PLUS_IDENTIFIER);
  sdev.init(hal);
  buttonISR(cfgBtn, CONFIG_BUTTON_PIN);
  sdev.initDone();
  sht31.begin(0x44);
}

void loop() {
  bool worked = hal.runready();
  bool poll = sdev.pollRadio();
  if ( worked == false && poll == false ) {
    hal.activity.savePower<Sleep<>>(hal);
  }
}
Foto:
Dateianhänge
IMG_20180506_150701.jpg

micha68
Beiträge: 33
Registriert: 28.06.2017, 18:36

Re: Nachbau Temperatur-/Luftfeuchtesensor mit Universalplati

Beitrag von micha68 » 06.05.2018, 15:29

Habe es gefunden. Habe den falschen Bootloader benutzt :roll:
16MHz-Version statt 8MHz-Version...

linuxdep
Beiträge: 137
Registriert: 29.08.2017, 23:17
Hat sich bedankt: 1 Mal

Re: Nachbau Temperatur-/Luftfeuchtesensor mit Universalplati

Beitrag von linuxdep » 06.05.2018, 22:43

Kannst etwas mehr zu deiner Platine/Projekt schreiben?
===========================================================================
Neueinsteiger Homematic/ioBroker/ESP32
OS: Raspbian Stretch 11/2017
+ LXC - pivCCU
+ LXC - Debian stretch mit Mosquitto (MQTT Server)
+ LXC - Debian stretch mit PIHOLE
HW: Raspberry Pi2 V1.1 mit HM-MOD-RPI-PCB Funkmodul
Traum: ioBroker im Docker auf die DS918+, UVR1611-Heizungssteuerung anbindung an HM oder ioBroker
===========================================================================
Nützliche LINKS:
https://asksinpp.de/
===========================================================================

micha68
Beiträge: 33
Registriert: 28.06.2017, 18:36

Re: Nachbau Temperatur-/Luftfeuchtesensor mit Universalplati

Beitrag von micha68 » 07.05.2018, 08:42

Hi!

Ich brauche für eine Anwendung ein paar mobile Temperatursensoren mit Batteriebetrieb.
Dafür habe ich eine Platine gemacht, die die Größe von zwei AA-Batteriehaltern hat.
Die Platine ist unten unbestückt so dass die Batteriehalter flach aufliegen und eingelötet werden können.
Es sind alle freien Pins heraus geführt, PullUps für 1wire und i2c vorgesehen. Für diesen Fall nutze ich jetzt einen SHT30-Sensor mit i2c-Schnittstelle.
Die Platine kann auch mit einem 3.3V-Regler bestückt werden, falls mal irgendwo ein Festeinbau anliegt.

Bootloader ist der 8MHz-Standard von askinpp, der Sketch eine angepasste Version von jp112sdl.
In RaspberryMatic melden sich diese als HM-WDS40-TH-I.

Der Sensor ist ein SHT30, bestellt über ALI: https://de.aliexpress.com/item/Original ... 0.0.utoHK9

Gruß,
Micha
Dateianhänge
HMTempSensor_KICAD.zip
(40.65 KiB) 29-mal heruntergeladen
3d.png
Platine.png
Schaltbild.pdf
(117.03 KiB) 28-mal heruntergeladen

jp112sdl
Beiträge: 3360
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 37 Mal
Danksagung erhalten: 70 Mal
Kontaktdaten:

Re: Nachbau Temperatur-/Luftfeuchtesensor mit Universalplati

Beitrag von jp112sdl » 07.05.2018, 09:40

Hallo Micha.

Lohnt sich der Extraaufwand mit der Platine?
Die ist ja sogar größer als der originale Pro Mini.

Nicht erschrecken, das war mein erster Prototyp mit dem SHT 10 und noch etwas grob verdrahtet :D
IMG_8399.JPG

VG,
Jérôme

micha68
Beiträge: 33
Registriert: 28.06.2017, 18:36

Re: Nachbau Temperatur-/Luftfeuchtesensor mit Universalplati

Beitrag von micha68 » 07.05.2018, 09:49

Hi!

Da Platinen ja kaum noch was kosten, lohnt sich das - in meinen Augen - am Ende schon. Sieht aufgeräumter aus und man hat kein gemache mit dem Lackdraht.

Übrigens sah mein Prototyp ähnlich aus :)

Gruß,
Micha
Dateianhänge
IMG_20180507_094818.jpg

linuxdep
Beiträge: 137
Registriert: 29.08.2017, 23:17
Hat sich bedankt: 1 Mal

Re: Nachbau Temperatur-/Luftfeuchtesensor mit Universalplati

Beitrag von linuxdep » 07.05.2018, 22:36

Das heißt, du lötest auch den MC einzeln auf deine Plantine. Das wäre mir zu fummelig und benötigt entsprechende Werkzeuge. Aber schön finde ich das auf alle Fälle.
Da ist Deimos Platine schon der goldene Mittelweg, fertige Platinen zusammen zu bringen. Schönes gehäuse dazu... das wird es wohl bei mir werden. Mein Arduino aus China ging doch schneller als erwartet, dazu komme ich vorerst nicht bei dem Wetter.
===========================================================================
Neueinsteiger Homematic/ioBroker/ESP32
OS: Raspbian Stretch 11/2017
+ LXC - pivCCU
+ LXC - Debian stretch mit Mosquitto (MQTT Server)
+ LXC - Debian stretch mit PIHOLE
HW: Raspberry Pi2 V1.1 mit HM-MOD-RPI-PCB Funkmodul
Traum: ioBroker im Docker auf die DS918+, UVR1611-Heizungssteuerung anbindung an HM oder ioBroker
===========================================================================
Nützliche LINKS:
https://asksinpp.de/
===========================================================================

jp112sdl
Beiträge: 3360
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 37 Mal
Danksagung erhalten: 70 Mal
Kontaktdaten:

Re: Nachbau Temperatur-/Luftfeuchtesensor mit Universalplati

Beitrag von jp112sdl » 08.05.2018, 07:11

linuxdep hat geschrieben:Das heißt, du lötest auch den MC einzeln auf deine Plantine. Das wäre mir zu fummelig und benötigt entsprechende Werkzeuge. Aber schön finde ich das auf alle Fälle.
Da ist Deimos Platine schon der goldene Mittelweg, fertige Platinen zusammen zu bringen. Schönes gehäuse dazu... das wird es wohl bei mir werden. Mein Arduino aus China ging doch schneller als erwartet, dazu komme ich vorerst nicht bei dem Wetter.
Bei den fertigen Pro Mini Boards aber unbedingt die BOD-Fuse des 328P auf 1.8V setzen oder ganz deaktivieren.
Hab schon häufiger von "Störsendern" gehört (und auch selbst erlebt), wenn beim Senden die Spannung kurz unter die 2.7V (default) fällt.
Dann legt der 328P seine Arbeit nieder und das CC1101 bleibt mit nem Dauer-Sender stehen.
Keine schöne Sache, wenn du auf einmal Kommunikationsstörungen von allen deinen Homematic Geräten in der CCU siehst.
Da wird man leicht panisch! 8) Ist mir auch schon passiert...

VG,
Jérôme

Benutzeravatar
DiJe
Beiträge: 520
Registriert: 04.03.2015, 05:51

Re: Nachbau Temperatur-/Luftfeuchtesensor mit Universalplati

Beitrag von DiJe » 13.05.2018, 13:09

Hallo Jerome,
Bei den fertigen Pro Mini Boards aber unbedingt die BOD-Fuse des 328P auf 1.8V setzen oder ganz deaktivieren.
was ist die BOD Fuse des 328P und wie realisiere ich dieses auf 1,8V zusetzen oder zu deaktivieren ?
Gruß Dieter
Gruß Dieter

micha68
Beiträge: 33
Registriert: 28.06.2017, 18:36

Re: Nachbau Temperatur-/Luftfeuchtesensor mit Universalplati

Beitrag von micha68 » 13.05.2018, 14:19

Hi!

Fuses definieren "feste" Voreinstellungen im Controller. zB Taktfrequenz oder auch BOD (BrownOutDetection).
Diese regelt, ab welcher unteren Spannungsgrenze der Controller sich selbst resettet.
Einstellen lassen sich die Fuses nur mit einem Programmiergerät (avrdude, mkII etc.), nicht per FTDI.

http://www.martyncurrey.com/arduino-atm ... -settings/

http://www.instructables.com/id/How-to- ... -8bit-mic/

Gruß,
Micha

Antworten

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