Skip to content

Commit ff0ad07

Browse files
authored
Merge pull request #4 from jedie/develop
Develop
2 parents a289017 + 90c2a89 commit ff0ad07

File tree

12 files changed

+199
-118
lines changed

12 files changed

+199
-118
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ The device will do:
3232
Point you Webserver to the IP from the device.
3333

3434
You can turn the switch on/off by the web page or the device button.
35+
Reset the device by long pressing the button.
3536

3637

3738
## Screenshot

src/boot.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@
33
import esp
44
import utime as time
55

6+
print('gc.collect()')
7+
gc.collect()
68

7-
for no in range(3, 0, -1):
9+
10+
for no in range(2, 0, -1):
811
print('%i boot.py wait...' % no)
912
time.sleep(1)
1013

1114

1215
print('Check Firmware:')
1316
assert esp.check_fw() is True, "Firmware error?!?"
14-
esp.osdebug(None) # turn off vendor O/S debugging messages
15-
16-
17-
print('gc.collect()')
18-
gc.collect()
17+
esp.osdebug(None) # turn off vendor O/S debugging messages
18+
esp.sleep_type(esp.SLEEP_NONE) # Don't go into sleep mode
1919

2020

21-
print('boot.py END')
21+
print('boot.py END')

src/button_handler.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import gc
2+
import sys
3+
4+
import machine
5+
import utime as time
6+
from leds import power_led, relay
7+
from pins import button_pin
8+
9+
10+
def get_debounced_value(pin):
11+
"""
12+
get debounced value from pin by waiting for stable value
13+
"""
14+
cur_value = pin.value()
15+
stable = 0
16+
while stable < 40:
17+
if pin.value() == cur_value:
18+
stable += 1
19+
else:
20+
stable = 0
21+
cur_value = pin.value()
22+
time.sleep_ms(1)
23+
return cur_value
24+
25+
26+
class Button:
27+
down_start = None
28+
29+
def irq_handler(self, pin):
30+
power_led.off()
31+
button_value = get_debounced_value(pin)
32+
power_led.on()
33+
34+
print('button_value:', button_value)
35+
if button_value == 0:
36+
# button pressed
37+
self.down_start = time.ticks_ms()
38+
elif button_value == 1:
39+
# button released
40+
duration_ms = time.ticks_diff(time.ticks_ms(), self.down_start)
41+
print('duration_ms:', duration_ms)
42+
if duration_ms > 2000:
43+
print('reset after long press...')
44+
power_led.flash(sleep=0.1, count=20)
45+
machine.reset()
46+
sys.exit()
47+
48+
print('old state:', relay)
49+
relay.toggle()
50+
print('new state:', relay)
51+
52+
gc.collect()
53+
54+
55+
button_pin.irq(Button().irq_handler)

src/leds.py

Lines changed: 21 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
1-
import gc
2-
3-
import machine
1+
import pins
42
import utime as time
53

64

75
class Led:
8-
def __init__(self, no):
9-
self.pin = machine.Pin(no, machine.Pin.OUT)
6+
def __init__(self, name, pin, on, off):
7+
self.name = name
8+
self.pin = pin
9+
self._on = on
10+
self._off = off
1011

1112
def on(self):
12-
""" turn LED on """
13-
self.pin.value(0)
13+
self.pin.value(self._on)
1414

1515
def off(self):
16-
""" turn LED off """
17-
self.pin.value(1)
16+
self.pin.value(self._off)
1817

1918
def toggle(self):
20-
self.pin.value(0 if self.pin.value() else 1)
19+
self.pin.value(self._off if self.pin.value() else self._on)
2120

2221
def flash(self, sleep=0.01, count=5):
2322
self._flash(sleep, count)
@@ -29,38 +28,21 @@ def _flash(self, sleep, count):
2928
time.sleep(sleep)
3029
self.pin.value(old_value)
3130

31+
@property
32+
def state(self):
33+
if self._on:
34+
return 'ON' if self.pin.value() else 'OFF'
35+
else:
36+
return 'OFF' if self.pin.value() else 'ON'
3237

33-
class PowerLed(Led):
34-
def __init__(self):
35-
super().__init__(no=13)
36-
37-
38-
power_led = PowerLed()
39-
40-
41-
def test():
42-
print('test starts...')
43-
print('off')
44-
power_led.off()
45-
time.sleep(1)
46-
print('on')
47-
power_led.on()
48-
time.sleep(1)
49-
print('toggle 1')
50-
power_led.toggle()
51-
time.sleep(1)
52-
print('toggle 2')
53-
power_led.toggle()
54-
time.sleep(1)
38+
def __str__(self):
39+
return '%s %s: %s' % (self.name, self.pin, self.state)
5540

56-
print('flash')
57-
power_led.flash(sleep=0.1, count=5)
5841

59-
gc.collect()
60-
print('test ends.')
42+
power_led = Led(name='power', pin=pins.power_led_pin, on=0, off=1)
43+
relay = Led(name='relay', pin=pins.relay_pin, on=1, off=0)
6144

6245

6346
if __name__ == '__main__':
64-
print('LED test start...')
65-
test()
66-
print('LED test end')
47+
print(relay)
48+
print(power_led)

