İşte bir özeti STEM Kış Etkinliği: Sıcaklık ve nem sensörlerine sahip bir Picobricks Anakartı sizin için ortam sıcaklığını ölçer ancak bunu oyunculardan gizli tutar. Daha sonra oyuncular sırayla sıcaklık tahminlerini girerler. En yakın tahmin oyunu kazanır.
Merhaba geleceğin meteorologları! Sizi sadece eğlenceli değil aynı zamanda eğitici olan harika (kelimenin tam anlamıyla!) bir projeyle tanıştırayım: PicoBricks tarafından desteklenen Termometre Oyunu. Bu oyun teknolojinin, öğrenmenin ve tabii ki dostça rekabetin mükemmel bir karışımıdır. Soğuk kış günleri için mükemmel olan bu oyun, STEM Kış etkinliği bu gerçekten beyin hücrelerini ısıtıyor!
Neden Bu Oyun?
- eğitici: Sensörler ve bunların çevreyle nasıl etkileşime girdiği hakkında bilgi edinmenin uygulamalı bir yoludur.
- Sezonluk Eğlence: Özellikle kış ayları için harika olan bu oyun, o uzun, soğuk günlere STEM havası katıyor.
- Birim Dönüştürme Kolaylaştı: Oyuncular Celsius ve Fahrenheit arasındaki farkı pratik ve ilgi çekici bir şekilde anlayacaklar.
Bağlantı şeması
Nasıl yapılır? Adım adım rehber
Aşama 1
İlk göreviniz mi? Gerekli kodu PicoBricks'inize yükleyin. Bu bittiğinde eğlence başlıyor.
Nasıl yapılacağını bilmiyorsanız endişelenmeyin. Picobricks'in BricksIDE, ThonnyPhyton ve Arduino C ile nasıl kullanılacağını öğrenmek için: Picobrick Nasıl Kullanılır?
TuğlalarIDE
İşte Tuğlalar GİTMEK code.PicoBricks'inize indirin ve yükleyin.
BricksIDE Kodunu İndirinMikroBlok Kodu
ThonyPhyton Kodu
zamandan içe uyku
makine içe aktarma Pininden, PWM, I2C
picobricks'ten WS2812, DHT11,SSD1306_I2C'yi içe aktarın
ithalat makinesi
ithalat zamanı
matematik ithalatı
ws2812 = WS2812(6, parlaklık = 1)
pin_button = makine.Pin(10, makine.Pin.IN)
dht_sensor = DHT11(Pin(11))
dht_read_time = zaman.zaman()
sıcaklık = 0
def getTemp():
küresel dht_read_time
küresel sıcaklık
if time.time() - dht_read_time >= 3:
dht_read_time = zaman.zaman()
denemek:
dht_sensor.measure()
sıcaklık = dht_sensor.temperature
e olarak İstisna hariç:
geçmek
dönüş sıcaklığı
matematik ithalatı
kap = makine.ADC(26)
i2c = I2C(0, scl=Pin(5), sda=Pin(4), frek=200000)
oled = SSD1306_I2C(128, 64, i2c, addr=0x3c)
def SetTempF():
küresel tempUnite, sıcaklıkValue, player1guess, player2guess, player1result, counter, player2result
tempUnite = round(round( pot.read_u16() - 0 ) * ( 2 - 1 ) / ( 65535 - 0 ) + 1)
eğer tempUnite == (1):
oled.text("{}".format("santigrat"), 20, 25)
elif tempUnite == (2):
oled.text("{}".format("Fahrenheit"), 20, 25)
oled.show()
oled.fill(0)
def başlangıç():
küresel tempUnite, sıcaklıkValue, player1guess, player2guess, player1result, counter, player2result
oled.text("{}".format("Ayarla "), 20, 10)
oled.text("{}".format("sıcaklık "), 20, 20)
oled.text("{}".format("POT'a göre birim"), 20, 30)
oled.show()
def geri sayım():
küresel tempUnite, sıcaklıkValue, player1guess, player2guess, player1result, counter, player2result
aralıktaki sayım için((4)):
oled.fill(0)
oled.text("{}".format(counter), 55, 32)
oled.show()
sayaç -= 1
zaman.uyku((1))
oled.fill(0)
oled.show()
sayaç = 0
pin_led = makine.Pin(7, makine.Pin.OUT)
sesli uyarı = PWM(Pin(20))
def butonuFunc():
küresel tempUnite, sıcaklıkValue, player1guess, player2guess, player1result, counter, player2result
pin_led.on()
buzzer.freq(300)
buzzer.duty_u16(100)
uyku(0,25)
buzzer.duty_u16(0)
pin_led.off()
def oyuncu1():
küresel tempUnite, sıcaklıkValue, player1guess, player2guess, player1result, counter, player2result
while (pin_button.value()) == (0) ve counter == (0):
oyuncu1tahmin = round(round( pot.read_u16() - 0 ) * ( 212 - -20 ) / ( 65535 - 0 ) + -20)
oled.text("{}".format("Oyuncu 1: "), 5, 25)
oled.text("{}".format(player1guess), 85, 25)
oled.show()
oled.fill(0)
yazdır(sıcaklıkDeğeri)
düğmeFunc()
sayaç += 1
if (sıcaklıkDeğeri > 0) ve (oyuncu1tahmin > 0):
player1result = sıcaklıkDeğeri - player1guess
elif (sıcaklıkDeğeri > 0) ve (oyuncu1tahmin < 0):
oyuncu1sonuç = sıcaklıkDeğeri + (-1) * oyuncu1tahmin
elif (sıcaklıkDeğeri < 0) ve (oyuncu1tahmin > 0):
oyuncu1sonuç = (-1) * sıcaklıkDeğeri + oyuncu1tahmin
elif (sıcaklıkDeğeri < 0) ve (oyuncu1tahmin < 0):
oyuncu1sonuç = (-1) * sıcaklıkDeğeri - (-1) * oyuncu1tahmin
eğer oyuncu1sonucu < 0 ise:
oyuncu1sonuç = oyuncu1sonuç * (-1)
yazdır(sıcaklıkDeğeri)
yazdır(oyuncu1sonucu)
def oyuncu2():
küresel tempUnite, sıcaklıkValue, player1guess, player2guess, player1result, counter, player2result
while (pin_button.value()) == (0) ve counter == (1):
player2guess = round(round( pot.read_u16() - 0 ) * ( 212 - -20 ) / ( 65535 - 0 ) + -20)
oled.text("{}".format("Oyuncu 2: "), 5, 25)
oled.text("{}".format(player2guess), 85, 25)
oled.show()
oled.fill(0)
yazdır(sıcaklıkDeğeri)
düğmeFunc()
sayaç += 1
if (sıcaklık Değeri > 0) ve (oyuncu2tahmini > 0):
player2result = sıcaklıkDeğeri - player2guess
elif (sıcaklıkDeğeri > 0) ve (oyuncu2tahmin < 0):
oyuncu2sonucu = sıcaklıkDeğeri + (-1) * oyuncu2tahmin
elif (temperatureValue < 0) ve (player2guess > 0):
oyuncu2sonuç = (-1) * sıcaklıkDeğeri + oyuncu2tahmin
elif (sıcaklıkDeğeri < 0) ve (oyuncu2tahmin < 0):
oyuncu2sonucu = (-1) * sıcaklıkDeğeri - (-1) * oyuncu2tahmin
eğer oyuncu2sonucu < 0 ise:
oyuncu2sonucu = oyuncu2sonucu * (-1)
def kontrolü():
küresel tempUnite, sıcaklıkValue, player1guess, player2guess, player1result, counter, player2result
oled.fill(0)
oled.text("{}".format("KAZANAN"), 40, 0)
eğer oyuncu1sonuç >= oyuncu2sonuç:
oled.text("{}".format("Oyuncu 2"), 40, 20)
ws2812.pixels_fill((51, 204, 0))
ws2812.pixels_show()
elif oyuncu1sonuç <= oyuncu2sonuç:
oled.text("{}".format("Oyuncu1"), 40, 20)
ws2812.pixels_fill((51, 204, 0))
ws2812.pixels_show()
başka:
oled.fill(0)
oled.text("{}".format("puansız "), 40, 20)
oled.text("{}".format("Sıcaklık:"), 10, 40)
oled.text("{}".format(temperatureValue), 60, 40)
eğer tempUnite == (1):
oled.text("{}".format("Santigrat"), 20, 50)
elif tempUnite == (2):
oled.text("{}".format("Fahrenheit"), 20, 50)
oled.show()
sayaç += 1
ws2812.pixels_fill((0 ,0 ,0 ))
ws2812.pixels_show()
sıcaklıkDeğeri = 0
oyuncu1sonucu = 0
oyuncu2sonucu = 0
sıcaklıkBirlik = 0
sayaç = 3
oyuncu2tahmin = 0
oyuncu1tahmin = 0
while (pin_button.value()) == (0):
başlangıç()
yazdır(getTemp())
zaman.uyku((0.3))
düğmeFunc()
while (pin_button.value()) == (0):
oled.fill(0)
SetTempF()
yazdır(getTemp())
düğmeFunc()
eğer tempUnite == (1):
sıcaklıkDeğeri = getTemp()
elif tempUnite == (2):
sıcaklıkDeğeri = ((9) * (getTemp())) / (5) + (32)
geri sayım()
yazdır(sıcaklıkDeğeri)
oyuncu1()
time.sleep((0.5))
oyuncu2()
kontrol()
Arduino C Kodu
#katmak
#include "ACROBOTIC_SSD1306.h"
#katmak
#katmak
#PIN 6'yı tanımla
#NUMPIXELS 1'i tanımla
#DHTPIN 11'i tanımlayın
#define DHTTYPE DHT11
#define POTANSİYOMETRE 26
#define BUTTON_PIN 10
#define BUZZER 20
#LED 7'yi tanımlayın
DHT dht(DHTPIN, DHTTYPE);
Adafruit_NeoPixel pikselleri(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int sıcaklıkDeğeri = 0;
int oyuncu1sonuç = 0;
int oyuncu2sonuç = 0;
int tempUnite = 0;
int sayaç = 3;
int oyuncu1tahmin = 0;
int oyuncu2guess = 0;
geçersiz kurulum() {
Seri.begin(9600);
Wire.begin();
oled.init();
oled.clearDisplay();
piksel.begin();
piksel.clear();
pinMode(BUTTON_PIN, INPUT);
pinMode(POTANSİYOMETRE, GİRİŞ);
pinMode(BUZZER, OUTPUT);
pinMode(LED, ÇIKIŞ);
}
geçersiz döngü () {
while (digitalRead(BUTTON_PIN) == 0) {
oled.setTextXY(1, 2);
oled.putString("Ayarlayın ");
oled.setTextXY(2, 2);
oled.putString("sıcaklık ");
oled.setTextXY(3, 2);
oled.putString("POT'a göre birim");
getTemp();
}
gecikme(300);
düğmeFunc();
oled.clearDisplay();
SetTempF();
getTemp();
düğmeFunc();
if (tempUnite > 1023/2) {
sıcaklıkDeğeri = getTemp();
}
if (tempUnite <= 2) {
sıcaklıkDeğeri = ((9) * (getTemp())) / (5) + (32);
}
geri sayım();
oyuncu1();
gecikme(500);
oyuncu2();
kontrol();
}
int getTemp() {
sıcaklıkDeğeri = dht.readTemperature();
Serial.println(temperatureValue);
dönüş sıcaklığıDeğer;
}
void butonuFunc() {
for (int i = 0 ; i < 4 ; i++) {
digitalWrite(LED, YÜKSEK);
ton(BUZZER, 500);
gecikme(500);
ton yok(BUZZER);
digitalWrite(LED, DÜŞÜK);
}
}
void SetTempF() {
while (digitalRead(BUTTON_PIN) == 0) {
tempUnite = harita(analogRead(POTANSİYOMETRE), 0, 1023, 0, 1);
if (tempUnite == 0) {
oled.setTextXY(3, 2);
oled.putString("Santigrat");
}
if (tempUnite == 1) {
oled.setTextXY(3, 2);
oled.putString("Fahrenhayt");
}
gecikme(300);
oled.clearDisplay();
}
}
geçersiz geri sayım() {
for (int i = 0 ; i < 4 ; i++) {
oled.clearDisplay();
oled.setTextXY(3, 5);
oled.putString(String(i));
sayaç -= 1;
gecikme(1000);
}
oled.clearDisplay();
sayaç = 0;
}
geçersiz oyuncu1() {
int sıcaklıkValue = getTemp();
while (digitalRead(BUTTON_PIN) == 0 && sayaç == 0) {
oyuncu1tahmin = harita(analogOku(POTANSİYOMETRE), 0, 1023, -20, 212);
oled.setTextXY(2, 0);
oled.putString("Oyuncu 1: ");
oled.setTextXY(2, 8);
oled.putString(String(oyuncu1tahmin));
Serial.println(temperatureValue);
}
düğmeFunc();
sayaç += 1;
if (sıcaklıkDeğeri > 0 && oyuncu1tahmin > 0) {
oyuncu1sonuç = sıcaklıkDeğeri - oyuncu1tahmin;
}
if (sıcaklıkDeğeri > 0 && oyuncu1tahmin < 0) {
oyuncu1sonuç = sıcaklıkDeğeri + (-1) * oyuncu1tahmin;
}
if (sıcaklıkDeğeri < 0 && oyuncu1tahmin > 0) {
oyuncu1sonuç = (-1) * sıcaklıkDeğeri + oyuncu1tahmin;
}
if (temperatureValue < 0 && oyuncu1tahmin < 0) {
oyuncu1sonuç = (-1) * sıcaklıkDeğeri - (-1) * oyuncu1tahmin;
}
if (oyuncu1sonucu < 0) {
oyuncu1sonucu = oyuncu1sonucu * (-1);
}
Serial.println(temperatureValue);
Serial.println(oyuncu1sonucu);
}
geçersiz oyuncu2() {
int sıcaklıkValue = getTemp();
while (digitalRead(BUTTON_PIN) == 0 && sayaç == 0) {
player2guess = harita( analogRead(POTANSİYOMETRE), 0, 1023, -20, 212);
oled.setTextXY(2, 0);
oled.putString("Oyuncu 1: ");
oled.setTextXY(2, 8);
oled.putString(String(player2guess));
Serial.println(temperatureValue);
}
düğmeFunc();
sayaç += 1;
if (sıcaklıkDeğeri > 0 && oyuncu1tahmin > 0) {
oyuncu2sonucu = sıcaklıkDeğeri - oyuncu2tahmin;
}
if (sıcaklıkDeğeri > 0 && oyuncu1tahmin < 0) {
oyuncu2sonucu = sıcaklıkDeğeri + (-1) * oyuncu2tahmin;
}
if (sıcaklıkDeğeri < 0 && oyuncu1tahmin > 0) {
oyuncu2sonuç = (-1) * sıcaklıkDeğeri + oyuncu2tahmin;
}
if (temperatureValue < 0 && oyuncu1tahmin < 0) {
oyuncu2sonuç = (-1) * sıcaklıkDeğeri - (-1) * oyuncu2tahmin;
}
if (oyuncu1sonucu < 0) {
oyuncu2sonucu = oyuncu2sonucu * (-1);
}
Serial.println(temperatureValue);
Serial.println(oyuncu1sonucu);
}
geçersiz kontrol() {
oled.clearDisplay();
oled.setTextXY(0, 4);
oled.putString("KAZANAN");
if (oyuncu1sonuç >= oyuncu2sonuç) {
oled.setTextXY(2, 4);
oled.putString("Oyuncu 2");
piksel.setPixelColor(0, piksel.Color(51, 204, 0));
piksel.show();
}
else if (oyuncu1sonuç <= oyuncu2sonuç) {
oled.setTextXY(2, 4);
oled.putString("Oyuncu1");
piksel.setPixelColor(0, piksel.Color(51, 204, 0));
piksel.show();
}
başka {
oled.clearDisplay();
oled.setTextXY(2, 4);
oled.putString("puansız ");
}
oled.setTextXY(4, 1);
oled.putString("Sıcaklık:");
oled.setTextXY(4, 6);
oled.putString(String(temperatureValue));
if (tempUnite == 0) {
oled.setTextXY(5, 2);
oled.putString("Santigrat");
}
else if (tempUnite == 1) {
oled.setTextXY(5, 2);
oled.putString("Fahrenhayt");
}
sayaç += 1;
}
Adım 2: Celsius veya Fahrenheit'i mi seçiyorsunuz?
PicoBricks'i açın ve şunu göreceksiniz: OLED ekran iki seçenekle yanar: Celsius ve Fahrenheit. Artık bu bölüm interaktif ve eğitici! Hangi sıcaklık birimine daha aşina olduğunuza (veya yalnızca merak ettiğinize) bağlı olarak, potansiyometre iki seçenek arasında geçiş yapmak için. Seçimini yaptın mı? Harika! Sadece vur düğme kilitlemek için.
Adım 3: Tahmin Etme Zamanı!
Şimdi oyunun özüne geçelim. Oyuncu Bir, ortam sıcaklığının ne olduğunu tahmin etme sırası sizde. Potansiyometreyi çevirin ve tahmininizi yaparken OLED ekranını izleyin. Kilitleyin ve Oyuncu İki'ye verin, o da aynı şekilde tahminini yapsın.
Adım 4: Ve Kazanan...
Her iki tahmin de gerçekleştiğinde, gerçek anı gelir. PicoBricks, tahminlerinizi daha önce gizlice ölçtüğü gerçek sıcaklıkla karşılaştırır. En yakın tahmin kazanır ve ekranda kazanan için bir kutlama mesajı görüntülenir!