Okulda oynadığınız Gece Gündüz oyununu elektronik ortamda oynamaya ne dersiniz? Gece-gündüz oyunu, öğretmenimiz gece dediğinde başımızı masaya koyduğumuz, öğretmenimiz gündüz dediğinde başımızı kaldırdığımız bir oyundur. Bu oyun dikkatinizi ve refleksinizi kullanacağınız bir oyun olacak. Bu projemizde 0,96” 128×64 piksel I2C OLED ekran kullanacağız. OLED ekranlar yapay ışık kaynağı olarak kullanılabildiği için ekrandaki karakterleri lensler ve aynalar kullanarak büyütebilir ve istediğiniz düzleme yansıtabilirsiniz. OLED ekranlar kullanılarak yol ve trafik bilgilerini akıllı gözlüklere ve otomobil camlarına yansıtabilen sistemler yapılabilmektedir.
Işık sensörleri, fotodiyot olarak da adlandırılan, bulundukları ortamın ışık seviyelerini ölçebilen sensörlerdir. Işığa maruz kalan sensörün elektriksel iletkenliği değişir. Işık miktarını etkileyen elektronik sistemleri kodlayıp geliştirerek ışık sensörünü kontrol edebiliriz.
Ayrıntılar ve Algoritma
Öncelikle oyuncudan tuşuna basmasını isteyeceğiz. düğme Oyunu başlatmak için. Daha sonra şunları yapacağız: OLED ekran görüntülemek GECE Ve GÜN rastgele için 2 saniye her biri. GECE kelimesi görüntüleniyorsa, oyuncu LDR sensör; ve DAY kelimesi görüntülenirse onu ortaya çıkarın. Oyuncunun harekete geçmek için 2 saniyesi vardır. Oyuncunun her doğru yanıtı 10 puan kazanacaktır. Yanlış cevap verilmesi durumunda oyun sona erecek ve ekrandan farklı bir ses duyulacaktır. zil. Skor OLED ekranında görüntülenecektir. Oyuncunun toplam 10 doğru yanıt vermesi ve 100 puan alması halinde OLED ekranda “Tebrikler” ibaresi görüntülenecek ve zil sesi farklı tonlarda notalar çalacaktır.
Bileşenler
1X PicoBrick
Bağlantı şeması
Picobricks modüllerini kablolama olmadan kodlayabilir ve çalıştırabilirsiniz. Modülleri panodan ayırarak kullanacaksanız modül bağlantılarını grove kablolarla yapmalısınız.
PicoBricks'in MicroBlock Kodları
Mikrobloklar Çalıştır sekmesine görseli sürükleyerek veya butonuna tıklayarak projenin Mikroblok kodlarına ulaşabilirsiniz.
PicoBricks'in MicroPython Kodları
makineden içe aktarma Pin, I2C, Zamanlayıcı, ADC, PWM
picobricks'ten SSD1306_I2C'yi içe aktar
kullanım süresini içe aktar
urandom'u içe aktar
# Kütüphaneleri tanımlayın
GENİŞLİK = 128
YÜKSEKLİK = 64
# OLED Ekran Ayarları
sda = makine.Pin(4)
scl = makine.Pin(5)
# OLED İletişimi için dijital pin 4 ve 5'i ÇIKIŞ olarak başlatın
i2c = makine.I2C(0, sda=sda, scl=scl, frek=1000000)
oled = SSD1306_I2C(GENİŞLİK, YÜKSEKLİK, i2c)
sesli uyarı = PWM(Pin(20))
buzzer.freq(440)
ldr = ADC(Pin(27))
düğmesi = Pin(10, Pin.IN, Pin.PULL_DOWN)
# Giriş ve çıkış pinlerini tanımlayın
oled.text("GECE ve GÜNDÜZ", 10, 0)
oled.text("", 40, 20)
oled.text("Düğmeye Basın", 0, 40)
oled.text("BAŞLAMAK İÇİN!", 40, 55)
oled.show()
# OLED Ekran Metinleri Ayarları
def changeWord():
küresel gece ya da gündüz
oled.fill(0)
oled.show()
geceorday = yuvarlak(urandom.uniform(0, 1))
# Veri '0' olduğunda OLED NIGHT mesajı gönderir
eğer geceveyagün == 0 ise:
oled.text("---GECE---", 20, 30)
oled.show()
başka:
oled.text("---GÜN---", 20, 30)
oled.show()
# Etkinleştirmek için düğmeye basılmasını bekler
while butonu.değer() == 0:
print("Düğmeye basın")
utime.sleep(0,01)
oled.fill(0)
oled.show()
başlangıç = 1
küresel puan
puan = 0
başlarken == 1:
küresel oyuncunun tepkisi
küresel puan
Kelimeyi değiştir()
startTime = utime.ticks_ms()
# LDR'nin verileri 2000'den büyük olduğunda oyuncunun tepkisi '0'
while utime.ticks_diff(utime.ticks_ms(), startTime) < 2000:
ldr.read_u16() > 20000 ise:
Oyuncu Tepkisi = 0
# LDR'nin verileri 2000'in altına düştüğünde oyuncunun tepkisi '1'
başka:
Oyuncu Tepkisi = 1
utime.sleep(0,01)
#Zil çalışıyor
buzzer.duty_u16(2000)
utime.sleep(0,05)
buzzer.duty_u16(0)
eğer oyuncunun tepkisi == geceorday:
puan += 10
# Skor 10 olduğunda OLED 'Oyun Bitti' diyor
başka:
oled.fill(0)
oled.show()
oled.text("Oyun Bitti", 0, 18, 1)
oled.text("Puanınız " + str(puan), 0, 35)
oled.text("RESET'e basın", 0, 45)
oled.text("TEKRARLANACAK", 0, 55)
oled.show()
buzzer.duty_u16(2000)
utime.sleep(0,05)
buzzer.duty_u16(0)
kırmak
puan == 100 ise:
# Puan 100 olduğunda OLED 'Kazandın' diyor
oled.fill(0)
oled.show()
oled.text("Tebrikler", 10, 10)
oled.text("En Yüksek Puan: 100", 5, 35)
oled.text("Sıfırla'ya basın", 20, 45)
oled.text("TEKRARLANACAK", 25, 55)
oled.show()
buzzer.duty_u16(2000)
utime.sleep(0.1)
buzzer.duty_u16(0)
utime.sleep(0.1)
buzzer.duty_u16(2000)
utime.sleep(0.1)
buzzer.duty_u16(0)
kırmak
Bağlantı şeması
Picobricks modüllerini kablolama olmadan kodlayabilir ve çalıştırabilirsiniz. Modülleri panodan ayırarak kullanacaksanız modül bağlantılarını grove kablolarla yapmalısınız.
PicoBricks'in MicroBlock Kodları
Mikrobloklar Çalıştır sekmesine görseli sürükleyerek veya butonuna tıklayarak projenin Mikroblok kodlarına ulaşabilirsiniz.
PicoBricks'in MicroPython Kodları
itibaren makine içe aktarmak Toplu iğne,2C, Zamanlayıcı,ADC,PWMitibaren Pikotuğlalar içe aktarmakSSD1306_I2Ciçe aktarmak çalışma zamanı
içe aktarmak rastgelelik
#kütüphaneleri tanımla
GENİŞLİK=128YÜKSEKLİK=64
#SEN Ekran Ayarları
sda=makine.Toplu iğne(4)
scl=makine.Toplu iğne(5)
#dijital pini başlat 4 Ve 5gibi BİR ÇIKTIiçinSEN İletişim
i2c=makine.2C(0,sda=sda, scl=scl, frekans=1000000)
sen =SSD1306_I2C(GENİŞLİK,YÜKSEKLİK, 2c)
zil =PWM(Toplu iğne(20))
zil.frekans(440)
ldr=ADC(Toplu iğne(27))
düğme=Toplu iğne(10,Toplu iğne.İÇİNDE,Toplu iğne.AŞAĞI ÇEK)
#giriş ve çıkış pinlerini tanımlayın
oled.metin("GECE ve GÜNDÜZ",10,0)
sen.metin("",40,20)
sen.metin("Düğmesine basın",0,40)
sen.metin("başlamak!",40,55)
sen.göstermek()
#SEN Ekran Metinleri Ayarları
kesinlikle Kelimeyi değiştir():
küresel gece ya da gündüz
oled.doldurmak(0)
sen.göstermek()
gece veya gündüz=yuvarlak(rastgelelik.üniforma(0,1))
#veri ne zaman '0',SEN metinler GECEeğer gece veya gündüz==0:
sen.metin("---GECE---",20,30)
sen.göstermek()başka:
sen.metin("---GÜN---",20,30)
sen.göstermek()
#bekler için etkinleştirmek için basılması gereken düğme
sırasında düğme.değer()==0:Yazdır("Düğmesine basın")uyumak(0.01)
sen.doldurmak(0)
sen.göstermek()
başlangıç=1
küresel puan
Gol=0sırasında başlangıç==1:
küresel oyuncunun tepkisi
küresel puan
Kelimeyi değiştir()
Başlangıç saati=çalışma zamanı.tikler_ms()
#Ne zaman LDR' verileri 2000'den büyük, oyuncuların tepkisi '0'
sırasında çalışma zamanı.Ticks_diff(çalışma zamanı.tikler_ms(), Başlangıç saati)20000:
Oyuncu Tepkisi=0
#Ne zaman LDR'Verileri 2000'den düşük, oyuncuların tepkisi'1'
başka:
Oyuncu Tepkisi=1uyumak(0.01)
#zil sesi çalışıyor
zil.görev_u16(2000)uyumak(0.05)
zil.görev_u16(0)eğer Oyuncu Tepkisi==gece veya gündüz:
Gol +=10
#puan ne zaman 10,SEN diyor 'Oyun bitti'başka:
sen.doldurmak(0)
sen.göstermek()
sen.metin("Oyun bitti",0,18,1)
sen.metin("Puanın "+cadde(Gol),0,35)
sen.metin("RESET'e basın",0,45)
sen.metin("Tekrarlamak için",0,55)
sen.göstermek()
zil.görev_u16(2000)uyumak(0.05)
zil.görev_u16(0)kırmak;eğer Gol==100:
#puan ne zaman 10,SEN diyor 'Kazandın'
sen.doldurmak(0)
sen.göstermek()
sen.metin("Tebrikler",10,10)
sen.metin("En Yüksek Puan: 100",5,35)
sen.metin("Sıfırla'ya basın",20,45)
sen.metin("Tekrarlamak için",25,55)
sen.göstermek()
zil.görev_u16(2000)uyumak(0.1)
zil.görev_u16(0)uyumak(0.1)
zil.görev_u16(2000)uyumak(0.1)
zil.görev_u16(0)kırmak;
PicoBricks'in Arduino C Kodları
#katmak
#include "ACROBOTIC_SSD1306.h"//kitaplığı tanımla
#define RANDOM_SEED_PIN28
int Oyuncu_Reaksiyonu=0;
int Gece_veya_Day=0;
int Puan=0;
int sayaç=0;
çift akımZaman=0;
double lastTime=0;
double getLastTime(){return currentTime=millis()/1000.0-lastTime;}void_delay(float saniye){
long endTime=millis()+seconds*1000;while(millis()2)){
Serial.println(analogRead(27));if(analogRead(27)>200){
Gamer_Reaction=0;}başka{
Gamer_Reaction=1;}}//LDR sensörünün değerine göre oyuncunun tepkisini belirleyindigitalWrite(20,HIGH);//buzzerdelay'i açın(250);//waitdigitalWrite(20,LOW);//kapat buzzerif(Night_or_Day==Gamer_Reaction){//kullanıcının tepkisi ve Night_or_Day değişkeni aynıysaCorrect();}else{Wrong();__loop();if(Score==100){
oled.clearDisplay();
oled.setTextXY(1,1);
oled.putString("Tebrikler");
oled.setTextXY(3,1);
oled.putString("Puanınız");
oled.setTextXY(3,13);
String String_Score=Dize(Puan);
oled.putString(String_Score);
oled.setTextXY(5,3);
oled.putString("Sıfırla'ya basın");
oled.setTextXY(6,3);
oled.putString("Tekrarlamak İçin!");//"Tebrikler, Puanınız, Sıfırla'ya Basın, Tekrarlamak İçin!" yazın ve OLED ekranında belirlenen x ve y koordinatlarındaki puan değişkenifor(int i=0;i<3;i++){digitalWrite(20,HIGH);delay(500);digitalWrite(20,LOW);delay(500) ;}//sesli uyarıyı üç kez açıp kapat
counter=1;}}}voidCorrect(){
Puan+=10;
oled.clearDisplay();
oled.setTextXY(3,4);
oled.putString("10 Puan");//oyuncu doğru cevap verdiğinde puanı 10 artır}voidChange_Word(){
oled.clearDisplay();
Gece_veya_Gün=random(0,2);if(Gece_veya_Gün==0){
oled.setTextXY(3,6);
oled.putString("GECE");}else{
oled.setTextXY(3,7);
oled.putString("DAY");}}//rastgele OLED ekranına "GECE" veya "GÜNDÜZ" yazınvoidWrong(){
oled.clearDisplay();
oled.setTextXY(1,3);
oled.putString("Oyun Bitti");
oled.setTextXY(3,1);
oled.putString("Puanınız");
oled.setTextXY(1,13);
String String_Score=Dize(Puan);
oled.putString(String_Score);
oled.setTextXY(5,3);
oled.putString("Sıfırlamaya Basın");
oled.setTextXY(6,3);
oled.putString("To Repeat");// OLED ekranında belirlenen koordinatlara puan değişkenini ve ifadeleri tırnak işareti olarak yazın.digitalWrite(20,HIGH);//buzzerdelay(1000);// waitdigitalWrite(20,LOW);//zil sesini kapat
sayaç=1;}