Vraag


Acties:
  • +1 Henk 'm!

  • BenSKIP
  • Registratie: Oktober 2015
  • Laatst online: 11:45
Beste mensen,

Conform de PGS 37-1 & -2 dient een ruimte waar Lithium cellen worden opgeslagen / gebruikt gemonitord te worden op de aanwezigheid van CO (koolstofmonoxide) H2 (Waterstofgas) Brand (rook) en Temperatuur.

Nu heb ik een mooie sensor gevonden die dit alles waarnemen kan, maar de controller ontbreekt.

Ik ben op zoek naar iemand die deze sensor nuttig in gebruik stellen kan door hier met domotica wat moois me te fabriceren.

Mijn doel:
-Ik zou graag hebben dat de sensor in ALARM gaat als er CO / H2 gedetecteerd wordt en dan een PWM signaal op MAX (10v) zet waarmee ik een EC fan (PWM) aanstuur, zodat het gevormde gas direct afgevoerd wordt.
-Middels de temperatuursensor zou ik de EC fan graag op temperatuur kunnen laten optoeren, zodat de ruimte gekoeld wordt. (Vanaf 25'C aan en dan per stapje temperatuur omhoog het toerental van de EC fan laten optoeren tot de 25'C bereikt is.)
-Het zou mooi zijn als de controller een signaal uit kan sturen als deze in ALARM gaat en ik in kan zien welke waarde de sensor meet. (Maar dit laatste is niet heel belangrijk.)
-Mocht er rook (brand) gedetecteerd worden, dan moet de EC fan meteen UIT.

Ik ben helaas niet thuis in het schrijven van software, maar hoop hiermee iemand te kunnen bereiken die dit voor mij schrijven kan.

Hieronder de benodigde parameters:

Afbeeldingslocatie: https://tweakers.net/i/lEW2F3IhdFStBsKh-eu2riBSc-I=/x800/filters:strip_icc():strip_exif()/f/image/FNIOOBcm1JBJ4EZKTLlNCIjM.jpg?f=fotoalbum_large

Afbeeldingslocatie: https://tweakers.net/i/sYD0VJSJsHF1uVkVSdBhwVJD7Pg=/x800/filters:strip_icc():strip_exif()/f/image/WKwim5GgCPUhWXYn6GuGbmPv.jpg?f=fotoalbum_large

Afbeeldingslocatie: https://tweakers.net/i/Mm5aEL9ngeU1N6VGznuG1EfBVCE=/x800/filters:strip_icc():strip_exif()/f/image/73U4OfWaET2bXKa13YoWBwRo.jpg?f=fotoalbum_large

Afbeeldingslocatie: https://tweakers.net/i/STEkMA8IvyOZWeCEE5r4UNTTEH0=/x800/filters:strip_icc():strip_exif()/f/image/tgYih4KlQGE30D7j8QkHDKKk.jpg?f=fotoalbum_large

Afbeeldingslocatie: https://tweakers.net/i/w5PRx2uj-IIJD2Le3O02FNWDPsk=/x800/filters:strip_icc():strip_exif()/f/image/zGxPpaY5re4axvx489j9pmAL.jpg?f=fotoalbum_large

Afbeeldingslocatie: https://tweakers.net/i/swPziqAB3JaBz1tXxoq6UwIZwhc=/x800/filters:strip_exif()/f/image/Gr1gvEGcA2AoHkdRbi7JQB2w.png?f=fotoalbum_large

Alle reacties


Acties:
  • +1 Henk 'm!

  • grasmanek94
  • Registratie: Juli 2015
  • Laatst online: 11:20
Heb je dan niet liever een kant-en-klaar product die dat alles kan doen?

Eigenlijk moet je dan een ventilator zien te vinden met een vergelijkbare sensor die alles al doet.

Ik kan er zo eentje niet vinden, maar als je je handen wel vies wil maken dan is dit misschien een goed moment om wat basis programmeren/elektronica te leren; wel meteen een serieus onderwerp wat veiligheid betreft dus tip om te laten checken door anderen. Maar absolute veiligheid wil je toch een kant en klaar product.

Goedkoopste die ik zo even WEL kon vinden (niet voor consumenten denk ik): https://www.testequipment...0DUfkbdeuWFjFCE0Xhd-gjE3T

Acties:
  • 0 Henk 'm!

  • BenSKIP
  • Registratie: Oktober 2015
  • Laatst online: 11:45
