Manual - Elektor cloc 2.0 kit

Page 1

220564-006 dp dp dp a b c d e f g a b c d e f g +5V Power +3V3 3 2 1 3V3 +3V3 +5V Extension +5V +5V R1 47k C1 100µ C2 100n R5 22 K2 1 2 3 4 5 6 R2 820 LED1 Blue R3 330 LED2 Orange 330 BUZ1 IC2 TSOP34338 R9 10k C5 47µ 16V C6 100n K3 D1 1N5817 C4 220µ 16V C3 100n 10 CC 7 6 4 2 1 9 a b c d e f g LED5 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 Elektor Cloc 2.0  English version  Deutsche Version  Nederlandse versie  Version française * SINCE 1961 * Clock 2.0

Cloc 2.0: The Alarm Clock You’ve Always Wanted

Clocks are probably one of the most popular topics in DIY electronics, together with radio receivers. I wouldn’t be surprised if every reader of this article has built a clock at least once. I have built a lot of clocks in my life, and many had alarm functions. Because of this, I know what I want from an alarm clock. As my ideal alarm clock is not available commercially, I built it myself. Cloc 2.0, presented here, is the result.

I built my first clock in 1971 using Nixie tubes from an old IBM computer display that I had been given. The board used an impressive number of components, and the precision was about ten seconds per day. In the years that followed, I designed and built many clocks, including the most famous ones from Elektor.

My Nixie clock was also used as an alarm clock, and it’s a feature I developed a lot over the years by simplifying the human-machine interface as much as possible. My last alarm clock was based on a PIC32 processor with two displays (Figure 1). It had an ESP8266 module to set the time automatically from an online time server over NTP. The PIC32 pressed buttons on a real remote control to turn on my favorite radio station or play music. A rotary encoder and two push-buttons allowed setting the alarm clock. This alarm clock was the basis of the project described below: Cloc 2.0.

project
2 www.elektormagazine.com
Figure 1: Cloc 1.0, the predecessor of Cloc 2.0. Based on a PIC32, it used a real remote control as IR output.

Beautiful and Easy to Reproduce

I wanted to make an alarm clock that was easy to build, did not use SMD parts, and fit as easily as possible into a standard commercially available enclosure. I also wanted to keep the retro touch of the 7-segment displays, whose variable brightness makes the alarm clock very readable at night without being too disturbing when you like to sleep in the dark.

The Web Interface

Cloc connects to a Wi-Fi network, so it can access a time-server somewhere on the planet. It can connect using DHCP or with a fixed IP address. Once it is connected, you can access its web server to know the time, set the alarms and adjust the clock’s parameters. The optimized graphical HTML interface works on most standard browsers and handheld devices. The interface consists of three panels: Main, Alarm and Settings.

Main Panel

The main panel (Figure 2) displays the current time and date, and the start and end time of the upcoming alarm. It also shows the SSID of the Wi-Fi network it is connected to with the signal strength RSSI. The color of the latter (green, orange, or red) depends on its value. The main panel is refreshed approximately every second.

Alarm Panel

The alarm panel (Figure 3) is used to set the alarm times for each day of the week. Unchecking a weekday disables the alarm for that day. It is also possible to disable all alarms with a single click.

The duration of the alarm is configurable too. At the start of an alarm, the Media ON command is sent using the infrared LED; at the end of

the alarm, the IR Media OFF command is sent. Additionally, the alarm can sound the buzzer (to be enabled in the Settings panel).

Each time an alarm parameter is changed, a short beep is emitted. If the value changed with respect to its previous value, it is saved in the EEPROM.

Settings Panel

The following parameters can be adjusted. See Figure 4.

> High-brightness display period (Bright Start and Bright Stop).

> The moment when the upcoming alarm time will be displayed (Alarm J+1), e.g., in the evening when you go to bed or immediately after the last alarm (by ticking the End of previous alarm box).

> Daylight-saving time, automatic or manual.

> Infrared (IR) Media ON and Media OFF code to control another device (i.e., a radio).

> Enable/disable the buzzer.

> Wi-Fi network credentials using either DHCP or a fixed IP address.

Push Buttons

Cloc has two push-buttons for interacting with the user: S1 (Disable) and S2 (Stop). In normal operation mode, pressing S1 enables or disables the alarm (the lower display switches on or off). You can also (de)activate the alarm through the web interface. If S1 is pressed down when switching on Cloc’s power, the default values as defined in the program (and that you must adapt to your own needs before programming the clock!), are restored. This is the thing to do when you switch on the clock for the very first time.

Figure 2: The Main panel shows besides the current time and date an overview of the most important settings. Figure 3: The Alarm panel lets you set the alarm time for every day of the week.
3
Figure 4: All the user-configurable parameters are found in the Settings panel.

Figure 5: The ESP32-PICO-KIT provides Internet connectivity and the time, while the MAX7219 controls eight 7-segment digits organized in two rows. Note the IR interface around IC2 (input) and LED4 (output).

TIME ALARM * LED5...12 = SC56-11EWA 220564-006 BOOT EN USB dp dp dp dp dp dp dp dp TSAL6400 (IR) a b c d e f g dp dp dp dp dp dp dp dp dp a a a a b b b b c c c c d d d d e e e e f f f f g g g g g f e d c b a g f e d c b a g f e d c b a a b c d e f g +5V Power +3V3 3 2 1 3V3 +3V3 +5V Extension +3V3 +5V +3V3 +3V3 Disable +5V +5V FSD0 FSD2 FSVP FSVN IO25 IO26 IO32 IO33 IO27 IO14 IO12 IO13 IO15 FSD1 FSD3 FCLK RXD0 TXD0 IO21 IO22 IO19 IO23 IO18 IO10 IO35 IO34 IO38 IO37 FCS IO2 IO4 IO0 3V3 GND GND 3V3 IO5 IO9 5V EN MOD1 ESP32 Pico-Kit V4 IC1 MAX7219 CNG SEGDP DOUT LOAD ISET SEGC SEGD SEGG SEGA SEGB SEGE SEGF DIG0 DIG1 DIG2 DIG3 DIG4 DIG5 DIG6 DIG7 DIN CLK 24 13 12 18 19 14 16 20 23 21 15 17 22 11 10 1 4 9 2 6 7 3 5 8 R1 47k C1 100µ 16V C2 100n R8 330Ω R5 22 Ω LED4 IR T1 BC337 R6 10k R7 10k S1 Stop S2 C7 1µ 16V K2 1 2 3 4 5 6 R2 820 Ω LED1 Blue R3 330 Ω LED2 Orange R4 330 Ω LED3 Red BUZ1 IC2 TSOP34338 R9 10k C5 47µ 16V C6 100n K3 D1 1N5817 C4 220µ 16V C3 100n LED9 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED10 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED11 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED12 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED5 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED6 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED7 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED8 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 K1 1 2 3 4
4 www.elektormagazine.com

When an alarm was triggered in normal mode, pressing S2 will immediately stop it and the bottom display stops flashing. Pressing S2 without an alarm sounding sends the IR media ON/OFF code to the device of your choice. This lets you use the clock as a simple remote control.

If S2 is pressed during power-on, the clock will enter Access Point (AP) mode at address 192.168.4.1. You can connect to it using a cell phone, a tablet, or a computer to access the web interface where you can configure every user-programmable parameter of the device.

Circuit Description

The schematic of Cloc 2.0 is shown in Figure 5. Almost two thirds of it are taken up by the two 7-segment displays and its driver, IC1. To drive the eight digits, four per display (time & alarm), I used the MAX7219. It has a 2-wire SPI bus (DIN is not used) and it is easy to program thanks to open-source libraries. Resistor R1 allows setting the maximum brightness of the display (the higher its value, the dimmer the displays). Note that high-brightness 7-segment digits are really bright, and maybe too bright for an alarm clock.

The ESP32 module chosen for Cloc is the ESP32-PICO-KIT, which offers many I/O ports, and which has the perfect dimensions for this project. Capacitor C7 is only needed when the ESP32 module stays in reset mode after power-up. Some (older?) ESP32 modules appear to suffer from this problem, but I have never noticed it. If you decide to mount it, mount it lying down and pointing away from R6 and R7.

The alarm buzzer BUZ1 (without integrated oscillator) is driven by a PWM signal on port IO27 of the ESP32.

The ESP32’s ports IO34 and IO35 are wired to the push-buttons S1 and S2, and connector K1. In a typical build, S1 and S2 would be mounted on top of the clock instead of on the PCB, which is why K1 is there.

Pull-up resistors of 10 kΩ are used (R6 & R7) even though the ESP32 has built-in pull-ups. But as they have values of several hundreds of kilo-ohms, relying only on them makes a button wired this way a bit more sensitive to noise.

Three (debug) LEDs (LED1, LED2 & LED3) indicate the Wi-Fi network connection status (blue), web server interface connection (orange) and IR in- and outbound traffic (red).

IR Interface

C5 and C6 decouple infrared receiver IC2 to recover an IR signal as clean as possible. The infrared TX LED (LED4) is controlled by transistor T1. The current through it is limited by R5 to about 150 mA. The IR output is powerful enough to control any equipment in its vicinity in the same way as the equipment’s original remote control would do.

Power Supply

The external 5 V DC power supply must be able to deliver at least 500 mA. Diode D1 protects the circuit against a polarity inversion. Two electrolytic capacitors (C1 & C4) provide buffering for current peaks. Small 100 nF capacitors in parallel (C2 & C3) are intended for attenuating higher frequency noise.

COMPONENT LIST

Resistors

R1 = 47 kΩ

R2 = 820 Ω

R3, R4, R8 = 330 Ω

R5 = 22 Ω

R6, R7, R9 = 10 kΩ

Capacitors

C1 = 100 µF, 16 V

C2, C3, C6 = 100 nF

C4 = 220 µF, 16 V

C5 = 47 µF, 16 V

C7 = 1 µF, 16 V

Semiconductors

D1 = 1N5817

IC1 = MAX7219

IC2 = TSOP34338

LED1 = blue, 3 mm

LED2 = orange, 3 mm

LED3 = red, 3 mm

LED4 = TSAL6400, IR LED, 5 mm

LED5-12 = 7-segment digit 0.56”, CC (e.g. SC56-11EWA)

T1 = BC337

Miscellaneous

BUZ1 = Piezo buzzer without oscillator, 12 mm, 3.3 V

K1 = Pinheader 1x4

K2 = Pinheader 1x6

K3 = Barrel jack

MOD1 = ESP32-PICO-KIT

S1, S2 = Tactile switch 6x6 mm

PCB 220465-1

Enclosure Hammond 1591CTDR (translucent red)

DS3231 real-time clock (RTC) module

5

Extensions

Connector K2 allows extending the clock with, for instance, a real-time clock module (see below). Three I/O ports are available for this: IO4, IO26 and IO32.

Real-Time Clock (RTC) Option

A DS3231 RTC module can be connected to extension bus K2. The RTC takes over if the NTP server is inaccessible for some reason (e.g., Wi-Fi is down, or a problem at the internet provider’s end). The RTC module is detected and configured automatically by the software and updated once a day (at 12:00). The DS3231 is a very capable chip featuring crystal drift compensation thanks to an integrated temperature sensor.

The DS3231 RTC module sports an I²C interface and connecting it to K2 requires only four wires: GND, 3.3 V, SDA and SCL. If an RTC module is detected, port IO26 becomes the SDA signal while port IO32 takes care of the SCL signal of the I²C bus.

Danger!

Be careful, these RTC modules can be dangerous! Indeed, the module features a battery charging circuit, but it often comes with a non-rechargeable CR2032 battery installed that might eventually explode. There are two solutions to this problem. The easy but more expensive one is to replace the battery by a rechargeable LIR2032 battery. The second solution is to remove the diode or the 200 Ω resistor (or both) near the SCL pin of the 4-pin connector, see Figure 6.

Mechanical Details

A good enclosure for Cloc is the 1591CTDR from Hammond, which measures 120 mm by 63 mm by 38 mm. It is translucent (IR) red and perfect for the time-of-day and alarm time 7-segment displays (red and/ or orange). The transmission and reception of IR signals also benefit from such an optical filter. Note that light with little or no red content (like the blue LED) is hardly visible due to this filtering.

And while we’re on the subject of LEDs, the ESP32-PICO-KIT has a (way too) bright red power LED that you probably want to hide or remove.

The printed circuit board (PCB) was designed with this enclosure in mind. The KiCad6 project can be downloaded from [1]. The board, mounted on four 16 mm studs, fits perfectly inside the enclosure, as shown in Figure 7. Only four 3.2 mm holes need to be drilled in the

bottom to fix the board, one 8 mm hole is needed on the side for the power connector, and two 12 mm holes on top allow inserting two nice push buttons.

The optional RTC module can be connected under the main PCB to K2 with its component side up using the 4-pin non-populated header (you may want to remove the 6-pin angled header to prevent short circuits). You can also stick it to the main PCB with double-sided adhesive tape (as I did).

The Software Development Environment

I used the Arduino IDE to develop the software for Cloc 2.0 with the ESP32 boards package added to it. To avoid compilation or memory management errors, you must select the board ESP32 PICO-D4 with a 240 MHz CPU frequency. For the Partition Scheme choose Default (i.e., 4 MB with SPIFFS). If you select the right serial port, then compiling and uploading the program should go smoothly!

The following external libraries must be installed in the IDE before compiling the program. I have indicated in the source code where to get them. Most can also be obtained using the IDE’s Library Manager

> AsyncElegantOTA

> AsyncTCP

> ESPAsyncWebServer

