SH45&46 - T2 La Casta Tower, Khu đô thị Văn Phú, phường Phú La, quận Hà Đông, TP Hà Nội

logo
Mô hình cảnh báo ngập lụt trong thành phố

SÁNG TẠO STEM VỚI

MÔ HÌNH CẢNH BÁO NGẬP LỤT TRONG THÀNH PHỐ

Giới thiệu

  “Cảnh báo ngập lụt trong thành phố” đây là một đề tài hay về vấn đề môi trường, các em học sinh đã được học lập trình Micro:bit và Raspberry Pi hoàn toàn có thể làm được. Đây là nội dung của đề tài này, các em học sinh nghiên cứu để tự làm theo và mở rộng sáng tạo cho đề tài hay hơn nữa và có thể đưa ra ứng dụng trong thực tế.

Thực trạng và giải pháp

  Ngập lụt là một trong những vấn đề nghiêm trọng và thường xuyên xảy ra trong các đô thị. Việc ngập lụt trong thành phố gây nên những bất tiện cho người dân trong việc đi lại, làm việc, gây thiệt hại về kinh tế,… Việc xây dựng hệ thống cảnh báo ngập lụt là cần thiết để giảm thiểu thiệt hại cho người dân và các cơ sở hạ tầng.

  Fasfartech Stem Robotics đưa ra mô hình giải pháp để cảnh báo ngập lụt trong thành phố, Fasfartech sẽ hướng dẫn các em nhỏ, các bạn học sinh và cả những người yêu thích khám phá công nghệ tạo ra được hệ thống cảnh báo ngập lụt cho mình. Hệ thống của chúng ta bao gồm các thiết bị đo mực nước (ở đây chúng ta sử dụng modul Micro:bit và cột mực nước gắn đầu dây tín hiệu), thiết bị lưu trữ, phân tích dữ liệu của các bộ đo (là máy tính nhúng Raspberry Pi có kết nối với loa phát âm thanh) và hệ thống phát cảnh báo như máy tính, điện thoại. Khi mưa lớn, nước ngập qua mức an toàn, Micro:bit sẽ gửi tín hiệu về cho máy tính nhúng Raspberry Pi. Raspberry Pi tổng hợp dữ liệu, tính toán và gửi tín hiệu cảnh báo đến các điện thoại, máy tính, phát ra loa cảnh báo.

  Hệ thống của chúng ta cũng có thể được sử dụng để làm mô hình cảnh báo trong thực tế, khi đó máy tính nhúng Raspberry Pi tính toán ngày giờ, mức độ của lũ lên và thông tin khác để tìm ra các khu vực có nguy cơ ngập lụt.

  Thông tin này sau đó được truyền đến các cơ quan chức năng để có những xử lý kịp thời. Các hệ thống cảnh báo ngập lụt còn có thể được trang bị cho các công trình như đập, hầm chui, chốt kiểm soát nước, trạm bơm nước, hầm chui, các cầu, đường bộ.

  Ngoài ra, hệ thống cảnh báo ngập lụt cũng có thể được sử dụng vào mục đích thông báo cho người dân biết trước những khu vực có nguy cơ ngập lụt và những cách ứng phó khi mưa lớn xảy ra. Các thông tin này được đưa ra công khai, qua các kênh truyền thông như trang web, ứng dụng di động, âm thanh cảnh báo trên đường phố.

Sơ đồ mô hình STEM


Xây dựng cho hệ thống

 Với yêu cầu của mô hình, chúng ta sẽ lập trình chương trình cho các mạch Micro:bit và Raspberry Pi. Các mạch Micro:bit sẽ có nhiệm vụ đo mực nước và truyền dữ liệu qua Bluetooth về cho Raspberry Pi, bộ Raspberry Pi sẽ có chức năng tổng hợp, phân tích dữ liệu và phát tin cảnh báo ra loa, nhắn tin tới điện thoại di động.

Phần cứng bao gồm các thiết bị

Máy tính nhúng Raspberry Pi được lắp ghép với loa và các bộ phận khác để tạo thành bộ xử lý trung tâm, ở đây chúng ta sử dụng Robot PIDEEP trợ lý ảo thông minh, nó kết nối được rất nhiều Micro bit khác nhau qua Bluetooth.

       

Bo mạch vi điều khiển Micro:bit: có kết nối Bluetooth, có 3 chân tín hiệu P0, P1, P2 để đo mức nước.