@grasmanek94 Het is niet dat ik niet vies worden wil. Ik hieb er gewoon geen kaas van gegeten. Ik heb eerder al wel wat met boardjes gedaan, maar daarbij heb ik gewoon dom zitten kopieren en plakken van anderen. De door jou gevonden fan heeft zeer beperkte functies. De ZEH100 kan zoals aangegeven meer en eigenlijk alles wat nodig is. Om die reden zou ik die graag gebruiken.

Acties:
  • 0 Henk 'm!

  • grasmanek94
  • Registratie: Juli 2015
  • Laatst online: 11:20
Ik zou dan zeggen, pak een arduino of ESP32, een RS485 shield, sluit het erop aan, en misschien een AI assistent vragen om wat initiële code te geven.

Ik heb op github gekeken of ik iets zag voor de ZH100 module maar helaas niks gevonden, je zult dus zelf je functies moeten maken in code. Ook op Tweakers kunnen we met eea code vragen helpen.

Acties:
  • 0 Henk 'm!

  • BenSKIP
  • Registratie: Oktober 2015
  • Laatst online: 11:45
Dat is mijn doel inderdaad.

Acties:
  • 0 Henk 'm!

  • BenSKIP
  • Registratie: Oktober 2015
  • Laatst online: 11:45
https://www.alibaba.com/x/1l9rdCq?ck=pdp

Zie SAMPLE prijs.
Let op, dit is ZONDER verzendkosten en BTW!
Kies DDP shipment, dan betaal je alles vooraf.
Hierdoor duurt het wel LANG voor je het pakketje hebt.
Het schijnt ook anders te kunnen.... je kiest en betaald voor express service. Je moet dan BTW en invoerrechten betalen.
Er zijn verhalen bekend dat ze op verzoek de prijs van het product en de prijs voor verzendkosten verlagen waardoor je minder BTW/invoerrechten betaald, maar daar heb ik geen ervaring mee.
Volgens mij heet dit fraude en belastingontduiking, maar er zijn mensen die dit risico willen lopen.

Acties:
  • +1 Henk 'm!

  • naarden 4ever
  • Registratie: Juni 2010
  • Laatst online: 07-10 16:04
Tsja, als er geen kant en klare oplossing voor een acceptabele prijs beschikbaar is, zal je zelf aan de knutsel moeten gaan, of iemand ervoor willen betalen om het voor je te doen.

Wat ik zo snel uit de datasheets kan halen, kan je op twee manieren contact leggen met de sensor, ofwel via CAN ofwel via RS485. Een bordje om via CAN te kunnen communiceren met bijvoorbeeld Arduino zijn er in allerlei soorten en maten te vinden, bijvoorbeeld deze: https://www.bol.com/nl/nl...5-spi-5v/9300000025879869

Voorbeeldcode voor het communiceren via CAN is ook overal te vinden, waaronder ook in de bibliotheken van Arduino voor deze bordjes. Als je de instellingen op de derde pagina van de datasheet die in je TS staat goed implementeert, moet het niet zo moeilijk zijn om deze sensor uit te lezen. De sensor stuurt namelijk gewoon iedere 500ms de actuele waarden door, jouw code hoeft alleen maar te luisteren.

Acties:
  • 0 Henk 'm!

  • BenSKIP
  • Registratie: Oktober 2015
  • Laatst online: 11:45
Ik ben bereid ervoor te betalen. Dat is het probleem ook niet.

Acties:
  • 0 Henk 'm!

  • _ferry_
  • Registratie: Januari 2002
  • Niet online

_ferry_

Moderator Tweaking

Nipple Tweaker

Als het een betaalde klus betreft, dan moet ik je doorverwijzen naar onze vraag en aanbod of een ander platform voor werving. Als je zelf aan de gang gaat maar gewoon wat steun nodig hebt, om de code te verbeteren of fouten te vinden, dan mag dat best in een topic.

Acties:
  • 0 Henk 'm!

  • BenSKIP
  • Registratie: Oktober 2015
  • Laatst online: 11:45
Ik ga het zelf proberen met GitHub. (Waarschijnlijk heb ik daar wel wat sturing bij nodig.)

[ Voor 44% gewijzigd door BenSKIP op 06-10-2025 09:54 ]


Acties:
  • 0 Henk 'm!

  • BenSKIP
  • Registratie: Oktober 2015
  • Laatst online: 11:45