> IRremote (see line 126 of Alarm_Clock.ino).

> LedControl

> RTClib

Important: LedControl.h must be modified. Line 30 (#include <avr/ pgmspace.h>) must be commented out. Also see the comment in the source code.

The download [1] contains a folder named libraries which includes all the libraries used, including the pre-modified LedControl.h. Copy these libraries into libraries subfolder of the Arduino sketchbook folder (you can see where it is by going to the IDE’s Preferences window).

Refer to [2] to learn how to add the ESP32 Sketch Data Upload option to the IDE. You’ll need it to load the clock’s web interface into the ESP32 module’s data memory. Don’t forget to upload this data; otherwise the web server will not work.

Figure 6: If the (optional) DS3231 real-time clock (RTC) module is used with a non-rechargeable CR2032 button cell, remove the resistor or the diode (or both) in the red circle to avoid damaging the battery.
6 www.elektormagazine.com
Figure 7: The assembled board fits nicely inside the enclosure. Note that you can also mount it on the cover instead to hide the enclosure’s screws. The power supply connector can be mounted on either side of the board.

Over-the-Air (OTA)

To remotely update the firmware of the alarm clock, point a browser to IP_of_cloc/update where IP_of_cloc represents the IP address of the clock. You can now pick an executable on your computer and upload it to the clock. A detailed explanation of the OTA interface is available at [3].

Program Internals

The program is quite well documented (unfortunately often in French), and after reading the following, you should find your way around easily. You might want to monitor the serial port of the ESP32 because a lot of debug information is sent on it.

After including the libraries, the default values are defined that are used either on the first boot, by holding down the alarm disable key (S1), or from the Settings page after clicking the Defaults button. The order of the constants follows the order of the parameters in the Settings panel (lines 40 to 65 of Alarm_Clock.ino). Check in particular the fixed IP address and gateway, as well as Wi-Fi credentials. For the Alarm panel (lines 67 to 84) things are organized the same way.

At power up, the function setup is executed first. It is easy to follow the initialization order of the Cloc hardware. The function initRTC checks if a DS3231 RTC module is connected. If button S1 is being held down at this time, the default values will be loaded.

If this is the clock’s first boot or if the button Stop (S2) is pressed during power up, the clock will enter Access Point (AP) mode. In this case, you can connect with a browser to its web interface at 192.168.4.1, as indicated by the clock.

After retrieving the IP address (DHCP or fixed) and connecting to the Wi-Fi network, we look for the NTP time. If it is found and an RTC is present, they will be synchronized. The clock’s IP address is shown

Specifications

> Based on an ESP32 processor.

> Two independent 7-segment displays for the time of day and the alarm time.

> The time is set automatically by connecting to an online time-server.

> Alarm time for each day of the week.

> The alarm output: buzzer and infrared code for e.g. radio, hi-fi system or TV.

> Two push-buttons for interacting with the device.

> Integrated web server for remote configuration via Wi-Fi.

> All settings are saved in EEPROM.

> Over-the-Air (OTA) mode allows updating the firmware remotely.

> Optional DS3231-based real-time clock (RTC) module with back-up battery.

briefly before switching to time display. If the display starts flashing ‘HH:HH’ on the time display and ‘AA:AA’ on the alarm display, the NTP server could not be reached, and you must reboot the device (if no RTC is present; otherwise it displays the RTC Time).

Initialization ends by starting the web server and the AsyncOTA service, which allows doing a remote update of the firmware and SPIFFS.

The function loop executes the rest of the program in an endless loop. If the RTC is present (flagRTC=1), it reads the RTC time. Without RTC, it tries the NTP time (NTPflag=1). Once the clock is connected, the program reads the RTC time, while strTime contains the NTP time as “hh:mm:ss” if it is valid or as ’0’ otherwise.

Then the state of the buttons is checked (checkButtons) and it checks if the clock must beep and if an IR code was received. Since the server is asynchronous, we must use flags to signal parameter changes and alarm triggers to the main program.

The screen is refreshed every second (dispTime ) and the alarms are checked (checkAlarm ). Also, the program checks if it is in the high-brightness period or not ( checkBrightness ) and if it must synchronize the RTC with the NTP time (checkSyncRTC). This happens once a day at 12:00 (syncRTC=12*60). The function checkTimer checks if an alarm must be activated. For this, the time-of-day and the alarm time are converted to minutes (computeMinutes) before comparing them (testRange).

As mentioned before, the server is asynchronous. Each time the Settings or Alarm panel is refreshed, the data to be displayed (ParametresProcessor and TimerProcessor) is returned. For this, the %value% tags contained in the HTML page must be replaced by the real values.

For the main panel, it’s a bit different because we must display almost in real time the time of day, the date, and the alarm start and stop times. A function written in JavaScript queries approx. every second the main program to retrieve the values to display (onDataUpdate). At each query, LED2 flashes briefly to indicate that the server is being accessed (flashRqstBeacon). To check that the page is indeed displaying the values in real time, press S1 (Alarm Disable). The alarm time is displayed or turned off simultaneously on both the 7-segment display and on the HTML page.

Regarding the IRremote Library

The IRremote library works perfectly fine, but requires some integration rules. Do not move the initialization sequences unless you know what you are doing.

To wake up to music instead of a beep, I use a Bose radio. Therefore, I limited the reception and decoding to Bose remote controls (see line 125 of Alarm_Clock.ino ). You can remove this line to decode other remotes. However, I recommend limiting infrared reception to the brand of your radio or hi-fi system. Refer to [4] for possible options.

7

Similarly, IR transmission is limited to the Bose format. Therefore, it is quite likely that you must adapt the code to the brand of the Hi-Fi equipment you use. Replace the line IrSender.sendBoseWave in the functions startMedia and stopMedia in Alarm_Clock.ino by a function that corresponds to your brand (again, refer to [4]).

To find out which IR codes to use for your (audio) system, connect the USB port of the ESP32 module to a computer running a serial monitor, for instance the Serial Monitor built in the Arduino IDE. Point your remote control to the clock’s IR receiver and press a key to display the corresponding code in hexadecimal on the computer. Enter the codes in hexadecimal in the Media ON and Media OFF fields of the Settings panel.

IR activity is indicated by LED3 flashing briefly. As a result, this LED also flashes when an alarm is active.

A DIY Solution

I’ve been using this new version of Cloc 2.0 for several months now, and I’ve never overslept due to it malfunctioning. The ability to set alarm times for each day of the week is very convenient.

Related Products

> ESP32-PICO-Kit V4 (SKU 18423) www.elektor.com/18423

> Elektor Arduino Electronics Bundle (SKU 19440) www.elektor.com/19440

> SparkFun Real Time Clock Module – RV-8803 (Qwiic) (SKU 19646) www.elektor.com/19646

I highly recommend adding the RTC option because if the NTP server does not respond (for instance because your modem got offline for some reason), the alarm clock will lose time at the next NTP time resynchronization moment. You will then have to stop and restart the alarm clock when the NTP time is available again. For even more reliability, I built a small NTP server which receives the time from a GPS [5]. So, even if the Internet connection is cut, my alarm clock can set itself automatically.

I hope that many of you will make this clock. Please don’t hesitate to contact me on my private email (yb.electronique@orange.fr) if you encounter any difficulties or if you make any improvements to my favorite alarm clock!

220564-01

Questions or Comments?

Do you have technical questions or comments about this article? Email the author at yb.electronique@orange.fr or contact Elektor at editor@elektor.com.

WEB LINKS

[1] Downloads for Cloc 2.0 at Elektor Labs: https://www.elektormagazine.com/labs/cloc-le-reveil-20

[2] ESP32 SPIFFS data upload: https://randomnerdtutorials.com/install-esp32-filesystem-uploader-arduino-ide/

[3] ESP32 OTA (Over-the-Air) Updates: https://randomnerdtutorials.com/esp32-ota-over-the-air-arduino/

[4] IRremote library: https://github.com/Arduino-IRremote/Arduino-IRremote

[5] NTP Server at Elektor Labs: https://www.elektormagazine.com/labs/ntp-server

8 www.elektormagazine.com
9 www.elektormagazine.com/Member Also available The Elektor web archive from 1974! 8x Elektor Magazine (print) 8x Elektor Magazine (digital) 10% discount in our web shop and exclusive offers Access to more than 5000 Gerber files The Digital membership! Join the Elektor C mmunity Take out a membership! GOLD membership GREEN membership The Elektor web archive from 1974! 8x Elektor Magazine (digital) 10% discount in our web shop and exclusive offers Access to more than 5000 Gerber files

Cloc 2.0:

Der Wecker, den Sie sich schon immer gewünscht haben

Uhren sind wahrscheinlich das beliebteste Thema in der DIYElektronik, zusammen mit Radioempfängern. Es würde mich nicht wundern, wenn jeder Leser dieses Artikels mindestens einmal eine Uhr gebaut hat. Ich habe in meinem Leben schon viele Uhren entworfen, und viele davon hatten Weckfunktionen. Daher weiß ich, was ich von einem Wecker erwarte. Da mein idealer Wecker nicht auf dem Markt erhältlich ist, habe ich ihn selbst gebaut. Cloc 2.0 ist das Ergebnis meiner Bemühungen und genau dies will ich hier vorstellen.

projekt
Von
10 www.elektormagazine.de
Bild 1. Cloc 1.0, der Vorgänger von Cloc 2.0. Die Uhr basiert auf einem PIC32 und verwendet eine echte Fernbedienung als IRAusgang.

Meine erste Uhr baute ich im Jahr 1971 mit Nixie-Röhren aus einem alten IBM-Computerdisplay, das ich geschenkt bekommen hatte. Die Platine enthielt eine beeindruckende Anzahl von Bauteilen, und der Fehler betrug etwa zehn Sekunden pro Tag. In den folgenden Jahren habe ich viele Uhren entworfen und gebaut, darunter auch die berühmtesten von Elektor.

Meine Nixie-Uhr habe ich auch als Wecker verwendet. Die Funktionen habe ich im Laufe der Jahre immer weiterentwickelt, insbesondere die Schnittstelle zwischen Mensch und Maschine so weit wie möglich vereinfacht. Mein letzter Wecker basierte auf einem PIC32-Controller mit zwei Displays (Bild 1). Er verfügte über ein ESP8266-Modul, um die Zeit automatisch von einem Online-Zeitserver über NTP einzustellen. Der PIC32 „drückte“ Tasten auf einer echten Fernbedienung, um meinen Lieblingsradiosender einzuschalten oder Musik abzuspielen. Ein Drehencoder und zwei Drucktasten ermöglichten das Einstellen des Weckers. Dieser Wecker war die Grundlage für das neue Projekt Cloc 2.0.

Schön und leicht nachzubauen

Ich wollte einen Wecker bauen, der einfach zu bauen ist, ohne SMD-Bauteile und leicht in ein handelsübliches Gehäuse passend. Außerdem wollte ich den Retro-Touch der 7-Segment-Anzeigen beibehalten, deren variable Helligkeit den Wecker nachts sehr gut ablesbar macht, ohne dass er zu sehr stört, wenn man gerne im Dunkeln schläft.

Die Webschnittstelle

Cloc verbindet sich mit einem WLAN, so dass der Wecker auf einen beliebigen Zeitserver zugreifen kann. Die Verbindung kann über DHCP oder mit einer festen IP-Adresse hergestellt werden. Sobald die Verbindung steht, können Sie auf den Webserver zugreifen, um die Uhrzeit zu erfahren, die Alarme einzustellen und die Parameter

der Uhr anzupassen. Die optimierte grafische HTML-Schnittstelle, die aus den drei Bereichen ESP32 CLOCK (das Hauptmenü), Alarm und Settings (Einstellungen) besteht, funktioniert auf den meisten Standardbrowsern und Handheld-Geräten.

Das Hauptfenster (Bild 2) zeigt die aktuelle Uhrzeit (NTP Time) mit Datum sowie die Start- und Endzeit des bevorstehenden Alarms an. Es zeigt auch die SSID des WLAN-Netzwerks, mit dem es verbunden ist, sowie dessen Signalstärke RSSI an. Die Farbe der RSSI-Anzeige (grün, orange oder rot) hängt wie bei einer Ampel vom Feldstärkebereich ab. Das Hauptfenster wird etwa jede Sekunde aktualisiert.

Das Alarmfeld in Bild 3 dient der Einstellung der Alarmzeiten für jeden Wochentag. Wenn Sie einen Wochentag abwählen, wird der Alarm für diesen Tag deaktiviert. Es ist auch möglich, alle Alarme mit einem einzigen Klick zu deaktivieren (Disable Alarm).

Auch die Dauer des Alarms (Duration) ist konfigurierbar. Zu Beginn eines Alarms wird der Befehl Media ON über die Infrarot-LED gesendet, am Ende des Alarms wird der IR-Befehl Media OFF gesendet. Zusätzlich kann der Alarm einen Summer auslösen (muss in Settings aktiviert werden).

Bei jeder Änderung eines Alarmparameters wird ein kurzer Signalton ausgegeben. Wenn sich der Wert gegenüber dem vorherigen Wert geändert hat, wird er im EEPROM gespeichert.

Settings

Die folgenden Parameter können im Einstellungs-Panel eingestellt werden (Bild 4):

ESP32 CLOCK Alarm Panel Bild 2. Das Main-Panel zeigt neben der aktuellen Uhrzeit und dem Datum eine Übersicht über die wichtigsten Einstellungen. Bild 3. Im Alarm-Panel können Sie die Alarmzeit für jeden Wochentag einstellen.
11
Bild 4. Im Settings-Panel lassen sich alle vom Benutzer konfigurierbaren Parameter einstellen.

Bild 5. Der ESP32-PICO-Kit sorgt für die Internetverbindung und stellt die Uhrzeit bereit, während der MAX7219 2x4 7-Segment-Ziffern ansteuert. Beachten Sie die IR-Schnittstelle um IC2 (Eingang) und LED4 (Ausgang).

TIME ALARM * LED5...12 = SC56-11EWA 220564-006 BOOT EN USB dp dp dp dp dp dp dp dp TSAL6400 (IR) a b c d e f g dp dp dp dp dp dp dp dp dp a a a a b b b b c c c c d d d d e e e e f f f f g g g g g f e d c b a g f e d c b a g f e d c b a a b c d e f g +5V Power +3V3 3 2 1 3V3 +3V3 +5V Extension +3V3 +5V +3V3 +3V3 Disable +5V +5V FSD0 FSD2 FSVP FSVN IO25 IO26 IO32 IO33 IO27 IO14 IO12 IO13 IO15 FSD1 FSD3 FCLK RXD0 TXD0 IO21 IO22 IO19 IO23 IO18 IO10 IO35 IO34 IO38 IO37 FCS IO2 IO4 IO0 3V3 GND GND 3V3 IO5 IO9 5V EN MOD1 ESP32 Pico-Kit V4 IC1 MAX7219 CNG SEGDP DOUT LOAD ISET SEGC SEGD SEGG SEGA SEGB SEGE SEGF DIG0 DIG1 DIG2 DIG3 DIG4 DIG5 DIG6 DIG7 DIN CLK 24 13 12 18 19 14 16 20 23 21 15 17 22 11 10 1 4 9 2 6 7 3 5 8 R1 47k C1 100µ 16V C2 100n R8 330Ω R5 22 Ω LED4 IR T1 BC337 R6 10k R7 10k S1 Stop S2 C7 1µ 16V K2 1 2 3 4 5 6 R2 820 Ω LED1 Blue R3 330 Ω LED2 Orange R4 330 Ω LED3 Red BUZ1 IC2 TSOP34338 R9 10k C5 47µ 16V C6 100n K3 D1 1N5817 C4 220µ 16V C3 100n LED9 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED10 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED11 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED12 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED5 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED6 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED7 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED8 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 K1 1 2 3 4
12 www.elektormagazine.de

> Dauer der hell leuchtenden Anzeige (Bright Start und Bright Stop)

> Der Zeitpunkt, zu dem die nächste Weckzeit angezeigt wird (Alarm J+1), zum Beispiel abends beim Zubettgehen oder unmittelbar nach dem letzten Alarm (durch Markieren des Kästchens End of previous alarm).

> Sommerzeit, automatisch oder manuell

> Infrarot: Media ON- und Media OFF-Code zur Steuerung eines anderen Geräts (beispielsweise eines Radios)

> Aktivieren/Deaktivieren des Summers

> Anmeldeinformationen für das WLAN-Netzwerk mit DHCP oder einer festen IP-Adresse

Drucktasten

Cloc stellt dem Benutzer zwei Drucktasten zur Interaktion zur Verfügung: S1 (Disable) und S2 (Stop). Im normalen Betriebsmodus wird durch Drücken von S1 der Alarm aktiviert oder deaktiviert (die untere Anzeige schaltet sich ein oder aus). Sie können den Alarm auch über das Webinterface (de)aktivieren. Wenn S1 beim Einschalten von Cloc gedrückt wird, werden die Standardwerte wiederhergestellt, wie sie im Programm definiert sind (und die Sie vor dem Programmieren der Uhr an Ihre eigenen Bedürfnisse anpassen müssen!). Dies ist der richtige Weg, wenn Sie die Uhr zum ersten Mal einschalten.

Wenn im normalen Modus ein Alarm ausgelöst wurde, wird er durch Drücken von S2 sofort gestoppt und die untere Anzeige hört auf zu blinken. Wenn Sie S2 drücken, ohne dass ein Alarm ertönt, wird der IR-Code Media ON/OFF an ein Gerät Ihrer Wahl gesendet. So können Sie die Uhr als einfache Fernbedienung verwenden.

Wenn S2 während des Einschaltens gedrückt wird, geht die Uhr mit der Adresse 192.168.4.1 in den Access-Point-Modus. Sie können sich über ein Mobiltelefon, ein Tablet oder einen Computer mit der Uhr verbinden, um auf die Webschnittstelle zuzugreifen, über die sich alle frei programmierbaren Parameter des Geräts konfigurieren lassen.

Beschreibung der Schaltung

Der Schaltplan von Cloc 2.0 ist in Bild 5 dargestellt. Fast zwei Drittel des Schaltplans werden von den beiden 7-Segment-Anzeigen und ihrem Treiber-IC1 eingenommen. Zur Ansteuerung der acht Ziffern, je vier für Zeit- und Alarm-Anzeige, habe ich den MAX7219 verwendet. Der DIN-Pin wird ignoriert und stattdessen der 2-Draht-SPI-Bus als Dateneingang verwendet. Dank Open-Source-Bibliotheken ist der Treiber leicht zu programmieren. Mit dem Widerstand R1 lässt sich die maximale Helligkeit der Anzeige einstellen (je höher der Wert, desto dunkler die Anzeige). Beachten Sie, dass High-Brightness-7-SegmentZiffern sehr hell sind, viel zu hell für einen Wecker.

Das für Cloc gewählte ESP32-Modul ist das ESP32-PICO-Kit, das viele I/O-Ports bietet und die perfekten Abmessungen für dieses Projekt aufweist. Der Kondensator C7 wird nur benötigt, wenn das ESP32Modul nach dem Einschalten im Reset-Modus verbleibt. Einige (ältere?) ESP32-Module sollen angeblich unter diesem Problem leiden, aber

STÜCKLISTE

Widerstände:

R1 = 47 k

R2 = 820 Ω

R3, R4, R8 = 330 Ω

R5 = 22 Ω

R6, R7, R9 = 10 k

Kondensatoren:

C1 = 100 µ, 16 V

C2, C3, C6 = 100 n

C4 = 220 µ, 16 V

C5 = 47 µ, 16 V

C7 = 1 µ, 16 V

Halbleiter:

D1 = 1N5817

IC1 = MAX7219

IC2 = TSOP34338

LED1 = blau, 3 mm

LED2 = orange, 3 mm

LED3 = rot, 3 mm

LED4 = TSAL6400, IR-LED, 5 mm

LED5...LED12 = 7-Segment-Ziffer 0,56“, CC (z. B. SC56-11EWA)

T1 = BC337

Außerdem:

BUZ1 = Piezo-Summer ohne Oszillator, 12 mm, 3,3 V

K1 = 1x4-polige Stiftleiste

K2 = 1x6-polige Stiftleiste

K3 = Klinkenbuchse

MOD1 = ESP32-PICO-Kit

S1, S2 = Taktiler Schalter 6x6 mm

Platine 220465-1

Gehäuse Hammond 1591CTDR (transluzent rot)

DS3231 Echtzeituhr-Modul (RTC)

13

Bild

das (optionale) DS3231-RTC-Modul von einer nicht-wiederaufladbaren CR2032-Knopfzelle versorgt wird, entfernen Sie besser den Widerstand oder die Diode (oder beides) im roten Kreis, um eine Beschädigung der Batterie zu vermeiden.

ich habe es nie bemerkt. Wenn Sie sich entscheiden, das Modul zu befestigen, montieren Sie es liegend und von R6 und R7 weg zeigend. Der Alarmsummer BUZ1 (ohne integrierten Oszillator) wird von einem PWM-Signal an Port IO27 des ESP32 gesteuert. Die Ports IO34 und IO35 des ESP32 sind mit den Tastern S1 und S2 sowie dem Anschluss K1 verbunden. Bei einem typischen Aufbau würden S1 und S2 oben auf der Uhr statt auf der Platine montiert und an K1 angeschlossen werden. Obwohl der ESP32 integrierte Pull-ups von einigen hundert Kilo-Ohm hat, werden zusätzlich niederohmigere Pull-up-Widerstände R6 und R7 von 10 kΩ eingesetzt, um bei den auf diese Weise verdrahteten Taster keine Probleme mit Störungen zu bekommen.

Drei (Debug-)LEDs (LED1, LED2 und LED3) zeigen den Status der WLAN-Verbindung (blau), die Verbindung zum Webserver (orange) und den ein- und ausgehenden IR-Datenverkehr (rot) an.

IR-Schnittstelle

C5 und C6 entkoppeln den Infrarotempfänger IC2, um ein möglichst sauberes IR-Signal zu erhalten. Die Infrarot-Sende-LED (LED4) wird von Transistor T1 gesteuert. Der Strom durch sie wird durch R5 auf etwa 150 mA begrenzt. Der IR-Ausgang ist kräftig genug, um alle Geräte in der Nähe auf die gleiche Weise zu steuern wie Originalfernbedienungen.

Stromversorgung

Die externe 5-VDC-Stromversorgung muss mindestens 500 mA liefern können. Die Diode D1 schützt die Schaltung vor einer verpolt angeschlossenen Spannung. Zwei Elektrolytkondensatoren (C1, C4) puffern Stromspitzen, kleine parallel geschaltete 100-nF-Kondensatoren (C2, C3) dämpfen höhere (unerwünschte) Frequenzen.

Erweiterungen

Der Anschluss K2 ermöglicht die Erweiterung der Uhr zum Beispiel mit einem Echtzeituhrmodul (siehe unten). Hierfür stehen die drei I/O-Ports IO4, IO26 und IO32 zur Verfügung.

Bild

Platine passt gut in das Gehäuse. Sie können die Platine aber auch gedreht auf dem Deckel montieren, um die vier Gehäuseschrauben zu verbergen. Der Stromversorgungsanschluss kann auf beiden Seiten der Platine angebracht werden.

Optionale Echtzeituhr (RTC)

Ein DS3231 RTC-Modul kann an den Erweiterungsbus K2 angeschlossen werden. Die RTC übernimmt den Betrieb, wenn der NTP-Server aus irgendeinem Grund nicht erreichbar ist (wenn beispielsweise die WLAN-Verbindung unterbrochen ist oder ein Problem beim Internet-Provider vorliegt). Das RTC-Modul wird von der Software automatisch erkannt und konfiguriert und einmal pro Tag (um 12:00 Uhr) aktualisiert. Der DS3231 ist ein sehr leistungsfähiger Chip, der dank eines integrierten Temperatursensors eine Quarzdriftkompensation bietet. Das RTC-Modul DS3231 verfügt über eine I²C-Schnittstelle, so dass der Anschluss an K2 nur vier Drähte erfordert: GND, 3,3 V, SDA und SCL. Wenn ein RTC-Modul erkannt wird, übernimmt Port IO26 das SDA-Signal und Port IO32 das SCL-Signal des I²C-Busses.

Gefahr!

Seien Sie vorsichtig, diese RTC-Module können gefährlich sein! Das Modul verfügt zwar über eine Batterieladeschaltung, aber oft ist auf der Rückseite des Moduls eine nicht wiederaufladbare CR2032-Batterie zu finden, die irgendwann explodieren kann. Es gibt zwei Lösungen für dieses Problem. Die einfache, aber teurere Lösung besteht darin, die Batterie durch eine wiederaufladbare LIR2032-Batterie zu ersetzen. Die zweite Lösung ist, die Diode oder den 200-Ω-Widerstand (oder beides) in der Nähe des SCL-Pins des 4-poligen Verbinders zu entfernen, siehe Bild 6

Mechanische Details

Ein gutes Gehäuse für Cloc ist das 1591CTDR von Hammond, das 120 mm x 63 mm x 38 mm misst. Es ist durchscheinend rot (für IR) und perfekt für die 7-Segment-Anzeigen der Tageszeit und der Alarmzeit (rot und/oder orange). Auch die Übertragung und der Empfang von IR-Signalen profitieren von einem solchen optischen Filter. Beachten Sie aber, dass Licht mit geringem oder keinem Rotanteil (wie von der blauen LED) aufgrund dieser Filterung kaum sichtbar ist.

6. Wenn
14 www.elektormagazine.de
7. Die montierte

Und wenn wir schon beim Thema LEDs sind: Das ESP32-PICO-Kit hat eine (viel zu) helle rote Power-LED, die Sie wahrscheinlich verstecken oder entfernen möchten.

Die Platine für die Uhr wurde mit diesem Gehäuse im Hinterkopf entworfen. Das KiCad6-Projekt kann von [1] heruntergeladen werden. Die auf vier 16-mm-Bolzen montierte Platine passt perfekt in das Gehäuse, wie in Bild 7 gezeigt. Zur Befestigung der Platine müssen lediglich vier 3,2-mm-Löcher in den Boden gebohrt werden, ein 8-mm-Loch wird an der Seite für den Stromanschluss benötigt, und zwei 12-mm-Löcher an der Oberseite sind zwei schönen Drucktasten vorbehalten.

Das optionale RTC-Modul kann unter der Hauptplatine mit der Bauteilseite nach oben an K2 angeschlossen werden, wobei die 4-polige unbestückte Stiftleiste verwendet wird (die 6-polige abgewinkelte Stiftleiste sollte entfernt werden, um Kurzschlüsse zu vermeiden). Sie können das RTC-Modul auch mit doppelseitigem Klebeband auf die Hauptplatine kleben (wie ich es getan habe).

Die Software-Entwicklungsumgebung

Ich habe die Arduino-IDE mit hinzugefügten ESP32-Board-Paket verwendet, um die Software für Cloc 2.0 zu entwickeln. Um Fehler bei der Kompilierung oder Speicherverwaltung zu vermeiden, müssen Sie das Board ESP32 PICO-D4 mit einer CPU-Frequenz von 240 MHz auswählen. Für das Partitions Scheme wählen Sie Default (das heißt, 4 MB mit SPIFFS). Wenn Sie die richtige serielle Schnittstelle gewählt haben, sollte das Kompilieren und Hochladen des Programms reibungslos funktionieren!

Die folgenden externen Bibliotheken müssen in der IDE installiert werden, bevor das Programm kompiliert wird. Ich habe im Quellcode angegeben, wo man sie bekommt, aber die meisten können auch über den Bibliotheksmanager der IDE bezogen werden.

> AsyncElegantOTA

> AsyncTCP

> ESPAsyncWebServer

> IRremote (siehe Zeile 126 von Alarm_Clock.ino).

> LedControl

> RTClib

Wichtig! LedControl.h muss geändert werden. Die Zeile 30 (#include <avr/pgmspace.h>) muss auskommentiert werden, wie dies auch im Kommentar im Quellcode beschrieben ist.

Der Download [1] enthält einen Ordner mit dem Namen libraries, der alle verwendeten Bibliotheken enthält, darunter auch die bereits modifizierte LedControl.h. Kopieren Sie diese Bibliotheken in den Unterordner libraries des Arduino-Sketchbook-Ordners. Sie können sehen, wo er sich befindet, wenn Sie Datei -> (Vor)Einstellungen der IDE aufrufen.

Unter [2] erfahren Sie, wie Sie die Option ESP32 Sketch Data Upload zur IDE hinzufügen, damit Sie das Webinterface der Uhr in den Datenspeicher des ESP32-Moduls laden können. Vergessen Sie nicht, diese Daten hochzuladen, sonst wird der Webserver nicht funktionieren.

Um die Firmware des Weckers aus der Ferne zu aktualisieren, gehen Sie mit einem Browser auf die Adresse IP_of_cloc/update, wobei IP_of_cloc die IP-Adresse des Weckers darstellt. Sie können nun eine ausführbare Datei auf Ihrem Computer auswählen und sie auf die Uhr hochladen. Eine ausführliche Erläuterung der OTA-Schnittstelle finden Sie unter [3].

Programm-Interna

Eigenschaften

> Basierend auf einem ESP32-Prozessor

> Zwei unabhängige 7-Segment-Anzeigen für Tageszeit und Alarmzeit

> Die Uhrzeit wird automatisch von einem OnlineZeitserver eingestellt

> Alarmzeit für jeden Tag der Woche

> Der Alarmausgang: Summer und Infrarotcode für beispielsweise Radio, HiFi-Anlage oder TV

> Zwei Drucktasten für die Interaktion mit dem Gerät

> Integrierter Webserver für die Fernkonfiguration über WLAN

> Alle Einstellungen werden im EEPROM gespeichert

> Over-the-Air-Modus ermöglicht die Aktualisierung der Firmware per Fernzugriff

> Optionales Echtzeituhr-Modul DS3231 mit Pufferbatterie.

Das Programm ist recht gut dokumentiert, leider oft in französischer Sprache. Nachdem Sie das Folgende gelesen haben, sollten Sie sich aber leicht zurechtfinden. Es empfiehlt sich, die serielle Schnittstelle des ESP32 zu überwachen, da viele Debug-Informationen über diese Schnittstelle ausgegeben werden.

Nach dem Einbinden der Bibliotheken werden die Standardwerte definiert, die entweder beim ersten Booten verwendet werden (wenn Sie die Taste zum Deaktivieren des Alarms (S1) gedrückt halten) oder auf dem Panel Settings, nachdem Sie auf die Schaltfläche Default geklickt haben. Die Reihenfolge der Konstanten folgt der Reihenfolge der Parameter im Panel Settings (Zeilen 40...65 der Datei Alarm_Clock. ino). Tragen Sie insbesondere die feste IP-Adresse und das Gateway sowie die WLAN-Anmeldedaten ein. Im Alarm-Panel (Zeilen 67...84) sind die Dinge auf die gleiche Weise organisiert.

Beim Einschalten wird zunächst die Funktion setup ausgeführt. Es ist einfach, die Initialisierungsreihenfolge der Cloc-Hardware zu verfolgen.

15

Die Funktion initRTC prüft, ob ein DS3231-RTC-Modul angeschlossen ist. Wenn zu diesem Zeitpunkt die Taste S1 gedrückt gehalten wird, werden die Standardwerte geladen.

Wenn dies der erste Bootvorgang der Uhr ist oder wenn die Taste Stop (S2) während des Einschaltens gedrückt wurde, geht die Uhr in den Access-Point-Modus. In diesem Fall können Sie sich mit einem Browser mit der Web-Schnittstelle 192.168.4.1 verbinden, die von der Uhr angezeigt wird.

Nach dem Abrufen der IP-Adresse (DHCP oder fest) und der Verbindung mit dem WLAN wird die NTP-Zeit gesucht. Wenn sie gefunden wird und eine RTC vorhanden ist, wird letztere synchronisiert. Die IP-Adresse der Uhr wird kurz angezeigt, bevor auf die Zeitanzeige umgeschaltet wird. Wenn die Anzeige HH:HH auf der Zeitanzeige und AA:AA im Alarmdisplay blinkt, konnte der NTP-Server nicht erreicht werden und Sie müssen das Gerät neu starten (wenn keine RTC vorhanden ist; andernfalls zeigt es die RTC-Zeit an). Die Initialisierung endet mit dem Start des Webservers und des AsyncOTA-Dienstes, der eine Fernaktualisierung der Firmware und des SPIFFS ermöglicht.

Die Funktion loop führt den Rest des Programms in einer Endlosschleife aus. Wenn die RTC vorhanden ist (flagRTC=1), liest sie die RTC-Zeit aus. Ohne RTC versucht es die NTP-Zeit (NTPflag=1). Sobald die Uhr verbunden ist, liest das Programm die RTC-Zeit. Dabei enthält strTime die NTP-Zeit als „hh:mm:ss“, wenn sie gültig ist, ansonsten eine „0“.

Dann wird der Zustand der Tasten überprüft (checkButtons ) und bestimmt, ob die Uhr Alarm geben muss und ob ein IR-Code empfangen wurde. Da der Server asynchron arbeitet, müssen wir Flags verwenden, um dem Hauptprogramm Parameteränderungen und Alarmauslösungen zu melden.

Der Bildschirm wird jede Sekunde aufgefrischt ( dispTime ) und die Alarme werden überprüft ( checkAlarm ). Außerdem prüft das Programm, ob es sich in der Hochhelligkeitsperiode befindet oder nicht (checkBrightness) und ob es die RTC mit der NTP-Zeit synchronisieren muss (checkSyncRTC). Dies geschieht einmal pro Tag um 12:00 Uhr (syncRTC=12*60). Die Funktion checkTimer prüft, ob ein Alarm aktiviert werden muss. Dazu werden die Tageszeit und die Alarmzeit in Minuten umgerechnet (computeMinutes) und anschließend verglichen (testRange).

Wie erwähnt, arbeitet der Server asynchron. Jedes Mal, wenn sich Settings oder Alarm Panel ändern, werden die anzuzeigenden Daten (ParametresProcessor und TimerProcessor) zurückgegeben. Zu diesem Zweck müssen die in der HTML-Seite enthaltenen %value%Tags durch die tatsächlichen Werte ersetzt werden.

Für das Haupt-Panel ist es etwas anders, da die Uhrzeit, das Datum und die Start- und Endzeiten des Alarms fast in Echtzeit angezeigt werden müssen. Eine in JavaScript geschriebene Funktion fragt ungefähr jede Sekunde das Hauptprogramm ab, um die anzuzeigenden Werte zu

erhalten (onDataUpdate). Bei jeder Abfrage blinkt LED2 kurz auf, um anzuzeigen, dass auf den Server zugegriffen wird (flashRqstBeacon). Um zu überprüfen, ob die Seite die Werte tatsächlich in Echtzeit anzeigt, drücken Sie S1 (Alarm Disable). Die Alarmzeit wird sowohl auf der 7-Segment-Anzeige als auch auf der HTML-Seite gleichzeitig angezeigt beziehungsweise ausgeschaltet.

Bezüglich der IRremote-Bibliothek

Die IRremote-Bibliothek funktioniert einwandfrei, erfordert jedoch einige Integrationsregeln. Verschieben Sie die Initialisierungssequenzen nicht, wenn Sie nicht wirklich wissen, was Sie tun.

Um statt mit einem gräßlichen Piepton aufzuwachen, lasse ich mich von wohlklingender Musik meines Bose-Radio wecken. Daher habe ich den Empfang und die Dekodierung auf Bose-Fernbedienungen beschränkt (siehe Zeile 125 von Alarm_Clock.ino). Sie können diese Zeile entfernen, um andere Fernbedienungen zu dekodieren. Ich empfehle, den Infrarotempfang auf die Marke Ihres Radios oder Ihrer HiFi-Anlage zu beschränken. Siehe [4] für mögliche Optionen.

Auch die IR-Übertragung ist auf das Bose-Format beschränkt. Daher ist es sehr wahrscheinlich, dass Sie den Code an die Marke der von Ihnen verwendeten Hi-Fi-Anlage anpassen müssen. Ersetzen Sie die Zeile IrSender.sendBoseWave in den Funktionen startMedia und stopMedia in Alarm_Clock.ino durch eine Funktion, die Ihrer Marke entspricht (siehe wiederum [4]).

Um herauszufinden, welche IR-Codes für Ihr (Audio-)System zu verwenden sind, verbinden Sie den USB-Anschluss des ESP32-Moduls mit einem Computer, auf dem ein serieller Monitor läuft, zum Beispiel der in der Arduino-IDE integrierte Serielle Monitor. Richten Sie Ihre Fernbedienung auf den IR-Empfänger der Uhr und drücken Sie eine Taste, um den entsprechenden Code in hexadezimaler Form auf dem Computer anzuzeigen. Geben Sie die Codes in hexadezimaler Form in die Felder Media ON und Media OFF des Einstellungsfeldes ein. IR-Aktivität wird durch kurzes Blinken der LED3 angezeigt. Folglich blinkt diese LED auch, wenn ein Alarm aktiv ist.

Eine DIY-Lösung

Ich benutze diese neue Version von Cloc 2.0 nun schon seit einigen Monaten und habe noch nie verschlafen, weil das Gerät nicht funktioniert hat. Die Möglichkeit, Weckzeiten für jeden Tag der Woche einzustellen, ist sehr praktisch.

Ich empfehle dringend, die RTC-Option hinzuzufügen, denn wenn der NTP-Server nicht antwortet (weil beispielsweise Ihr Modem aus irgendeinem Grund offline ist), verliert der Wecker die Zeit, wenn die nächste Neusynchronisierung der NTP-Zeit angesagt ist. Sie müssen dann den Wecker anhalten und neu starten, wenn die NTP-Zeit wieder verfügbar ist. Für noch mehr Zuverlässigkeit habe ich einen kleinen NTP-Server gebaut, der die Zeit von einem GPS empfängt [5]. So kann sich mein Wecker auch bei einem Abbruch der Internetverbindung automatisch einstellen.

16 www.elektormagazine.de

Ich hoffe, dass viele von Ihnen diesen Wecker bauen werden. Bitte zögern Sie nicht, mich zu kontaktieren (siehe Kasten Fragen oder Kommentare), wenn Sie auf Schwierigkeiten stoßen oder Verbesse rungen an meinem Lieblingswecker vornehmen möchten!

(220564-02)RG

Haben Sie Fragen oder Kommentare?

Haben Sie technische Fragen oder Kommentare zu diesem Artikel? Senden Sie eine E-Mail an den Autor unter yb.electronique@orange.fr oder kontaktieren Sie Elektor unter redaktion@elektor.de.

Passende Produkte

> ESP32-PICO-Kit V4 (SKU 18423) www.elektor.de/18423

> Elektor Arduino Electronics Bundle (SKU 19440) www.elektor.com/19440

> SparkFun Real Time Clock Modul – RV-8803 (Qwiic) (SKU 19646) www.elektor.de/19646

WEBLINKS

[1] Downloads für Cloc 2.0 bei Elektor Labs: https://www.elektormagazine.de/labs/cloc-le-reveil-20

[2] ESP32 SPIFFS Daten-Upload: https://randomnerdtutorials.com/ install-esp32-filesystem-uploader-arduino-ide/

[3] ESP32 OTA-Updates: https://randomnerdtutorials.com/ esp32-ota-over-the-air-arduino/

[4] IRremote-Bibliothek: https://github.com/ Arduino-IRremote/Arduino-IRremote

[5] NTP-Server bei Elektor Labs: https://www.elektormagazine.de/labs/ntp-server

Elektor Jetzt bis zu 26% sparen! Bestseller www.elektor.de/sale/deals summer sale 17

Cloc 2.0: de wekker die je altijd al wilde hebben

Klokken behoren waarschijnlijk tot de populairste projecten in de doehet-zelf elektronica (naast natuurlijk radio-ontvangers). Het zou me niet verbazen als elke lezer van dit artikel al wel eens een klok heeft gebouwd.

Ik heb er in mijn leven een heleboel gebouwd, veel daarvan met een alarmfunctie. Daardoor weet ik wat ik van een wekker verlang. Omdat mijn ideale wekker niet in de handel verkrijgbaar is, heb ik hem zelf gebouwd. Cloc 2.0 is het resultaat en het onderwerp van dit artikel.

Mijn eerste klok bouwde ik in 1971 met Nixie-buizen uit een oud IBM-computerdisplay dat ik van iemand had gekregen. Op de print zat een indrukwekkend aantal componenten, en de nauwkeurigheid bedroeg ongeveer tien seconden per dag. In de jaren daarna heb ik nog veel klokken ontworpen en gebouwd, waaronder de beroemdste van Elektor.

Mijn Nixie-klok deed ook dienst als wekker, en die functionaliteit heb ik in de loop der jaren steeds verder ontwikkeld door de mens-machine interface zoveel mogelijk te vereenvoudigen. Mijn laatste wekker was gebaseerd op een PIC32-processor met twee displays (figuur 1). Deze had een ESP8266-module om de tijd automatisch in te stellen van een online-tijdserver via NTP. De PIC32 drukte op de knoppen van een echte afstandsbediening om mijn favoriete radiostation aan te zetten of muziek af te spelen. Met een draai- en twee drukknoppen kon de wekker worden ingesteld. Dit vormde de basis van het hieronder beschreven project: Cloc 2.0.

project
Yves Bourdon (Frankrijk)
18 www.elektormagazine.nl
Figuur 1. Cloc 1.0, de voorloper van Cloc 2.0. Deze was gebaseerd op een PIC32 en gebruikte een echte afstandsbediening als IRuitgang.

Mooi en nabouwvriendelijk

Ik wilde een gemakkelijk te bouwen wekker maken, zonder SMD-onderdelen, die zo gemakkelijk mogelijk in een goed verkrijgbare standaardbehuizing past. Ik wilde ook de retro-uitstraling van de zeven-segment-displays behouden, met een variabele helderheid die de wekker ’s nachts goed afleesbaar maakt zonder storend licht als je graag in het donker slaapt.

De web-interface

Cloc maakt verbinding met een WiFi-netwerk om toegang te krijgen tot een tijdserver (waar ook ter wereld). Hij kan verbinding maken via DHCP of met een vast IP-adres. Als de verbinding tot stand gekomen is, kun je de webserver benaderen om de tijd te weten te komen, de alarmen in te stellen en de parameters van de klok aan te passen. De geoptimaliseerde grafische HTML-interface werkt op de meeste standaardbrowsers en draagbare apparaten. De interface omvat drie panelen (of schermen, zo je wilt): Main, Alarm en Settings.

Main-paneel

Het Main-paneel (figuur 2) toont de momentele tijd en datum, en de begin- en eindtijd van het komende alarm. Het toont ook de SSID van het WiFi-netwerk waarmee het is verbonden, plus de signaalsterkte RSSI. De kleur van dit laatste item (groen, oranje of rood) hangt af van de waarde ervan. Het Main-paneel wordt ongeveer elke seconde ververst.

Alarm-paneel

Het Alarm-paneel (figuur 3) wordt gebruikt om de alarmtijden voor elke dag van de week in te stellen. Het uitvinken van een weekdag schakelt het alarm voor die dag uit. Het is ook mogelijk om met één klik alle alarmen uit te schakelen. Ook de duur van het alarm kan worden ingesteld. Aan het begin van

een alarm wordt het Media ON-commando verzonden via de infrarood-LED; aan het einde van het alarm wordt het IR Media OFF-commando verstuurd. Bovendien kan het alarm de zoemer laten klinken (in te schakelen in het Settings-paneel).

Telkens wanneer een alarm-parameter wordt gewijzigd, klinkt er een korte pieptoon. Als de waarde is veranderd ten opzichte van de vorige waarde, wordt deze opgeslagen in EEPROM.

Settings-paneel

De volgende parameters kunnen worden geconfigureerd (figuur 4).

> Tijd gedurende welke het display maximaal helder is (Bright Start en Bright Stop).

> Het moment waarop de komende alarmtijd wordt getoond (Alarm J+1), bijvoorbeeld ’s avonds als je naar bed gaat of onmiddellijk na het laatste alarm (door het vakje End of previous alarm aan te vinken).

> Zomertijd: automatisch of handmatig.

> Infrarood (IR) Media ON- en Media OFF-code om een ander apparaat (zoals een radio) te bedienen.

> In-/uitschakelen van de zoemer.

> WiFi-netwerkgegevens met DHCP of een vast IP-adres.

Drukknoppen

Cloc heeft twee drukknoppen als gebruikersinterface: S1 (Disable) en S2 (Stop). Bij normaal gebruik wordt met S1 het alarm in- of uitgeschakeld (het onderste display gaat aan of uit). Je kunt het alarm ook via de webinterface (de)activeren. Als S1 bij het inschakelen van de Cloc ingedrukt wordt gehouden, worden de standaardwaarden hersteld zoals die in het programma zijn vastgelegd (en die je voor het programmeren van de klok aan je eigen behoeften moet aanpassen!). Dit moet je doen als je de klok voor het eerst inschakelt.

Figuur 2. Het Main-paneel toont naast de huidige tijd en datum tevens de belangrijkste instellingen. Figuur 3. In het Alarm-paneel kun je de wektijd voor elke dag van de week instellen.
19
Figuur 4. Alle door de gebruiker te configureren parameters zijn te vinden in het Settings-paneel.

Figuur 5. De ESP32-PICO-KIT zorgt voor de internetverbinding en de tijd, terwijl de MAX7219 acht zeven-segment-cijfers in twee rijen aanstuurt. Let op de IR-interface rond IC2 (ingang) en LED4 (uitgang).

TIME ALARM * LED5...12 = SC56-11EWA 220564-006 BOOT EN USB dp dp dp dp dp dp dp dp TSAL6400 (IR) a b c d e f g dp dp dp dp dp dp dp dp dp a a a a b b b b c c c c d d d d e e e e f f f f g g g g g f e d c b a g f e d c b a g f e d c b a a b c d e f g +5V Power +3V3 3 2 1 3V3 +3V3 +5V Extension +3V3 +5V +3V3 +3V3 Disable +5V +5V FSD0 FSD2 FSVP FSVN IO25 IO26 IO32 IO33 IO27 IO14 IO12 IO13 IO15 FSD1 FSD3 FCLK RXD0 TXD0 IO21 IO22 IO19 IO23 IO18 IO10 IO35 IO34 IO38 IO37 FCS IO2 IO4 IO0 3V3 GND GND 3V3 IO5 IO9 5V EN MOD1 ESP32 Pico-Kit V4 IC1 MAX7219 CNG SEGDP DOUT LOAD ISET SEGC SEGD SEGG SEGA SEGB SEGE SEGF DIG0 DIG1 DIG2 DIG3 DIG4 DIG5 DIG6 DIG7 DIN CLK 24 13 12 18 19 14 16 20 23 21 15 17 22 11 10 1 4 9 2 6 7 3 5 8 R1 47k C1 100µ 16V C2 100n R8 330Ω R5 22 Ω LED4 IR T1 BC337 R6 10k R7 10k S1 Stop S2 C7 1µ 16V K2 1 2 3 4 5 6 R2 820 Ω LED1 Blue R3 330 Ω LED2 Orange R4 330 Ω LED3 Red BUZ1 IC2 TSOP34338 R9 10k C5 47µ 16V C6 100n K3 D1 1N5817 C4 220µ 16V C3 100n LED9 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED10 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED11 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED12 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED5 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED6 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED7 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED8 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 K1 1 2 3 4
20 www.elektormagazine.nl

Als er in de normale modus een alarm is afgegaan, wordt dit onmiddellijk gestopt met een druk op S2, het onderste display stopt dan met knipperen. Als je op S2 drukt zonder dat er een alarm afgaat, wordt de IR Media ON/OFF-code naar het geselecteerde apparaat gestuurd. Zo kun je de klok gebruiken als eenvoudige afstandsbediening. Als S2 wordt ingedrukt tijdens het inschakelen, gaat de klok naar de Access Point-modus (AP) op adres 192.168.4.1. Je kunt er dan verbinding mee maken met een mobiele telefoon, een tablet of een computer om toegang te krijgen tot de webinterface waar je elke door de gebruiker programmeerbare parameter van het apparaat kunt configureren.

Beschrijving van de schakeling

Het schema van Cloc 2.0 is getekend in figuur 5. Bijna tweederde daarvan wordt in beslag genomen door de twee zeven-segment-displays en bijbehorende driver IC1. Om de acht cijfers, vier per display (tijd en alarm) aan te sturen, heb ik de MAX7219 gebruikt. Deze heeft een 2-draads SPI-bus (DIN wordt niet gebruikt) en is eenvoudig te programmeren dankzij open-source bibliotheken. Met weerstand R1 kan de maximale helderheid van het display worden ingesteld (hoe hoger de waarde, hoe zwakker het display). Merk op dat high-brightness zeven-segmentdisplays wel heel erg veel licht geven, misschien te veel voor een wekker.

De voor Cloc gekozen ESP32-module is de ESP32-PICO-KIT, die niet alleen veel I/O-poorten heeft maar ook de perfecte afmetingen voor dit project. Condensator C7 is alleen nodig als de ESP32-module na het opstarten in de reset-modus blijft hangen. Sommige (oudere?)

ESP32-modules schijnen last te hebben van dit probleem, maar ik heb er nooit iets van gemerkt. Als je besluit hem te monteren, monteer hem dan liggend en van R6 en R7 af wijzend.

De alarm-buzzer BUZ1 (zonder geïntegreerde oscillator) wordt aangestuurd door een PWM-signaal op poort IO27 van de ESP32. De poorten IO34 en IO35 van de ESP32 zijn verbonden met de drukknoppen S1 en S2 en connector K1. In een typische opbouw zouden S1 en S2 bovenop de klok worden gemonteerd in plaats van op de print, vandaar de aanwezigheid van K1. Er zijn weerstanden van 10 kΩ gebruikt (R6 en R7), hoewel de ESP32 ingebouwde pull-up weerstanden heeft. Maar omdat die waarden hebben van enkele honderden kilo-ohms, is een alleen daarop vertrouwende knop iets gevoeliger voor ruis.

Drie (debug-)LED’s (LED1, LED2 en LED3) geven de status van de WiFi-netwerkverbinding (blauw), de verbinding met de webserver-interface (oranje) en het IR in- en uitgaand verkeer (rood) aan.

IR-interface

C5 en C6 ontkoppelen infraroodontvanger IC2 om een zo schoon mogelijk IR-signaal te krijgen. De infrarode TX-LED (LED4) wordt aangestuurd door transistor T1. De stroom er doorheen wordt door R5 beperkt tot ongeveer 150 mA. De IR-uitgang is krachtig genoeg om alle apparatuur in de buurt op dezelfde manier te bedienen als de oorspronkelijke afstandsbediening dat zou doen.

Voeding

De externe 5VDC -voeding moet minstens 500 mA kunnen leveren. Diode D1 beschermt de schakeling tegen ompolen. Twee elektrolytische condensatoren (C1 en C4) vlakken stroompieken af. De kleine parallel aan de elco’s geschakelde condensatoren van 100 nF (C2 en C3) dempen ruis bij hogere frequenties.

ONDERDELENLIJST

Weerstanden:

R1 = 47 k

R2 = 820 Ω

R3,R4,R8 = 330 Ω

R5 = 22 Ω

R6,R7,R9 = 10 k

Condensatoren:

C1 = 100 µ/16 V

C2,C3,C6 = 100 n

C4 = 220 µ/16 V

C5 = 47 µ/16 V

C7 = 1 µ/16 V

Halfgeleiders:

D1 = 1N5817

IC1 = MAX7219

IC2 = TSOP34338

LED1 = blauw, 3 mm

LED2 = oranje, 3 mm

LED3 = rood, 3 mm

LED4 = TSAL6400, IR LED, 5 mm

LED5-12 = 7-segment cijfer 0,56”, CC (bijv. SC56-11EWA)

T1 = BC337

Diversen:

BUZ1 = Piëzo-zoemer zonder oscillator, 12 mm, 3,3 V

K1 = eenrijige 4-polige pinheader

K2 = eenrijige 6-polige pinheader

K3 = voedingsconnector

MOD1 = ESP32-PICO-KIT

S1, S2 = druktoets 6x6 mm

print 220465-1

behuizing Hammond 1591CTDR (transparant rood)

DS3231 real-time klokmodule

21

Uitbreidingen

Via connector K2 kan de klok worden uitgebreid met bijvoorbeeld een real-time klokmodule (zie de volgende paragraaf). Hiervoor zijn drie I/O-poorten beschikbaar: IO4, IO26 en IO32.

Optionele real-time klok (RTC)

Op connector K2 kan een DS3231 RTC-module worden aangesloten. De RTC neemt het over als de NTP-server om een of andere reden onbereikbaar is (bijvoorbeeld WiFi is uitgevallen, of er is een probleem bij de internetprovider). De RTC-module wordt automatisch gedetecteerd en geconfigureerd door de software en eenmaal per dag (om 12:00 uur) bijgewerkt. De DS3231 is een krachtige chip met ingebouwde compensatie voor drift van het kristal dankzij een geïntegreerde temperatuursensor.

De DS3231 RTC-module heeft een I2C-interface en voor de aansluiting op K2 zijn slechts vier signalen nodig: GND, 3,3 V, SDA en SCL. Als een RTC-module wordt gedetecteerd, wordt poort IO26 het SDA-signaal, terwijl poort IO32 het SCL-signaal van de I2C-bus verzorgt.

Pas op!

Wees voorzichtig, deze RTC-modules kunnen gevaarlijk zijn! De module is inderdaad van een laadschakeling voorzien, maar vaak is een niet-oplaadbare CR2032-batterij gemonteerd, die op termijn kan exploderen. Er zijn twee oplossingen voor dit probleem. De gemakkelijke maar duurdere is de batterij te vervangen door een oplaadbare LIR2032-accu. De tweede oplossing is het verwijderen van de diode of de 200Ω-weerstand (of beide) bij de SCL-pin van de 4-polige connector, zie figuur 6

Mechanische details

Een goede behuizing voor Cloc is de 1591CTDR van Hammond, die 120 x 63 x 38 mm meet. Het is een rode (IR-transparante) behuizing die perfect geschikt is voor de rode en/of oranje zeven-segment-displays voor de (wek)tijd. Ook het zenden en ontvangen van IR-signalen profiteert van een dergelijk optisch filter. Merk op dat licht met een gering (of zonder) rood-aandeel (zoals de blauwe LED) nauwelijks zichtbaar is bij deze filtering.

En nu we het toch over LED’s hebben, de ESP32-PICO-KIT heeft een (veel te) heldere rode power-LED die je waarschijnlijk wilt verbergen of demonteren.

De print is ontworpen voor deze behuizing. Het KiCad6-project

worden gedownload van [1]. De print, gemonteerd op vier afstandhouders van 16 mm, past perfect in de behuizing, zoals te zien is in figuur 7.

In de bodem hoeven slechts vier gaten van 3,2 mm te worden geboord om de print te bevestigen, aan de zijkant is een gat van 8 mm nodig voor de voedingsconnector; twee gaten van 12 mm aan de bovenkant maken het mogelijk om twee fraaie drukknoppen te monteren. De optionele RTC-module kan onder de hoofdprint worden aangesloten op K2 met de componentzijde naar boven met behulp van de niet-gebruikte vierpolige header (de 6-polige schuine header kan eventueel worden verwijderd om kortsluiting te voorkomen). Je kunt de module ook op de hoofdprint plakken met dubbelzijdig plakband (zoals ik heb gedaan).

De software-ontwikkelomgeving

Ik heb de Arduino IDE gebruikt om de software voor Cloc 2.0 te ontwikkelen, met het ESP32 boards-package geïnstalleerd. Om compilatie- of geheugenbeheerfouten te voorkomen, moet je het ESP32 PICO-D4 board kiezen met een CPU-frequentie van 240 MHz. Voor het Partition Scheme kies je Default (dat wil zeggen 4 MB met SPIFFS). Als je de juiste seriële poort selecteert, zou het compileren en laden van het programma probleemloos moeten verlopen!

De volgende externe bibliotheken moeten in de IDE worden geïnstalleerd voordat het programma wordt gecompileerd. Ik heb in de broncode aangegeven waar ze gevonden kunnen worden. De meeste kunnen ook worden verkregen met behulp van de Library Manager van de IDE.

> AsyncElegantOTA

> AsyncTCP

> ESPAsyncWebServer

> IRremote (zie regel 126 van Alarm_Clock.ino)

> LedControl

> RTClib

Belangrijk: LedControl.h moet worden aangepast. Regel 30 (#include <avr/pgmspace.h>) moet worden weggecommentarieerd. Zie ook het commentaar in de broncode.

De download [1] bevat een map genaamd libraries die alle gebruikte bibliotheken bevat, inclusief de al gemodificeerde LedControl.h Kopieer deze bibliotheken naar de submap libraries van de map Arduino sketchbook (je kunt zien waar die staat door naar het Preferences-venster van de IDE te gaan).

Raadpleeg [2] om te leren hoe je de ESP32 Sketch Data Upload optie toevoegt aan de IDE. Die heb je nodig om de webinterface van de klok in het datageheugen van de ESP32-module te laden. Vergeet dat niet, anders werkt de webserver niet.

kan Figuur 6. Als de (optionele) DS3231 real-time klokmodule (RTC) wordt gebruikt met een niet-oplaadbare CR2032knoopcel, moet je de weerstand of de diode (of beide) in de rode cirkel verwijderen om beschadiging van de batterij te voorkomen.
22 www.elektormagazine.nl
Figuur 7. De opgebouwde print past goed in de behuizing. Je kunt de print in het deksel monteren om de schroeven van de behuizing te verbergen. De voedingsconnector kan aan beide zijden van de printplaat worden gemonteerd.

Over-the-Air (OTA)

Om de firmware van de wekker op afstand bij te werken, ga je met een browser naar IP_of_cloc/update, waarbij IP_of_cloc het IP-adres van de wekker is. Je kunt nu een executable op je computer kiezen en deze naar de klok uploaden. Een gedetailleerde uitleg van de OTA-interface is beschikbaar op [3].

Het programma nader bekeken

Het programma is vrij goed gedocumenteerd (helaas vaak in het Frans), en na het lezen van het volgende zou je gemakkelijk je weg moeten vinden. Je zou de seriële poort van de ESP32 kunnen monitoren, omdat er veel debug-informatie via die poort wordt verstuurd.

Na het opnemen van de bibliotheken worden de defaultwaarden gedefinieerd die worden gebruikt bij de eerste start (door S1 (alarm uit) ingedrukt te houden, of vanaf de Settings-pagina na het aanklikken van Defaults. De volgorde van de constanten is gelijk aan de volgorde van de parameters in het Settings-paneel (regels 40 tot 65 van Alarm_Clock.ino). Controleer met name het vaste IP-adres en de gateway, alsmede de WiFi-gegevens. Het Alarm-paneel (regels 67 tot 84) is op dezelfde manier georganiseerd.

Bij het inschakelen wordt eerst de functie setup uitgevoerd. Het is gemakkelijk om de initialisatievolgorde van de Cloc-hardware te volgen. De functie initRTC controleert of er een DS3231 RTC-module is aangesloten. Als toets S1 op dat moment wordt ingedrukt, worden de default-waarden geladen.

Als dit de eerste keer is dat de klok wordt opgestart of als de Stop-knop (S2) wordt ingedrukt tijdens het opstarten, gaat de klok naar de Access Point-modus (AP). In dit geval kun je met een browser verbinding maken met zijn webinterface op 192.168.4.1, zoals aangegeven door de klok.

Na het ophalen van het IP-adres (DHCP of vast) en de verbinding met het WiFi-netwerk zoeken we naar de NTP-tijd. Als die wordt gevonden en er een RTC aanwezig is, worden deze gesynchroniseerd. Het IP-adres van de klok wordt kort weergegeven voordat wordt overgeschakeld naar de tijdweergave. Als op het tijddisplay “HH:HH” begint te knipperen en op het alarmdisplay “AA:AA”, kon de NTP-server niet worden bereikt en moet je het apparaat opnieuw opstarten (als er geen RTC aanwezig is; anders wordt de RTC-tijd weergegeven).

De initialisatie eindigt met het starten van de webserver en de AsyncOTA-service, waarmee de firmware en SPIFFS op afstand kunnen worden bijgewerkt.

De functie loop voert de rest van het programma uit in een oneindige lus. Als de RTC aanwezig is (flagRTC=1), wordt de RTC-tijd gelezen. Zonder RTC wordt de NTP-tijd (NTPflag=1) geprobeerd. Zodra de klok is aangesloten, leest het programma de RTC-tijd, terwijl strTime de NTP-tijd bevat als “hh:mm:ss” als deze geldig is of als “0” als dat niet het geval is.

Vervolgens wordt de toestand van de knoppen gecontroleerd (checkButtons) en wordt gekeken of de klok alarm moet geven en of er een IR-code is ontvangen. Aangezien de server asynchroon is, moeten we vlaggen gebruiken om parameterwijzigingen en alarmtriggers aan het hoofdprogramma te signaleren.

Het scherm wordt elke seconde ververst (dispTime) en de alarmen worden gecontroleerd (checkAlarm). Ook controleert het programma of het display maximaal helder moet zijn of niet (checkBrightness) en of het de RTC moet synchroniseren met de NTP-tijd (checkSyncRTC).

Dit gebeurt eenmaal per dag om 12:00 (syncRTC=12*60). De functie checkTimer controleert of een alarm moet worden geactiveerd. Hiervoor worden de tijd van de dag en de alarmtijd omgezet in minuten (computeMinutes) alvorens ze te vergelijken (testRange). Zoals al opgemerkt, is de server asynchroon. Telkens wanneer het Settings- of Alarm-paneel wordt ververst, worden de weer te geven gegevens (ParameterProcessor en TimerProcessor) geretourneerd. Hiervoor moeten de %value%-tags in de HTML-pagina worden vervangen door de werkelijke waarden.

Specificaties

> Gebaseerd op een ESP32-processor.

> Twee onafhankelijke zeven-segment-displays voor de tijd van de dag en de alarmtijd.

> De tijd wordt automatisch ingesteld met behulp van een online-tijdserver.

> Verschillende alarmtijden voor elke weekdag.

> Alarmuitgang: zoemer en IR-code voor bijvoorbeeld radio, hifi-installatie of TV.

> Twee drukknoppen voor interactie met het apparaat.

> Geïntegreerde webserver voor configuratie op afstand via WiFi.

> Alle instellingen worden opgeslagen in EEPROM.

> Over-the-Air modus (OTA) maakt het mogelijk de firmware op afstand bij te werken.

> Optionele DS3231-gebaseerde real-time klokmodule (RTC) met backup-batterij.

Voor het Main-paneel is het een beetje anders, omdat we bijna in real time de tijd van de dag, de datum en de start- en stoptijd van het alarm moeten weergeven. Een in JavaScript geschreven functie vraagt ongeveer elke seconde het hoofdprogramma op om de weer te geven waarden op te halen (onDataUpdate). Telkens als dat gebeurt, knippert LED2 kort om aan te geven dat de server wordt benaderd (flashRqstBeacon ). Om te controleren of de pagina inderdaad de waarden in real time weergeeft, kun je op S1 (Alarm Disable) drukken. De alarmtijd wordt tegelijkertijd weergegeven of uitgeschakeld op zowel het zeven-segment-display als op de HTML-pagina.

Over de IRremote-bibliotheek

De IRremote bibliotheek werkt prima, maar vereist enkele integratieregels. Verplaats de initialisatieregels niet, tenzij je weet wat je doet. Om wakker te worden met muziek in plaats van een piep, gebruik ik een Bose-radio. Daarom heb ik de ontvangst en decodering beperkt tot Bose-afstandsbedieningen (zie regel 125 van Alarm_Clock.ino).

Je kunt deze regel verwijderen om andere afstandsbedieningen te decoderen. Ik raad echter aan de IR-ontvangst te beperken tot het merk van je radio of hifi-systeem. Zie [4] voor mogelijke opties.

23

Ook de IR-transmissie is beperkt tot het Bose-formaat. Daarom is het zeer waarschijnlijk dat je de code moet aanpassen aan het merk van de hifi-apparatuur die je gebruikt. Vervang de regel IrSender. sendBoseWave in de functies startMedia en stopMedia in Alarm_ Clock.ino door een functie die overeenkomt met je eigen merk (zie ook [4]).

Om erachter te komen welke IR-codes je voor je (audio-)systeem moet gebruiken, moet je de USB-poort van de ESP32-module aansluiten op een computer met een seriële monitor, bijvoorbeeld de in de Arduino IDE ingebouwde Serial Monitor. Richt de afstandsbediening op de IR-ontvanger van de klok en druk op een toets om de bijbehorende code in hexadecimaal formaat op de computer weer te geven. Voer de codes in hexadecimale vorm in de velden Media ON en Media OFF van het Settings-paneel in.

IR-activiteit wordt aangegeven door LED3 die kort knippert. Deze LED knippert dus ook als er een alarm actief is.

Een DHZ-oplossing

Ik gebruik deze nieuwe versie van Cloc 2.0 nu enkele maanden, en ik heb me nog nooit verslapen omdat hij niet goed werkte. De mogelijkheid om alarmtijden voor elke dag van de week in te stellen is erg handig.

Gerelateerde producten

> ESP32-PICO-Kit V4 (SKU 18423) www.elektor.nl/18423

> Elektor Arduino Elektronics Bundle (SKU 19440) www.elektor.nl/19440

> SparkFun Real Time Clock Module - RV-8803 (Qwiic) (SKU 19646)

www.elektor.nl/19646

Ik raad sterk aan de RTC-optie toe te voegen, want als de NTP-server niet reageert (bijvoorbeeld omdat je modem om een of andere reden offline is gegaan), zal de wekker de ingestelde tijd verliezen zodra weer een NTP-synchronisatie plaatsvindt. Je moet de wekker dan stoppen en opnieuw starten als de NTP-tijd weer beschikbaar is. Voor nog meer betrouwbaarheid heb ik een kleine NTP-server gebouwd die de GPS-tijd ontvangt [5]. Dus zelfs als de internetverbinding wegvalt, kan mijn wekker zichzelf automatisch instellen.

Ik hoop dat velen van jullie deze klok zullen maken. Aarzel niet om me te contacteren op mijn privé e-mail (yb.electronique@orange.fr) als je moeilijkheden ondervindt of als iets aan mijn favoriete wekker verbetert!

220564-03

Vragen of opmerkingen?

Hebt u technische vragen of opmerkingen naar aanleiding van dit artikel? Stuur een e-mail naar de auteur via yb.electronique@orange.fr of naar de redactie van Elektor via redactie@elektor.com.

WEB LINKS

[1] Downloads voor Cloc 2.0 bij Elektor Labs: https://www.elektormagazine.com/labs/cloc-le-reveil-20

[2] ESP32 SPIFFS-gegevens uploaden: https://randomnerdtutorials.com/install-esp32-filesystem-uploader-arduino-ide/

[3] ESP32 OTA-updates (Over-the-Air): https://randomnerdtutorials.com/esp32-ota-over-the-air-arduino/

[4] IRremote-bibliotheek: https://github.com/Arduino-IRremote/Arduino-IRremote

[5] NTP-server bij Elektor Labs: https://www.elektormagazine.com/labs/ntp-server

24 www.elektormagazine.nl
Magazine NU TE BESTELLEN OP WWW.MAGPI.NL/ABO 12 maanden 100+ Projekten 1 Prijs € 54,95 Zes edities van MagPi Magazine MagPi, het officiële Raspberry Pi-magazine Toegang tot het online MagPi-archief 25

Cloc

2.0 : le réveil-matin de vos rêves

Avec le récepteur radio, l’horloge est probablement l’un des thèmes favoris des elektorniciens amateurs. Je m’attends à ce que tout lecteur de cet article ait construit au moins une horloge. Personnellement, j’en ai construit beaucoup. La plupart faisaient aussi réveil. Je sais donc bien ce que j’en attends. Mon réveil idéal n’étant pas commercialisé, je l’ai construit moimême. Voici donc le Cloc 2.0.

Réalisée en 1971, ma première horloge utilisait des tubes Nixie récupérés sur un ordinateur IBM mis au rebut. Le circuit imprimé accueillait un nombre considérable de composants. La précision était d’environ dix secondes par jour. Par la suite, j’ai conçu et réalisé de nombreuses horloges dont les plus célèbres d’Elektor.

Mon horloge Nixie faisait aussi réveil, fonction que j’ai beaucoup développée au fil des années en simplifiant au mieux l’interface homme-machine. Animé par un PIC32, mon dernier réveil était doté de deux écrans (figure 1). Un module ESP8266 exploitait un serveur de temps en ligne via NTP pour régler l’heure automatiquement. Le PIC32 « pressait » les boutons d’une télécommande authentique pour allumer la radio et diffuser ma station préférée ou de la musique. Un encodeur rotatif et deux poussoirs servaient à régler le réveil. Décrit ci-dessous, le projet Cloc 2.0 est basé sur celui-ci.

projet
Yves Bourdon (France)
26 www.elektormagazine.fr
Figure 1. Cloc 1.0, la version précédant Cloc 2.0. Basé sur un PIC32, elle utilisait une authentique télécommande comme sortie IR.

Tout pour séduire : beauté et simplicité

Je voulais un réveil facile à construire, sans composants CMS et s’intégrant le mieux possible dans un boîtier standard du commerce. Je voulais aussi garder la touche rétro des afficheurs 7 segments dont la luminosité variable autorise une très bonne lisibilité la nuit, sans gêner quand on aime dormir dans le noir.

L’interface Web

Cloc se connecte à un réseau wifi, il peut donc accéder à un serveur de temps existant. Il se connecte avec une adresse IP fixe ou dynamique (DHCP). Une fois connecté, l’accès au serveur web permet de savoir l’heure et de régler les alarmes et paramètres du réveil. L’interface graphique HTML optimisée est compatible avec la plupart des navigateurs et des appareils portables. L’interface comprend trois pages : Principale, Alarme et Paramètres.

Page principale

Cette page (figure 2) affiche l’heure et la date en cours, ainsi que l’heure de début et de fin de l’alarme à venir. Elle affiche aussi le SSID du réseau wifi auquel il est connecté et le signal RSSI reçu. La couleur de ce dernier (vert, orange ou rouge) symbolise sa valeur. La page principale est rafraîchie à 1 Hz environ.

Page d’alarme

La page d’alarme (figure 3) permet de régler les alarmes pour chaque jour de la semaine. Décocher un jour de la semaine désactive l’alarme correspondante. On peut également désactiver toutes les alarmes d’un seul clic.

La durée de l’alarme est également réglable. Un début d’alarme lance la commande Media ON et l’envoie à la LED IR. Une fin d’alarme lance

la commande Media OFF et l’envoie à la LED IR. L’alarme peut en outre faire retentir le buzzer (v. la page Paramètres).

Sur modification d’un paramètre d’alarme, un bref signal sonore est émis. Un paramètre modifié est sauvegardé dans l’EEPROM.

Page de configuration

Les paramètres ci-après sont réglables (voir figure 4).

> Période d’affichage à haute luminosité (Bright Start et Bright Stop).

> Le moment auquel s’affiche l’heure de la prochaine alarme (Alarme J+1), par ex. le soir quand on va se coucher ou bien tout de suite après la dernière alarme (cocher Fin de l’alarme précédente).

> Heure d’été, automatique ou manuelle.

> Code IR Media ON et Media OFF pour contrôler un autre appareil (par ex. une radio).

> Activer/désactiver le buzzer.

> L’identification du réseau wifi utilisant soit le DHCP, soit une adresse IP fixe.

Boutons-poussoirs

Cloc a deux boutons-poussoirs d’interaction avec l’utilisateur : S1 (désactivation) et S2 (arrêt). En fonctionnement normal, S1 active/ désactive l’alarme (allume/éteint l’affichage du bas). L’interface web dispose aussi de cette fonction. En appuyant sur S1 à la mise sous tension de Cloc, on restaure les valeurs par défaut définies dans le programme (pensez à les adapter à vos propres besoins avant de programmer l’horloge) C’est à faire à la toute première mise sous tension de l’horloge.

Figure 2. Outre l’heure et la date en cours, la page principale affiche, une vue d’ensemble des paramètres importants. Figure 3. La page Alarme permet de définir l’heure de réveil pour chaque jour de la semaine.
27
Figure 4. Tous les paramètres configurables par l’utilisateur sont sur la page Paramètres.

L’ESP32-PICO-KIT fournit la connectivité Internet et l’heure ; le MAX7219 contrôle huit afficheurs 7 segments répartis en deux rangées. Notez l’interface IR autour d’IC2 (entrée) et de LED4 (sortie).

TIME ALARM * LED5...12 = SC56-11EWA 220564-006 BOOT EN USB dp dp dp dp dp dp dp dp TSAL6400 (IR) a b c d e f g dp dp dp dp dp dp dp dp dp a a a a b b b b c c c c d d d d e e e e f f f f g g g g g f e d c b a g f e d c b a g f e d c b a a b c d e f g +5V Power +3V3 3 2 1 3V3 +3V3 +5V Extension +3V3 +5V +3V3 +3V3 Disable +5V +5V FSD0 FSD2 FSVP FSVN IO25 IO26 IO32 IO33 IO27 IO14 IO12 IO13 IO15 FSD1 FSD3 FCLK RXD0 TXD0 IO21 IO22 IO19 IO23 IO18 IO10 IO35 IO34 IO38 IO37 FCS IO2 IO4 IO0 3V3 GND GND 3V3 IO5 IO9 5V EN MOD1 ESP32 Pico-Kit V4 IC1 MAX7219 CNG SEGDP DOUT LOAD ISET SEGC SEGD SEGG SEGA SEGB SEGE SEGF DIG0 DIG1 DIG2 DIG3 DIG4 DIG5 DIG6 DIG7 DIN CLK 24 13 12 18 19 14 16 20 23 21 15 17 22 11 10 1 4 9 2 6 7 3 5 8 R1 47k C1 100µ 16V C2 100n R8 330Ω R5 22 Ω LED4 IR T1 BC337 R6 10k R7 10k S1 Stop S2 C7 1µ 16V K2 1 2 3 4 5 6 R2 820 Ω LED1 Blue R3 330 Ω LED2 Orange R4 330 Ω LED3 Red BUZ1 IC2 TSOP34338 R9 10k C5 47µ 16V C6 100n K3 D1 1N5817 C4 220µ 16V C3 100n LED9 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED10 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED11 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED12 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED5 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED6 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED7 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 LED8 10 CC CC 7 6 4 2 1 9 a b c d e f g 3 5 8 K1 1 2 3 4
28 www.elektormagazine.fr
Figure 5.

Si une alarme a été déclenchée en mode normal, un appui sur S2 l’arrête immédiatement et l’affichage du bas cesse de clignoter. Un appui sur S2 quand aucune alarme ne retentit, envoie le code IR de mise en marche/arrêt à l’appareil de votre choix. L’horloge se comporte alors comme une télécommande.

Un appui sur S2 pendant la mise sous tension, fait passer l’horloge en mode point d’accès (AP) à l’adresse 192.168.4.1. Vous pouvez vous y connecter via tout appareil (téléphone portable, tablette ou ordinateur) pour accéder à l’interface web de configuration des paramètres de l’horloge.

Description du circuit

La figure 5 donne le schéma du Cloc 2.0. Les deux afficheurs 7 segments et leur commande IC1 en occupent près des deux tiers. Pour piloter les huit chiffres, quatre par affichage (heure et alarme), j’ai choisi le MAX7219. Il exploite un bus SPI à 2 fils (le DIN n’est pas utilisé) et se programme facilement (bibliothèques open-source). La résistance R1 règle la luminosité max. de l’affichage (plus R1 est élevée, moins l’affichage brille). Notez que les afficheurs à haute luminosité sont vraiment lumineux, peut-être trop pour un réveil.

Pour Cloc 2.0, j’ai choisi le module  ESP32-PICO-KIT qui offre de nombreux ports d’E/S et qui a les dimensions parfaites pour ce projet. Le condensateur C7 n’est utile que si le module ESP32 reste en mode reset après la mise sous tension. Des modules ESP32 (anciens ?) souffriraient de ce problème que je n’ai jamais observé. Si vous décidez de monter C7, couchez-le orienté vers l’opposé de R6 et R7.

Le buzzer d’alarme BUZ1 (sans oscillateur interne) est piloté en MLI par le port IO27 de l’ESP32.

Les ports IO34/35 de l’ESP32 sont reliés aux boutons-poussoirs S1 et S2, et au connecteur K1. Dans une réalisation type, S1 et S2 sont fixés sur le dessus de l’horloge plutôt que sur le PCB, d’où la présence de K1. Bien que l’ESP32 en fournisse, des résistances de polarisation R6 & R7 de 10 kΩ sont prévues. En effet, ne compter que sur celles de l’ESP32, qui valent plusieurs centaines de kΩ, rendrait un bouton câblé plus sensible au bruit.

Trois LED de débogage (LED1/2/3) donnent l’état des connexions : réseau wifi (bleu), interface du serveur Web (orange) et trafic IR entrant/ sortant (rouge).

Interface IR

C5 et C6 découplent le récepteur infrarouge IC2 pour nettoyer le signal IR. La LED infrarouge TX (LED4) est pilotée par le transistor T1 et R5 limite à environ 150 mA le courant qui la traverse. La sortie IR est assez puissante pour contrôler tout équipement proche aussi bien que la télécommande d’origine de celui-ci.

Alimentation électrique

L’alimentation externe doit fournir au moins 500 mA sous 5 V DC La diode D1 protège le circuit contre une inversion de polarité.

LISTE DES COMPOSANTS

Résistances

R1 = 47 kΩ

R2 = 820 Ω

R3, R4, R8 = 330 Ω

R5 = 22 Ω

R6, R7, R9 = 10 kΩ

Condensateurs

C1 = 100 µF, 16 V

C2, C3, C6 = 100 nF

C4 = 220 µF, 16 V

C5 = 47 µF, 16 V

C7 = 1 µF, 16 V

Semi-conducteurs

D1 = 1N5817

IC1 = MAX7219

IC2 = TSOP34338

LED1 = bleu, 3 mm

LED2 = orange, 3 mm

LED3 = rouge, 3 mm

LED4 = TSAL6400, IR LED, 5 mm

LED5-12 = Chiffre à 7 segments 0.56”, CC (par exemple SC56-11EWA)

T1 = BC337

Divers

BUZ1 = Buzzer piézoélectrique sans oscillateur, 12 mm, 3,3 V

K1 = Tête de broche 1x4

K2 = Tête de broche 1x6

K3 = Jack baril

MOD1 = ESP32-PICO-KIT

S1, S2 = Interrupteur tactile 6x6 mm

PCB 220465-1

Boîtier Hammond 1591CTDR (rouge translucide)

Module d’horloge temps réel (RTC) DS3231

29

Si le module RTC DS3231 (option) est utilisé avec une pile bouton CR2032 non rechargeable, retirez la résistance ou la diode (ou les deux) dans le cercle rouge pour éviter d’endommager la pile.

Deux condensateurs électrolytiques (C1 & C4) amortissent les pics de courant. En parallèle des condensateurs de 100 nF (C2 & C3) atténuent le bruit HF.

Extensions

Le connecteur K2 est prévu pour une extension, par ex. à l’aide d’un module d’horloge en temps réel (v. ci-après). Trois ports d’E/S restent libres pour cela : IO4/26/32.

Option horloge en temps réel (RTC)

On peut connecter un module RTC DS3231 au bus d’extension K2. Il prend le relais si le serveur NTP est inaccessible pour une raison quelconque (par ex. wifi en panne, problème chez le fournisseur d’accès à Internet). Le module RTC est détecté et configuré automatiquement par le logiciel et remis à l’heure une fois par jour (à 12h00). Le DS3231 est très performant et compense la dérive du quartz grâce à un capteur de température intégré.

Le module RTC DS3231 communique en I²C et n’est relié à K2 que par quatre fils : GND, 3,3 V, SDA et SCL. Si un module RTC est détecté, le port IO26 devient le signal SDA et le port IO32 prend en charge le signal SCL du bus I²C.

Danger !

Attention, le RTC DS3231 comporte un risque. En effet, ce module intègre un circuit de charge de la batterie, mais souvent, il n’est livré qu’avec une batterie CR2032 non rechargeable installée qui risque alors d’exploser. Il existe deux solutions à ce problème. La plus simple (et la plus chère) est de remplacer la pile par une pile rechargeable LIR2032. La 2e solution consiste à retirer la diode ou la résistance de 200 Ω (ou les deux) près de la broche SCL du connecteur à 4 broches (figure 6).

Détails mécaniques

Le 1591CTDR de Hammond fait un bon boîtier pour Cloc. Il mesure 120 x 63 x 38 mm. Il est rouge translucide (IR) et parfait pour les afficheurs 7 segments de l’heure du jour et de l’heure d’alarme (rouge et/ou orange). La transmission et la réception des signaux IR bénéficient aussi d’un tel filtre optique. Notez que grâce à ce filtrage, la lumière pauvre en contenu rouge (par ex. la LED bleue) est à peine visible.

À ce propos, l’ESP32-PICO-KIT possède une LED d’alimentation rouge très brillante que vous voudrez probablement cacher ou supprimer.

est à l’aise dans le boîtier. Notez qu’elle peut aussi se monter sur le couvercle pour masquer les vis du boîtier. Le connecteur d’alimentation peut être monté des deux côtés de la carte.

Le circuit imprimé (PCB) a été conçu en tenant compte de cette enceinte. Le projet KiCad6 peut être téléchargé depuis [1]. Le boîtier loge facilement la carte montée sur quatre goujons de 16 mm (figure 7). Pour fixer la carte, il suffit de percer le fond de quatre trous de 3,2 mm ; il faut aussi un trou de 8 mm sur le côté pour le connecteur d’alimentation, et deux trous de 12 mm sur le dessus pour les deux boutons poussoirs.

Le module RTC en option peut être connecté à K2 sous le PCB principal (côté composant vers le haut) en utilisant l’embase vide à 4 broches. On peut préférer retirer l’embase coudée à 6 broches pour éviter les courts-circuits. On peut aussi le coller sur le PCB principal avec du ruban adhésif double face (ce que je l’ai fait).

L’environnement de développement logiciel

Pour développer le logiciel de Cloc 2.0, j’ai utilisé l’EDI Arduino après ajout du paquet des cartes ESP32. Pour éviter les erreurs de compilation ou de gestion mémoire, il faut sélectionner la carte ESP32 PICO-D4 à une fréquence CPU de 240 MHz. Pour le Partition Scheme choisir Default (c.-à-d. 4 Mo avec SPIFFS). En sélectionnant le bon port série, compilation et téléchargement du programme se déroulent sans problème.

Avant compilation, il faut installer les bibliothèques externes suivantes dans l’IDE. J’ai indiqué dans le code source où les obtenir. La plupart peuvent aussi s’obtenir par le gestionnaire de bibliothèques de l’IDE.

> AsyncElegantOTA

> AsyncTCP

> ESPAsyncWebServer

> IRremote (v. ligne 126 de Alarm_Clock.ino).

> LedControl

> RTClib

Important : Il faut modifier LedControl.h en commentant la ligne 30 (#include <avr/pgmspace.h>). Voir aussi le commentaire dans le code source.

Le téléchargement [1] contient un dossier nommé libraries qui comprend toutes les bibliothèques utilisées, dont le LedControl.h pré-modifié. Copiez ces bibliothèques dans le sous-dossier libraries du dossier Arduino sketchbook (chemin indiqué dans la fenêtre Preferences de l’IDE).

Figure 6.
30 www.elektormagazine.fr
Figure 7. La carte assemblée

Pour savoir comment ajouter l’option ESP32 Sketch Data Upload à l’IDE, voir [2]. C’est nécessaire pour charger l’interface web de l’horloge en mémoire de données du module ESP32. N’oubliez pas de charger ces données, sinon le serveur web restera muet.

Sans-fil (OTA)

Pour mettre le micrologiciel du réveil à jour sans fil via un navigateur, ciblez-y la page IP_of_cloc/update où IP_of_cloc représente l’adresse IP du réveil. Choisir alors un exécutable situé sur votre ordinateur et le télécharger dans le réveil. Une explication détaillée de l’interface OTA est disponible [3].

Au cœur du programme

Le programme est assez bien documenté (souvent en français), et après avoir lu ce qui suit, vous devriez être à l’aise. Surveillez le port série de l’ESP32 car beaucoup d’informations de débogage y sont envoyées.

Après l’inclusion des bibliothèques, définissez les valeurs par défaut utilisées soit au 1er démarrage, en maintenant l’appui sur le bouton (S1), soit depuis la page Settings en cliquant sur Defaults. L’ordre des constantes suit l’ordre des paramètres de la page Paramètres (lignes 40

à 65 d’Alarm_Clock.ino). Vérifiez en particulier l’adresse IP fixe et la passerelle, ainsi que les identifiants wifi. Pour la page Alarme (lignes 67 à 84), l’organisation est la même.

À la mise sous tension, on configure d’abord les fonctions. Il est facile de suivre l’ordre d’initialisation du matériel Cloc. La fonction initRTC vérifie si un module RTC DS3231 est connecté. Si le bouton S1 est enfoncé à ce moment-là, on charge les valeurs par défaut.

Au premier démarrage de l’horloge ou si Stop (S2) est pressé pendant la mise sous tension, on passe en mode Point d’accès (AP). Dans ce cas, comme l’horloge l’indique, un navigateur peut se connecter à son interface web : 192.168.4.1.

Après récupération de l’adresse IP (DHCP ou fixe) et s’être connecté au réseau wifi, on cherche l’heure NTP. Si elle est trouvée et qu’une RTC est présente, ils sont synchronisés. L’adresse IP de l’horloge s’affiche brièvement avant de passer à l’affichage de l’heure. L’écran commence à clignoter « HH:HH » pour l’heure et « AA:AA » pour l’alarme, si le serveur NTP n’a pas pu être trouvé et il faut redémarrer l’appareil (si aucun RTC n’est présent, sinon il affiche l’heure RTC).

Grrr. Vous êtes resté coincé ?

Vous aimez nos projets d’impression Elektor mais vous avez besoin d’aide ou vous avez une idée, une question ou un commentaire sur un article ?

Pas de soucis. Les ingénieurs d’Elektor, les rédacteurs et les membres de la communauté sont également actifs sur les médias sociaux.

Vous pouvez nous trouver ici :

www.elektor.fr/FB www.elektor.fr/TW www.elektor.fr/YT www.elektor.fr/insta www.elektor.fr/LI
31

L’initialisation s’achève par le démarrage du serveur web et du service AsyncOTA qui permet de faire une mise à jour à distance du µlogiciel et des SPIFFS.

La fonction loop exécute le reste du programme en une boucle sans fin. Si la RTC est présente (flagRTC=1), elle lit l’heure RTC. Sans RTC, le programme essaie l’heure NTP ( NTPflag=1 ). Une fois l’horloge connectée, le programme lit l’heure RTC, tandis que strTime contient l’heure NTP valide en format « hh:mm:ss », sinon elle contient « 0 » .

Ensuite, l’état des boutons est lu (checkButtons) et on vérifie si l’horloge doit émettre un bip et si un code IR a été reçu. Le serveur étant asynchrone, il faut utiliser des drapeaux pour signaler au programme principal les changements de paramètres et les déclenchements d’alarme.

À chaque seconde l’écran est rafraîchi (dispTime) et les alarmes sont lues (checkAlarm). Le programme vérifie aussi s’il est en période de haute luminosité ou non (checkBrightness) et s’il doit synchroniser le RTC avec l’heure NTP (checkSyncRTC ). Cela se produit une fois par jour à 12 h (syncRTC=12* 60). La fonction checkTimer vérifie si une alarme doit être activée. Pour cela, l’heure courante et l’heure de l’alarme sont converties en minutes (computeMinutes) avant comparaison (testRange).

Comme dit ci-avant, le serveur est asynchrone. Chaque fois que la page Paramètres ou Alarme est rafraîchie, les données à afficher (ParametresProcessor et TimerProcessor) sont renvoyées. Les balises %value% de la page HTML doivent donc être remplacées par les valeurs réelles.

Pour la page principale, c’est un peu différent car il faut afficher presque en temps réel l’heure du jour, la date et les heures de début et de fin de l’alarme. Une fonction écrite en JavaScript interroge environ chaque seconde la boucle principale pour récupérer les valeurs à afficher (onDataUpdate ). À chaque fois, la LED2 clignote brièvement pour indiquer l’accès au serveur (flashRqstBeacon). Pour vérifier que la page affiche bien les valeurs en temps réel, appuyez sur S1 (Alarm Disable). L’heure de l’alarme est affichée ou désactivée simultanément sur l’afficheur 7 segments et sur la page HTML.

Bibliothèque IRremote

La bibliothèque IRremote fonctionne parfaitement, mais nécessite quelques règles d’intégration. Ne déplacez pas le code d’initialisation, sauf si vous savez ce que vous faites.

Pour le réveil en musique au lieu d’un bip, j’utilise une radio Bose. J’ai donc limité la réception et le décodage aux télécommandes Bose (voir ligne 125 de Alarm_Clock.ino). Vous pouvez supprimer cette ligne pour décoder d’autres télécommandes. Je recommande de limiter la réception infrarouge à la marque de votre radio ou de votre chaîne hi-fi. Pour les autres options possibles, voir [4].

De même, la transmission IR est limitée au format Bose. Il est donc fort probable que vous deviez adapter le code à la marque de votre équipement Hi-Fi. Remplacez la ligne IrSender.sendBoseWave des fonctions startMedia et stopMedia de Alarm_Clock.ino par une fonction correspondant à votre marque (voir [4]).

Pour découvrir les codes IR à utiliser avec votre système (audio), reliez le port USB du module ESP32 à un ordinateur utilisant un moniteur série, par exemple le Serial Monitor intégré à l’IDE Arduino. Dirigez votre télécommande vers le récepteur IR de l’horloge et pressez une touche ; le code correspondant en hexadécimal s’affiche sur l’ordinateur. Saisissez les codes en hexadécimal dans les champs Media ON et Media OFF du panneau Paramètres.

Spécifications

> Basé sur un processeur ESP32.

> Deux rangées de 4 afficheurs à 7 segments : l’une indique l’heure qu’il est, l’autre l’heure d’alarme.

> Réglage automatique de l’heure par connexion à un serveur de temps en ligne.

> Heure d’alarme propre à chaque jour de la semaine.

> Sortie d’alarme : buzzer et code infrarouge, par ex. pour une radio, chaîne hi-fi ou TV.

> Deux boutons-poussoirs d’interaction avec l’appareil.

> Serveur web intégré pour la configuration à distance via Wi-Fi.

> Tous paramètres enregistrés en EEPROM

> Le mode Over-the-Air (OTA) permet la mise à jour sans fil du micrologiciel.

> Module optionnel d’horloge temps réel (RTC) basé sur DS3231 secouru par batterie.

Le clignotement bref de la LED3 signale l’activité IR. Cette LED clignote donc également lorsqu’une alarme est active.

Faites-le vous-même !

Depuis plusieurs mois déjà, j’utilise cette Cloc version 2.0 et je n’ai jamais manqué un réveil à cause d’un dysfonctionnement. La possibilité de définir un heure d’alarme pour chaque jour de la semaine est très pratique.

Je recommande vivement d’ajouter l’option RTC car si le serveur NTP ne répond pas (par ex. si votre modem s’est déconnecté pour une raison quelconque), le réveil perdra l’heure au moment suivant de resynchronisation de l’heure NTP. Il faudra alors arrêter et redémarrer le réveil une fois l’heure NTP à nouveau disponible. Pour une fiabilité accrue, j’ai réalisé un petit serveur NTP qui reçoit l’heure d’un GPS [5]. Ainsi, même en l’absence de connexion Internet, mon réveil se règle automatiquement.

32 www.elektormagazine.fr

J’espère que vous serez nombreux à réaliser ce réveil. N’hésitez pas à me contacter sur mon courriel privé (yb.electronique@orange.fr) si vous rencontrez des difficultés ou si vous apportez des améliorations à mon réveil préféré !

220564-04 — VF : Yves Georges

Produits

> ESP32-PICO-Kit V4 (SKU 18423) www.elektor.fr/18423

> Elektor Arduino Electronics Bundle (SKU 19440) www.elektor.fr/19440

> Module RTC de SparkFun – RV-8803 (Qwiic) (SKU 19646) www.elektor.fr/19646

Des questions, des commentaires ? Envoyez un courriel à l’auteur (yb.electronique@orange.fr) ou contactez Elektor (redaction@elektor.fr).

LIENS

[1] Téléchargements pour Cloc 2.0 (Elektor Labs) : https://www.elektormagazine.fr/labs/cloc-le-reveil-20

[2] Téléchargement de données ESP32 SPIFFS : https://randomnerdtutorials.com/install-esp32-filesystem-uploader-arduino-ide/

[3] Mises à jour OTA (Over-the-Air) de l’ESP32 : https://randomnerdtutorials.com/esp32-ota-over-the-air-arduino/

[4] Bibliothèque IRremote : https://github.com/Arduino-IRremote/Arduino-IRremote

[5] Serveur NTP (Elektor Labs) : https://www.elektormagazine.fr/labs/ntp-server

NOUVEAU www.elektor.fr/arduino-uno-r4-wifi Arduino Uno R4 33
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.