Cách tạo ra thang đo mực nước:

  Chúng ta dùng kẹp cá sấu và 1 thanh nhựa để tạo thành 1 thang đo mực nước kết nối vào Micro:bit. Trên bộ này cần 1 hộp pin để cung cấp nguồn điện cho Micro:bit hoạt động. Dây đỏ kẹp vào 3V, dây xanh kẹp vào P0 mức 10cm, dây vàng kẹp vào P1 mức 30cm, dây trắng kẹp vào P2 mức 50cm.


Kết nối mô hình

  Chúng ta thử nghiệm với chai nhựa và cho thang đo mức nước vào chai để đổ nước vào như hình dưới đây:

 

Lập trình cho Micro:bit

 Để lập trình cho Microbit chúng ta vào trang: https://makecode.microbit.org/#editor

Cài đặt chức năng Bluetooth như hình dưới đây:

Trước tiên cần lập trình để Micro:bit kết nối với Raspberry Pi qua chương trình dưới đây:

  • Khi khởi động (on start) thì Micro bit sẽ thiết lập các chức năng kết nối Bluetooth, sau đó sẽ hiển thị hình trái tim.
  • Khi kết nối Bluetooth thành công (on Bluetooth connected) thì sẽ hiện ra dấu tích.
  • Khi kết nối Bluetooth không thành công (on Bluetooth disconnected) thì sẽ hiện ra dấu X.
  • Lập trình xong chúng ta Download vào bo Micro bit là xong, sau khi Download thành công thì hình trái tim trên bo Micro bit sẽ hiện ra.

Lập trình cho Raspberry Pi

  Bo máy tính Raspberry Pi4 có kết nối Bluetooth và cần phải cái thư viện này để kết nối được với Micro bit.

sudo pip3 install bluezero

Sau đó quét địa chỉ của Micro bit như sau:

Bluetoothctl

scan on

 Chương trình của Raspberry Pi như sau, máy tính nhúng Raspberry Pi sẽ có nhiệm vụ điều khiển, nhận tín hiệu từ các bộ Micro:bit:

from bluezero import microbit

import time, math

from time import sleep

import telechat

telechat.start()

from gtts import gTTS

from robot_hat import Music

music = Music()

import subprocess

# Chương trình chuyển đổi dạng text thành âm thanh phát ra loa

def speakvn(text):

    try:

        tts=gTTS(text=text,lang='vi',tld='com.vn', slow=True)

        tts.save('sound.mp3')

        music.sound_play('sound.mp3')

    except Exception as e:

        print('Error TTS:',str(e))

        pass

# adapter_addr địa chỉ bluetooth của PI

# device_addr địa chỉ bluetooth của Microbit

ubit1 = microbit.Microbit(adapter_addr='E4:5F:01:9E:7D:B2',

                         device_addr='E2:D1:CA:B8:FC:69')

ubit2 = microbit.Microbit(adapter_addr='E4:5F:01:9E:7D:B2',

                          device_addr='FE:E1:12:75:22:FA')

try:

    ubit1.connect() # Kết nối với Microbit 1

    ubit1_connect=True

except:

    ubit1_connect=False

try:

    ubit2.connect() # Kết nối với Microbit 2

    ubit2_connect=True

except:

    ubit2_connect=False

if(ubit1_connect):

    ubit1.text = '1' #Khi kết nối thành công sẽ gửi số 1 tương ứng

if(ubit2_connect):

    ubit2.text = '2' #Khi kết nối thành công sẽ gửi số 2 tương ứng

print('Connected microbit1: {} microbit2: {}'.format(ubit1_connect,ubit2_connect))

mode = 0

# cấu hình 3 chân P0,P1,P2 của Micro bit là chân Analog

if ubit1_connect:

    ubit1.set_pin(2, True, True)

    ubit1.set_pin(1, True, True)

    ubit1.set_pin(0, True, True)

if ubit2_connect:

    ubit2.set_pin(2, True, True)

    ubit2.set_pin(1, True, True)

    ubit2.set_pin(0, True, True)       

timeout=time.time()

alarm_mes1="Đây là hệ thống cảnh báo ngập lụt trong đô thị."

alarm_mes2=""

timeoutset1=5

timeoutset2=5

# Phát âm thanh ra loa

speakvn(alarm_mes1)

# Gửi tin nhắn tới người quản lý

telechat.message(alarm_mes1)