1. What Board To Buy
Main Board
ESP32 Dev Board (e.g., “ESP32 DEVKIT V1”, “ESP32-WROOM-32”)
Buy from a reputable brand or supplier (e.g., AZDelivery, DOIT, Adafruit, SparkFun, etc.).
Add-On Boards/Modules
RS485 to TTL Module (based on MAX485 chip, for connecting ZEH100 sensor)
Optocoupler PWM Module (for safe PWM output to 230V EC fan’s PWM input, e.g., PC817 or pre-made PWM isolation module)
12V DC Power Supply (for ZEH100 and optocoupler, with 5V step-down for ESP32 if needed)
Jumper wires, breadboard or screw terminals for prototyping
2. How to Connect
ESP32 Pinout Recommendation:

Function ESP32 Pin To Module/Device Notes
RS485 DE/RE GPIO18 RS485 Module DE+RE (tie) Direction control
RS485 RX GPIO16 RS485 Module RO Serial RX
RS485 TX GPIO17 RS485 Module DI Serial TX
PWM Output GPIO25 Optocoupler IN (via 1k resistor) PWM to EC fan (use optocoupler!)
3.3V 3V3 RS485 Module VCC (if 3.3V) Or 5V if board supports it
GND G All module GNDs Common ground
ZEH100 sensor wiring:

V+ (Pin 1): 12V DC
G (Pin 4): GND
A (Pin 2): RS485 A
B (Pin 3): RS485 B
EC Fan PWM:

PWM IN: From optocoupler output (isolated from ESP32)
GND: Fan GND (to optocoupler output GND side)
3. Code: ESP32 with WiFiManager and Email Alert
This code:

Lets you choose WiFi from a list (WiFiManager captive portal on first boot).
Reads ZEH100 via RS485.
Controls EC fan speed via PWM using your logic.
Sends an email notification when the fan activates, with current PWM, temp, and gas readings.

Install these Arduino libraries:
WiFiManager
ESP-Mail-Client
You MUST fill in your own SMTP/email provider credentials!
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
zeh100_ecfan_email_esp32.ino
v2
#include <WiFiManager.h>
#include <ESP_Mail_Client.h>
#include <HardwareSerial.h>

// RS485/ZEH100 pins
#define RS485_DE_RE 18
4. In Summary  Shopping List
1x ESP32 Dev Board
1x RS485 to TTL Module (MAX485)
1x Optocoupler PWM Module (or build with PC817)
1x 12V DC Power Supply (enough current for ZEH100 and fan control modules)
1x ZEH100 sensor
1x 230V EC Fan (with 0-10V or 0-5V PWM input)
Jumper wires, breadboard, or screw terminals
Let me know if you want a schematic/wiring diagram, photos, or pre-made Amazon/Aliexpress links for the modules!

---

#include <WiFiManager.h>
#include <ESP_Mail_Client.h>
#include <HardwareSerial.h>

// RS485/ZEH100 pins
#define RS485_DE_RE 18
#define RS485_RX 16
#define RS485_TX 17

// EC Fan PWM
#define FAN_PWM_PIN 25
#define FAN_PWM_CHANNEL 0
#define FAN_PWM_FREQ 25000 // 25kHz
#define FAN_PWM_RES 8      // 8-bit

// Fan logic thresholds
#define TEMP_START 25
#define TEMP_FULL  55
#define TEMP_STOP  60

// Email config - FILL THESE IN
#define SMTP_HOST "smtp.gmail.com"
#define SMTP_PORT 465 // SSL
#define AUTHOR_EMAIL "your_email@gmail.com"
#define AUTHOR_PASSWORD "your_app_password"
#define RECIPIENT_EMAIL "your_email@gmail.com"

// ZEH100 Query cmd for 485
uint8_t zeh100_query[8] = {0x01, 0x03, 0x00, 0x01, 0x00, 0x04, 0x15, 0xC9};

HardwareSerial RS485Serial(2);
bool fanActive = false;
unsigned long lastEmailSent = 0;
const unsigned long emailInterval = 60000; // 1 minute

SMTPSession smtp;