src/leds_test.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import utime as time
2+
from leds import power_led, relay
3+
4+
5+
def test():
6+
print('test starts...')
7+
print('off')
8+
relay.off()
9+
print(relay)
10+
power_led.off()
11+
print(power_led)
12+
13+
time.sleep(1)
14+
15+
print('on')
16+
power_led.on()
17+
print(power_led)
18+
19+
time.sleep(1)
20+
21+
print('toggle 1')
22+
power_led.toggle()
23+
24+
time.sleep(1)
25+
26+
print('toggle 2')
27+
power_led.toggle()
28+
29+
time.sleep(1)
30+
31+
print('flash')
32+
power_led.flash(sleep=0.1, count=20)
33+
34+
relay.on()
35+
print(relay)
36+
37+
print('test ends.')
38+
39+
40+
if __name__ == '__main__':
41+
print('LED test start...')
42+
test()
43+
print('LED test end')

src/main.py

Lines changed: 7 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,30 @@
11
import gc
22

3-
import machine
43
import micropython
5-
import utime as time
64

75
micropython.alloc_emergency_exception_buf(128)
86

9-
for no in range(3, 0, -1):
10-
print('%i main.py wait...' % no)
11-
time.sleep(1)
7+
# init own stuff:
128

139
from watchdog import watchdog # noqa isort:skip
1410
from wifi import wifi # noqa isort:skip
1511
from ntp import ntp_sync # noqa isort:skip
16-
from leds import power_led # noqa isort:skip
12+
from leds import power_led, relay # noqa isort:skip
13+
import button_handler # noqa isort:skip
1714

1815
print('watchdog:', watchdog)
1916
print('wifi:', wifi)
2017
print('ntp_sync:', ntp_sync)
2118
print('power_led:', power_led)
19+
print('relay:', relay)
2220

23-
24-
def get_debounced_value(pin):
25-
"""get debounced value from pin by waiting for 20 msec for stable value"""
26-
cur_value = pin.value()
27-
stable = 0
28-
while stable < 20:
29-
if pin.value() == cur_value:
30-
stable = stable + 1
31-
else:
32-
stable = 0
33-
cur_value = pin.value()
34-
time.sleep_ms(1)
35-
return cur_value
36-
37-
38-
def button_pressed(pin):
39-
print('button pressed...')
40-
cur_button_value = get_debounced_value(pin)
41-
if cur_button_value == 1:
42-
if relay_pin.value() == 1:
43-
print('turn off by button.')
44-
relay_pin.value(0)
45-
else:
46-
print('turn on by button.')
47-
relay_pin.value(1)
48-
49-
garbage_collection()
50-
51-
52-
button_pin = machine.Pin(0, machine.Pin.IN)
53-
button_pin.irq(button_pressed)
54-
21+
print('main.py wait with power led flash...')
22+
power_led.flash(sleep=0.1, count=20)
5523

5624
print('gc.collect()')
5725
gc.collect()
5826

5927

28+
# Start the Webserver:
6029
from webswitch import main # noqa isort:skip
6130
main()

src/ntp.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
import machine
66
import ntptime
77
import utime as time
8-
from watchdog import watchdog
8+
9+
from watchdog import watchdog # noqa isort:skip
910
from wifi import wifi # noqa isort:skip
1011

1112
rtc = machine.RTC()
@@ -30,21 +31,20 @@ def __init__(self):
3031
callback=self._timer_callback)
3132

3233
def _timer_callback(self, timer):
33-
print('NTP timer callback for:', timer)
3434
try:
3535
self._sync()
3636
except Exception as e:
3737
sys.print_exception(e)
3838
self.timer.deinit()
3939

4040
def _sync(self):
41-
print('Synchronize time from %r ...' % ntptime.host)
4241
gc.collect()
4342

4443
if not wifi.is_connected:
4544
print('Skip NTP sync: not connectet to a WiFi!')
4645
return
47-
46+
47+
print('Synchronize time from %r ...' % ntptime.host)
4848
print('old UTC:', rtc.datetime())
4949
s = 1
5050
while True:

src/pins.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import machine
2+
3+
power_led_pin = machine.Pin(13, machine.Pin.OUT)
4+
relay_pin = machine.Pin(12, machine.Pin.OUT) # relay + red led
5+
button_pin = machine.Pin(0, machine.Pin.IN)

src/rtc_memory.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import gc
2+
3+
import machine
4+
import ujson as json
5+
6+
7+
class RtcMemory:
8+
def __init__(self):
9+
rtc_memory = machine.RTC().memory() # Restore from RTC RAM
10+
if rtc_memory:
11+
self.rtc_memory = json.loads(rtc_memory)
12+
else:
13+
self.rtc_memory = {}
14+
gc.collect()
15+
16+
def save(self):
17+
machine.RTC().memory(json.dumps(self.rtc_memory))
18+
gc.collect()
19+
20+
def incr_rtc_count(self, key):
21+
count = self.rtc_memory.get(key, 0) + 1
22+
self.rtc_memory[key] = count
23+
self.save()
24+
return count
25+
26+
27+
if __name__ == '__main__':
28+
count = RtcMemory().incr_rtc_count(key='test')
29+
print('RTC memory test call count:', count)

0 commit comments

Comments
 (0)