meta data for this page
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
ixc2025:lappeenranta:team_1:start [2025/05/22 11:49] – [5. Future Improvements] mrc | ixc2025:lappeenranta:team_1:start [2025/05/22 15:51] (current) – [1. Group Introduction] mrc | ||
---|---|---|---|
Line 5: | Line 5: | ||
==== 1. Group Introduction ==== | ==== 1. Group Introduction ==== | ||
+ | We are DAMP+J, a team formed during the hackathon to explore how IoT can be used to influence individual behavior for sustainability and well-being. Our group brings together complementary skills in embedded systems, software engineering, | ||
+ | Our approach prioritizes simplicity, functionality, | ||
+ | |||
+ | Our final project, FRoast, reflects this mindset—a behavior-aware smart fridge prototype designed to promote conscious food habits, reduce waste, and make sustainability both personal and actionable. | ||
+ | |||
+ | |||
+ | === Our team members === | ||
+ | - Jorge Leon | ||
+ | - Marcia Rodrigues | ||
+ | - Daniella Fajardo | ||
+ | - Prachi Singhal | ||
+ | - Abdulkadir Abubakar | ||
==== 2. Initial brainstorming ideas/ | ==== 2. Initial brainstorming ideas/ | ||
Line 13: | Line 25: | ||
We explored several IoT-based concepts that aim to nudge individuals toward sustainable, | We explored several IoT-based concepts that aim to nudge individuals toward sustainable, | ||
- | === 🚿 Smart Bath / Water Control System === | + | === Smart Bath / Water Control System === |
* **Goal**: Reduce water and energy waste by encouraging shorter, more efficient showers. | * **Goal**: Reduce water and energy waste by encouraging shorter, more efficient showers. | ||
* **What it’s about**: This system monitors shower duration using steam and temperature sensors. It gives real-time feedback using buzzers, RGB lights, or LCD messages when a user exceeds optimal limits. The aim is to build awareness of water usage and promote sustainable bathing habits. | * **What it’s about**: This system monitors shower duration using steam and temperature sensors. It gives real-time feedback using buzzers, RGB lights, or LCD messages when a user exceeds optimal limits. The aim is to build awareness of water usage and promote sustainable bathing habits. | ||
Line 22: | Line 34: | ||
* Eco-feedback or daily stats to reward water-efficient behavior. | * Eco-feedback or daily stats to reward water-efficient behavior. | ||
- | === 🌱 Sustainability Coach – In-Room Behavioral Monitoring === | + | === Sustainability Coach – In-Room Behavioral Monitoring === |
* **Goal**: Help individuals become more energy-conscious in their personal spaces. | * **Goal**: Help individuals become more energy-conscious in their personal spaces. | ||
* **What it’s about**: This system acts as a digital coach inside a user’s room. It monitors air conditioning use, artificial lighting, fan activity, and motion detection to identify unnecessary resource consumption. Feedback is delivered via lights, screen messages, and audio cues. | * **What it’s about**: This system acts as a digital coach inside a user’s room. It monitors air conditioning use, artificial lighting, fan activity, and motion detection to identify unnecessary resource consumption. Feedback is delivered via lights, screen messages, and audio cues. | ||
Line 32: | Line 44: | ||
* Idle Energy Consumption: | * Idle Energy Consumption: | ||
- | === 🥩 Meat Consumption Awareness Coach (Concept) === | + | === Meat Consumption Awareness Coach (Concept) === |
* **Goal**: Encourage more sustainable dietary choices by reducing unnecessary meat consumption. | * **Goal**: Encourage more sustainable dietary choices by reducing unnecessary meat consumption. | ||
* **What it’s about**: While not fully developed, the concept involved using fridge/ | * **What it’s about**: While not fully developed, the concept involved using fridge/ | ||
Line 41: | Line 53: | ||
* While not implemented, | * While not implemented, | ||
- | === ♿ EcoAccess Station – Adaptive Smart Environment for Inclusion === | + | === EcoAccess Station – Adaptive Smart Environment for Inclusion === |
* **Goal**: Combine energy efficiency with personalized accessibility for users with diverse needs. | * **Goal**: Combine energy efficiency with personalized accessibility for users with diverse needs. | ||
* **What it’s about**: EcoAccess Station uses **RFID** to identify users and adapt room conditions based on their physical or sensory requirements (e.g., mobility-impaired, | * **What it’s about**: EcoAccess Station uses **RFID** to identify users and adapt room conditions based on their physical or sensory requirements (e.g., mobility-impaired, | ||
Line 51: | Line 63: | ||
* Provides accessible feedback through color-coded LEDs and simple audio/text messages. | * Provides accessible feedback through color-coded LEDs and simple audio/text messages. | ||
- | === ❄️ | + | === Coach Fridge – Personal Eating Habits(Selected Project) === |
* **Goal**: Promote healthier eating habits and reduce unconscious fridge use through personalized feedback. | * **Goal**: Promote healthier eating habits and reduce unconscious fridge use through personalized feedback. | ||
* **What it’s about**: Coach Fridge uses **RFID** to identify users and monitors their **frequency**, | * **What it’s about**: Coach Fridge uses **RFID** to identify users and monitors their **frequency**, | ||
Line 75: | Line 87: | ||
==== 3. Day 2 Presentation slides ==== | ==== 3. Day 2 Presentation slides ==== | ||
+ | {{ : | ||
==== 4. Finalised Idea, description & Functions ==== | ==== 4. Finalised Idea, description & Functions ==== | ||
Line 82: | Line 94: | ||
The project is a smart fridge system designed to monitor and influence users’ eating habits through real-time feedback and personalized behavior tracking. It uses RFID identification, | The project is a smart fridge system designed to monitor and influence users’ eating habits through real-time feedback and personalized behavior tracking. It uses RFID identification, | ||
- | === 🔎 Description === | + | === Description === |
Each time a user approaches the fridge, they are identified using an RFID tag. The system monitors fridge access patterns — how often, when, and for how long the fridge is used — and cross-references this with sensor data (e.g., steam, gas, temperature, | Each time a user approaches the fridge, they are identified using an RFID tag. The system monitors fridge access patterns — how often, when, and for how long the fridge is used — and cross-references this with sensor data (e.g., steam, gas, temperature, | ||
Line 94: | Line 106: | ||
Real-time nudges are provided through LEDs, buzzer sounds, and messages on an LCD display, mimicking the role of a digital “fridge coach.” | Real-time nudges are provided through LEDs, buzzer sounds, and messages on an LCD display, mimicking the role of a digital “fridge coach.” | ||
- | === ⚙️ | + | === Functions === |
* **User Identification**: | * **User Identification**: | ||
Line 140: | Line 152: | ||
* Differentiate between habitual and intentional exceptions | * Differentiate between habitual and intentional exceptions | ||
==== 6. SUSAF Analysis ==== | ==== 6. SUSAF Analysis ==== | ||
+ | |||
+ | {{: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
Line 200: | Line 222: | ||
==== 8. Final Day Presentation Slides ==== | ==== 8. Final Day Presentation Slides ==== | ||
+ | {{ : | ||
==== 9. Final Code ==== | ==== 9. Final Code ==== | ||
Line 210: | Line 232: | ||
import dht | import dht | ||
from mfrc522_i2c import mfrc522 | from mfrc522_i2c import mfrc522 | ||
+ | import collections | ||
+ | |||
+ | class MessageQueue: | ||
+ | def __init__(self): | ||
+ | self.queue = [] | ||
+ | |||
+ | async def put(self, item): | ||
+ | self.queue.append(item) | ||
+ | |||
+ | async def get(self): | ||
+ | while not self.queue: | ||
+ | await asyncio.sleep(0.1) | ||
+ | return self.queue.pop(0) | ||
+ | |||
+ | message_queue = MessageQueue() | ||
# Constants | # Constants | ||
Line 255: | Line 292: | ||
STEAM_SENSOR.atten(ADC.ATTN_11DB) | STEAM_SENSOR.atten(ADC.ATTN_11DB) | ||
STEAM_THRESHOLD = 800 # Analog value above this = steam detected | STEAM_THRESHOLD = 800 # Analog value above this = steam detected | ||
+ | |||
+ | current_user = " | ||
Line 290: | Line 329: | ||
- | async def scroll_text(text, | + | async def scroll_text(text, |
if len(text) <= 16: | if len(text) <= 16: | ||
lcd.move_to(0, | lcd.move_to(0, | ||
Line 299: | Line 338: | ||
lcd.putstr(text[i: | lcd.putstr(text[i: | ||
await asyncio.sleep(delay) | await asyncio.sleep(delay) | ||
- | + | | |
- | async def show_message(upper, lower="" | + | async def message_handler(): |
- | lcd.clear() | + | while True: |
- | await scroll_text(upper, | + | |
- | await scroll_text(lower, | + | lcd.clear() |
+ | await scroll_text(upper, | ||
+ | await scroll_text(lower, | ||
# --- ASYNC TASKS --- | # --- ASYNC TASKS --- | ||
Line 315: | Line 356: | ||
data = sum(rc522.uid.uidByte[0: | data = sum(rc522.uid.uidByte[0: | ||
print(" | print(" | ||
+ | current_user = data | ||
+ | print(" | ||
+ | | ||
if data == AUTHORIZED_ID: | if data == AUTHORIZED_ID: | ||
if door_opened: | if door_opened: | ||
+ | print(" | ||
duration = time.time() - open_time | duration = time.time() - open_time | ||
print(" | print(" | ||
Line 322: | Line 367: | ||
if duration > 15: | if duration > 15: | ||
await play_alarm() | await play_alarm() | ||
- | await show_message("Your indecision is heating the planet." | + | await message_queue.put(("Your indecision is heating the planet." |
+ | print(" | ||
else: | else: | ||
- | await show_message(" | + | await message_queue.put((" |
else: | else: | ||
await open_door() | await open_door() | ||
Line 331: | Line 378: | ||
current_hour = time.localtime()[3] | current_hour = time.localtime()[3] | ||
if current_hour >= 23 or current_hour < 5: | if current_hour >= 23 or current_hour < 5: | ||
- | await show_message("You hungry or just emotionally empty again?", | + | await message_queue.put(("You hungry or just emotionally empty again?", |
+ | print(" | ||
else: | else: | ||
- | await show_message(" | + | await message_queue.put((" |
else: | else: | ||
print(" | print(" | ||
- | await show_message(" | + | await message_queue.put((" |
- | await asyncio.sleep(0.5) | + | await asyncio.sleep(1) |
def monitor_steam_sensor(): | def monitor_steam_sensor(): | ||
Line 348: | Line 396: | ||
if analog_value > STEAM_THRESHOLD: | if analog_value > STEAM_THRESHOLD: | ||
- | await show_message("The fridge is not your sauna, pal." | + | await message_queue.put(("The fridge is not your sauna, pal.", "")) |
- | print(" | + | print(" |
await asyncio.sleep(2) | await asyncio.sleep(2) | ||
Line 355: | Line 403: | ||
except Exception as e: | except Exception as e: | ||
print(" | print(" | ||
- | await asyncio.sleep(4) | + | await asyncio.sleep(2) |
| | ||
async def monitor_humidity(): | async def monitor_humidity(): | ||
Line 367: | Line 415: | ||
print(' | print(' | ||
if temperature_value > TEMP_THRESHOLD: | if temperature_value > TEMP_THRESHOLD: | ||
- | await show_message("Want to cool the Sahara too?") | + | await message_queue.put(("Want to cool the Sahara too?", "" |
+ | print(" | ||
elif humidity_value > HUMIDITY_THRESHOLD: | elif humidity_value > HUMIDITY_THRESHOLD: | ||
- | await show_message("Too hot in here!", | + | await message_queue.put(("Too hot in here!", |
+ | print(" | ||
except Exception as e: | except Exception as e: | ||
print(" | print(" | ||
- | await asyncio.sleep(4) | + | await asyncio.sleep(2) |
async def monitor_compartments(): | async def monitor_compartments(): | ||
Line 388: | Line 438: | ||
if(btnVal1 == 0): | if(btnVal1 == 0): | ||
+ | await message_queue.put((" | ||
- | print(" | + | print(" |
btnVal2 = button2.value() | btnVal2 = button2.value() | ||
if(btnVal2 == 0): | if(btnVal2 == 0): | ||
+ | await message_queue.put((" | ||
- | print(" | + | print(" |
except Exception as e: | except Exception as e: | ||
print(" | print(" | ||
- | await asyncio.sleep(0.1) | + | await asyncio.sleep(0.5) |
async def monitor_gas(): | async def monitor_gas(): | ||
Line 406: | Line 458: | ||
print(" | print(" | ||
if not gas_level: | if not gas_level: | ||
- | await show_message("You really like cultivating diseases, huh?", "Did your fruit die?") | + | await message_queue.put(("You really like cultivating diseases, huh?", "Did your fruit die?")) |
+ | print(" | ||
except Exception as e: | except Exception as e: | ||
print(" | print(" | ||
- | await asyncio.sleep(5) | + | await asyncio.sleep(3) |
# --- MAIN --- | # --- MAIN --- | ||
Line 418: | Line 471: | ||
monitor_compartments(), | monitor_compartments(), | ||
monitor_steam_sensor(), | monitor_steam_sensor(), | ||
- | monitor_gas() | + | monitor_gas(), |
+ | message_handler() | ||
) | ) | ||