void setup() {
  Serial.begin(115200);

  // WiFiManager for easy WiFi selection
  WiFiManager wm;
  bool res = wm.autoConnect("ECFan_ConfigAP");
  if(!res) {
      Serial.println("Failed to connect. Restarting...");
      ESP.restart();
  }
  Serial.println("WiFi connected!");

  // PWM setup
  ledcSetup(FAN_PWM_CHANNEL, FAN_PWM_FREQ, FAN_PWM_RES);
  ledcAttachPin(FAN_PWM_PIN, FAN_PWM_CHANNEL);

  // RS485
  pinMode(RS485_DE_RE, OUTPUT);
  digitalWrite(RS485_DE_RE, LOW); // RX mode
  RS485Serial.begin(9600, SERIAL_8N1, RS485_RX, RS485_TX);
}

void loop() {
  // Query ZEH100
  digitalWrite(RS485_DE_RE, HIGH); // TX mode
  delay(1);
  RS485Serial.write(zeh100_query, 8);
  RS485Serial.flush();
  digitalWrite(RS485_DE_RE, LOW); // RX mode

  delay(100);

  if (RS485Serial.available() >= 13) {
    uint8_t resp[13];
    RS485Serial.readBytes(resp, 13);

    int co = (resp[3] << 8) | resp[4];
    int h2 = (resp[5] << 8) | resp[6];
    uint8_t tempRaw = resp[9];
    int temp = (int)tempRaw - 40;

    uint8_t alarm = resp[10];
    bool co_alarm = alarm & 0x01;
    bool h2_alarm = alarm & 0x02;
    bool smoke_alarm = alarm & 0x08;

    int fanSpeed = 0;
    String cause = "";

    if (temp >= TEMP_STOP) {
      fanSpeed = 0;
      cause = "Overheat (>60°C)";
    } else if (smoke_alarm) {
      fanSpeed = 100;
      cause = "Smoke detected";
    } else if (co_alarm || h2_alarm) {
      fanSpeed = 100;
      cause = (co_alarm ? "CO " : "") + (h2_alarm ? "H2 " : "");
      cause.trim();
      cause += "alarm";
    } else if (temp >= TEMP_FULL) {
      fanSpeed = 100;
      cause = "Temperature high";
    } else if (temp >= TEMP_START) {
      float ramp = (float)(temp - TEMP_START) / (TEMP_FULL - TEMP_START);
      fanSpeed = 5 + ramp * 95;
      if (fanSpeed > 100) fanSpeed = 100;
      cause = "Temperature ramp";
    } else {
      fanSpeed = 0;
      cause = "Temperature low";
    }

    setFanSpeed(fanSpeed);

    // Email notification logic
    if (fanSpeed > 0 && !fanActive && millis() - lastEmailSent > emailInterval) {
      String msg = "FAN ACTIVATED: Cause: " + cause
          + "\nPWM: " + String(fanSpeed) + "%"
          + "\nTemp: " + String(temp) + "C"
          + "\nCO: " + String(co) + "ppm"
          + "\nH2: " + String(h2) + "ppm";
      sendEmail(msg);
      lastEmailSent = millis();
      fanActive = true;
    } else if (fanSpeed == 0) {
      fanActive = false;
    }

    Serial.printf("CO:%d H2:%d Temp:%d Fan:%d%% Cause:%s\n", co, h2, temp, fanSpeed, cause.c_str());
  }
  delay(500);
}

void setFanSpeed(int percent) {
  int pwm = map(percent, 0, 100, 0, 255);
  ledcWrite(FAN_PWM_CHANNEL, pwm);
}

void sendEmail(String message) {
  SMTP_Message email;
  email.sender.name = "ECFan ESP32";
  email.sender.email = AUTHOR_EMAIL;
  email.subject = "ECFan ALERT";
  email.addRecipient("User", RECIPIENT_EMAIL);
  email.text.content = message.c_str();

  smtp.debug(0);
  smtp.callback(NULL);

  ESP_Mail_Session session;
  session.server.host_name = SMTP_HOST;
  session.server.port = SMTP_PORT;
  session.login.email = AUTHOR_EMAIL;
  session.login.password = AUTHOR_PASSWORD;
  session.login.user_domain = "";

  if (!smtp.connect(&session)) {
    Serial.println("Email connection failed");
    return;
  }
  if (!MailClient.sendMail(&smtp, &email, true)) {
    Serial.println("Email send failed: " + smtp.errorReason());
  } else {
    Serial.println("Email sent!");
  }
  smtp.closeSession();
}
Deze voorgestelde modules blijkt OK
Dan beetje proberen met voorgestelde code.

