Citrouille détecteur de WiFi

Ce soir, c’est Halloween. Déguisements, bonbons, sorts et … citrouilles.

Pour illuminer la récolte, nous avons eu l’idée de rajouter des yeux lumineux à un panier en plastique en forme de citrouille.

Mais pour rajouter un peu de vie à cette citrouille, les yeux vont clignoter au rythme des signaux WiFi environnants.

La maquette

Le montage lui même est rudimentaire :

  • un ESP8266,
  • une résistance de 220 Ohm,
  • deux leds,
  • et une batterie d’appoint pour l’autonomie.

Pour plus d’évolutivité, les LEDs sont controlables indépendamment.

Schéma
Figure 3. Schéma

Pour le code, on fait simple : un script Lua pour NodeMCU :

esp8266_halloween.lua


-- Settings

-- wifi.PHYMODE_B 802.11b, More range, Low Transfer rate, More current draw
-- wifi.PHYMODE_G 802.11g, Medium range, Medium transfer rate, Medium current draw
-- wifi.PHYMODE_N 802.11n, Least range, Fast transfer rate, Least current draw 
wifi_signal_mode = wifi.PHYMODE_N

left_pin = 2
right_pin = 3

maxspeed = 50
minspeed = 800

maxrssi = -40
minrssi = -100

function compute_speed(rssi)
    speed=maxspeed
    -- Normalize
    theval=rssi
    if rssi < minrssi then
        theval=minrssi
    end
    if rssi > maxrssi then
        theval=maxrssi
    end
    speed=minspeed+(theval-minrssi)*(maxspeed-minspeed)/(maxrssi-minrssi)
    return speed
end

-- max strength
current_rssi=0
function findmax(t) -- (SSID : Authmode, RSSI, BSSID, Channel)
    max=-200
    for ssid,v in pairs(t) do
        local authmode, rssi, bssid, channel = string.match(v, "([^,]+),([^,]+),([^,]+),([^,]+)")
        rssi = tonumber(rssi)
        if rssi > max then
            max = rssi
        end
    end
    print("MAX=",max)
    current_rssi = max
    speed=compute_speed(max)
    print("SPEED=",speed)
end

-- Init

-- Connect to the wifi network
wifi.setmode(wifi.STATION) 
wifi.setphymode(wifi_signal_mode)

rssi_alarm=1
tmr.alarm(rssi_alarm,5000,1,function()
  wifi.sta.getap(findmax)
end)

-- GPIO
gpio.mode(left_pin, gpio.OUTPUT)
gpio.mode(right_pin, gpio.OUTPUT)

-- Run

blink_alarm=0
tmr.stop(blink_alarm)
tmr.unregister(blink_alarm)

lighton=0
blinkspeed=minspeed
function blinking()
    if lighton==0 then
        lighton=1
        gpio.write(left_pin, gpio.HIGH)
        gpio.write(right_pin, gpio.HIGH)
    else
        lighton=0
        gpio.write(left_pin, gpio.LOW)
        gpio.write(right_pin, gpio.LOW)
    end
    tmr.stop(blink_alarm)
    tmr.unregister(blink_alarm)
    blinkspeed=compute_speed(current_rssi)
    tmr.alarm(blink_alarm,blinkspeed,1,blinking)
end
tmr.alarm(blink_alarm,blinkspeed,1,blinking)

Références