Carecast
Two ambient devices for friends who live apart. Each plays the other's weather as sound.

The brief imagined the smart home of 2040, set in the TU/e IoT Sandbox.
Can weather carry care between two friends while it stays in the background?
Technology that stays in the periphery of attention and moves to the centre when it is needed (Weiser & Brown, 1997).
In Carecast: the weather sound stays in the background of the room until you turn to it, to listen to a friend's weather or send them yours.

- Note 01 I introduced a meta-design framework to structure the open brief and kept a shared record of our decisions.
- Note 02 We composed the weather soundscapes by live coding in Sonic Pi, with AI assistance for the code.
- Note 03 A focus group with three participants aged 18 to 25 compared realistic weather sounds with layered, composed ones. I analysed the results.
Four clips from the Carecast sound library, rendered from our Sonic Pi code. Credits are in the code below.
Each soundscape stacks three layers in Sonic Pi: a pad for the background tone, a bass for body, and a harmonic or melodic line for variation. The weather label sets the overall mood. A small map function turns each reading into a sound value: more rain means faster drops and lower notes, and stronger wind means a louder, brighter rush.
# Carecast · weather sonification in Sonic Pi
# Sonic Pi code by the Carecast team, 2025
# Excerpt: the map function, the rain layers and the wind
#
# Credits
# Birdsong (sunny clip): "Woodpecker and other birds on a spring morning"
# by Kyster, https://freesound.org/s/182740/ (CC BY 4.0), slowed and filtered
# Comments translated from Chinese
# map function
define :map_val do |v, in_min, in_max, out_min, out_max|
return out_min if in_min == in_max # avoid dividing by zero
v = [[v, in_min].max, in_max].min # clamp to the range
ratio = (v - in_min).to_f / (in_max - in_min).to_f
out_min + ratio * (out_max - out_min)
end
#--------------------------------------------
#rain drop, overlap with all weather
#--------------------------------------------
define :dual_synth_drop do |s1, s2, note, amp_base|
unless playing_weather?
sleep 1
next
end
use_synth s1
play note,
amp: amp_base * 0.6,
attack: 0.01,
release: 0.35
use_synth s2
play note + [0, 2].choose,
amp: amp_base * 0.4,
attack: 0.0,
release: 0.45
end
# 1. Drizzle: high notes, sparse
live_loop :drizzle do
unless playing_weather?
sleep 1
next
end
rain_mm = get(:rain_mm)
rain_norm = map_val(rain_mm, 0, 30, 0.0, 1.0)
with_fx :echo, phase: 0.45, decay: 2.5, mix: 0.35 do
note = (scale :e5, :minor_pentatonic).choose
if rand < (0.9 * (1 - rain_norm))
dual_synth_drop :sine, :tri, note, rain_norm*0.8
end
end
# rainfall maps to 3.0 s → 0.2 s
sleep map_val(rain_mm, 0, 30, 3.0, 0.2)
end
# 2. Middle rain: middle register
live_loop :middle_rain do
unless playing_weather?
sleep 1
next
end
rain_mm = get(:rain_mm)
rain_norm = map_val(rain_mm, 0, 30, 0.0, 0.8)
with_fx :echo, phase: 0.28, decay: 2.2, mix: 0.5 do
if rand < map_val(rain_mm, 0, 30, 0.05, 0.95)
note = (scale :e4, :minor_pentatonic).choose
amp_val = rain_norm*0.8
dual_synth_drop :tri, :beep, note, amp_val
end
end
sleep map_val(rain_mm, 0, 30, 1.5, 0.5)
end
# 3. Heavy rain: low register
live_loop :heavy_rain do
unless playing_weather?
sleep 1
next
end
rain_mm = get(:rain_mm)
rain_norm = map_val(rain_mm, 0, 30, 0.0, 1.0)
with_fx :echo, phase: 0.16, decay: 3.5, mix: 0.75 do
if rand < rain_norm
low_note = (scale :e3, :minor_pentatonic).choose
dual_synth_drop :beep, :tri, low_note, rain_norm*0.8
if rand < rain_norm
use_synth :sine
play (scale :e5, :minor_pentatonic).choose,
amp: rain_norm*0.15,
attack: 0.0,
release: 0.2
end
end
end
sleep map_val(rain_mm, 0, 30, 0.7, 0.45)
end
#--------------------------------------------
# wind, overlap with all weather
#--------------------------------------------
live_loop :wind do
wind_speed = get(:wind_speed)
unless playing_weather?
sleep 1
next
end
if wind_speed < 3
sleep 1
next
end
wind_amp = map_val(wind_speed, 0, 20, 0.3, 1.2)
cutoff = map_val(wind_speed, 3, 15, 70, 110)
with_fx :reverb, room: 0.9, mix: 0.7 do
with_fx :lpf, cutoff: cutoff + rrand(-10, 10) do
synth :noise, amp: wind_amp,
attack: 1.0,
sustain: 2.0,
release: rrand(4.0, 8.0)
end
end
sleep rrand(3, 5)
end



An ESP32 reads the touch sensor and drives the LED strips. A bridge program fetches live weather, has Sonic Pi play it through a Bluetooth speaker and shares data with the IoT Sandbox through OOCSI. I also built a web app and a knob controller as backup demos.
Participants preferred the composed sounds, even when they recognised the weather less accurately. One said: “It felt like a message, not just noise.” They heard the sounds through their own places: to one of them, thunder meant typhoons. Checking a friend's weather felt like thoughtfulness more than information.
A study in real homes, over months. The first evaluation was a small focus group in a meeting room. The materials were chosen for function. Circular electronics made from grown materials became the subject of Kombuchán, the project that followed.
- Weiser, M., & Brown, J. S. (1997). The coming age of calm technology. In P. J. Denning & R. M. Metcalfe (Eds.), Beyond Calculation: The Next Fifty Years of Computing (pp. 75–85). Springer.
- Fischer, G., & Giaccardi, E. (2006). Meta-design: A framework for the future of end-user development. In H. Lieberman, F. Paternò, & V. Wulf (Eds.), End User Development (pp. 427–457). Springer.