Acties:
  • 0 Henk 'm!

  • SA007
  • Registratie: Oktober 2002
  • Laatst online: 06-10 16:32

SA007

Moderator Tweaking
Sorry, maar dit werkt zo niet, je kan best de code gaan proberen en met problemen terugkomen, maar verwachten dat mensen een heel ontwerp langslopen is redelijk veelgevraagd.

De hardware keuzes zijn niet raar en zit op een paar tientjes, dus zou het gewoon gaan proberen.

Acties:
  • 0 Henk 'm!

  • BenSKIP
  • Registratie: Oktober 2015
  • Laatst online: 11:45
@SA007 Ik vraag hier niet om het helemaal door te spitten. Meer de vraag of ik enigszins op de goede weg zit. Qua modules al ok, nou das mooi. Dat is een eerste stapje. We gaan kijken of dit zo wel werkt. Heb het aangepast.

[ Voor 4% gewijzigd door BenSKIP op 07-10-2025 07:09 ]


Acties:
  • 0 Henk 'm!

  • Yelti
  • Registratie: Januari 2009
  • Laatst online: 11:02
BenSKIP schreef op dinsdag 7 oktober 2025 @ 06:58:
@SA007 Ik vraag hier niet om het helemaal door te spitten. Meer de vraag of ik enigszins op de goede weg zit. Qua modules al ok, nou das mooi. Dat is een eerste stapje. We gaan kijken of dit zo wel werkt. Heb het aangepast.
Waarschijnlijk zit je idd wel op de goede weg.

Indien je meer automatisatie wil, dan kan je gebruik maken van esphome, evt in combinatie met homeassistant.
Voordeel van homeassistant is vergaande mogelijkheden ivm notificaties(homeassistant app, mail, telegram, ...).

de via copilot gegenereerde esphome code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
esphome:
  name: zeh100_sensor
  platform: ESP32
  board: esp32dev

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: "your_api_password"

wifi:
  ssid: "your_wifi_ssid"
  password: "your_wifi_password"

# UART for RS485
uart:
  id: mod_bus
  tx_pin: GPIO17
  rx_pin: GPIO16
  baud_rate: 9600
  stop_bits: 1

# Modbus configuration
modbus:
  flow_control_pin: GPIO4
  id: modbus1
  send_wait_time: 200ms

modbus_controller:
  - id: zeh100
    address: 0x01       # Device address (check ZEH100 manual)
    modbus_id: modbus1
    setup_priority: -10
    update_interval: 30s

# Sensors from ZEH100 registers (example addresses)
sensor:
  - platform: modbus_controller
    modbus_controller_id: zeh100
    name: "CO Level"
    address: 0x0000
    unit_of_measurement: "ppm"
    register_type: read
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: zeh100
    name: "H2 Level"
    address: 0x0001
    unit_of_measurement: "ppm"
    register_type: read
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: zeh100
    name: "VOC Level"
    address: 0x0002
    unit_of_measurement: "ppm"
    register_type: read
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: zeh100
    name: "Smoke Level"
    address: 0x0003
    unit_of_measurement: "ppm"
    register_type: read
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: zeh100
    name: "Temperature"
    address: 0x0004
    unit_of_measurement: "°C"
    register_type: read
    value_type: U_WORD
    filters:
      - multiply: 0.1

Acties:
  • 0 Henk 'm!

  • BenSKIP
  • Registratie: Oktober 2015
  • Laatst online: 11:45
Dank Yelti,

Voor zover ik de door jou gegenereerde code begrijp is dit slechts bedoeld voor het doorgeven van de 'meterstanden'. Ik wil ook dat de ESP32 (of een andere) de waarden vanuit de ZEH100 omzet in actie.

Bij temp: >22'C moet de EC fan gaan draaien. Neemt de temp toe, dan moet de EC fan gaan optoeren. (PWM)
Bij temp: >60'C moet de fan UIT (stront aan de knikker, dus geen zuurstof meer toevoegen.)
Bij ROOK moet het MAX optoeren, tenzij de temp >60'C bereikt is.
Bij detectie van CO (g) of H (g) moet de EC fan MAX toeren draaien. (tenzij >60'C dan EC fan uit.)

Waarom 60'C? 70'C is max range van de ZEH100. De ruimte zal de 60'C niet halen.
(denk ik)
Pagina: 1