if __name__ == '__main__':

    while True:

        #Tram so 1

        if(ubit1_connect):

            if(time.time()-timeout>timeoutset1):

                # Đọc mức nước từ các cân P0,1,2

                level=ubit1.pin_values

                level1=50 if level['0']>20 and level['1']>20 and level['2']>20 else \

                     30 if level['0']>20 and level['1']>20 else \

                     10 if level['0']>20 else 0

                # Hiển thị mức nước trên ma trận led của Microbit

                ubit1.pixels = [0b00100, 0b00100, 0b00100, 0b00100, 0b00100] if level1==50 else\

                               [0b00000, 0b00000, 0b00100, 0b00100, 0b00100] if level1==30 else\

                               [0b00000, 0b00000, 0b00000, 0b00000, 0b00100] if level1==10 else\

                               [0b00000, 0b00000, 0b00000, 0b00000, 0b00000]

                temp1=ubit1.temperature

                print(level,level1,temp1)

                timeout=time.time()

                # Đưa ra cảnh báo, phát âm thanh và nhắn tin về người quản lý

                if(level1==50):

                    alarm_mes1='Cảnh báo Trạm số 1 nhập lụt mức cao nhất: '+str(level1) + ' cm'

                    speakvn(alarm_mes1)

                    telechat.message(alarm_mes1)

                    print(alarm_mes1)

                    timeoutset1+=2

                elif(level1==30):

                    alarm_mes1='Cảnh báo Trạm số 1 ngập lụt mức cao vừa: '+str(level1) + ' cm'

                    speakvn(alarm_mes1)

                    telechat.message(alarm_mes1)

                    print(alarm_mes1)

                    timeoutset1+=5

                elif(level1==10):

                    alarm_mes1='Cảnh báo Trạm số 1 ngập lụt mức trung bình: '+str(level1) + ' cm'

                    speakvn(alarm_mes1)

                    telechat.message(alarm_mes1)

                    print(alarm_mes1)

                    timeoutset1+=10

                elif(alarm_mes1.find('Cảnh báo')!=-1):

                    alarm_mes1='Trạm số 1 hết ngập lụt'

                    speakvn(alarm_mes1)

                    telechat.message(alarm_mes1)

                    print(alarm_mes1)

                    timeoutset1=10

        # Tram so 2           

        if(ubit2_connect):

            if(time.time()-timeout>timeoutset2):

                level=ubit2.pin_values

                level2=50 if level['0']>20 and level['1']>20 and level['2']>20 else \

                     30 if level['0']>20 and level['1']>20 else \

                     10 if level['0']>20 else 0

                ubit2.pixels = [0b00100, 0b00100, 0b00100, 0b00100, 0b00100] if level2==50 else\

                               [0b00000, 0b00000, 0b00100, 0b00100, 0b00100] if level2==30 else\

                               [0b00000, 0b00000, 0b00000, 0b00000, 0b00100] if level2==10 else\

                               [0b00000, 0b00000, 0b00000, 0b00000, 0b00000]

                temp2=ubit2.temperature

                print(level,level2,temp2)

                timeout=time.time()

                if(level2==50):

                    alarm_mes2='Cảnh báo Trạm số 2 nhập lụt mức cao nhất: '+str(level2) + ' cm'

                    speakvn(alarm_mes2)

                    telechat.message(alarm_mes2)

                    print(alarm_mes2)

                    timeoutset2+=2

                elif(level2==30):

                    alarm_mes2='Cảnh báo Trạm số 2 ngập lụt mức cao vừa: '+str(level2) + ' cm'

                    speakvn(alarm_mes2)

                    telechat.message(alarm_mes2)

                    print(alarm_mes2)

                    timeoutset2+=5

                elif(level2==10):

                    alarm_mes2='Cảnh báo Trạm số 2 ngập lụt mức trung bình: '+str(level2) + ' cm'

                    speakvn(alarm_mes2)

                    telechat.message(alarm_mes2)

                    print(alarm_mes2)

                    timeoutset2+=10

                elif(alarm_mes2.find('Cảnh báo')!=-1):

                    alarm_mes2='Trạm số 2 hết ngập lụt'

                    speakvn(alarm_mes2)

                    telechat.message(alarm_mes2)

                    print(alarm_mes2)

                    timeoutset2=10

    ubit1.disconnect()

    ubit2.disconnect()

Kết quả thu được

  Từ mô hình đơn giản này, Fasfartech Stem Robotics muốn truyền tải tình yêu khoa học công nghệ đến các bạn trẻ, cũng qua đó để các em có thể sáng tạo những thiết bị giúp ích cho vấn đề môi trường.