CategoriesLed Raspberry Pi Pico Uncategorized

#15 Night and Day Project with PicoBricks

night-and-day-header

How about playing the Night and Day game you played at school electronically? The game of night and day is a game in which we put our head on the table  when our teacher says night, and raise our heads when our teacher says day. This game will be a game that you will use your attention and reflex. In this project, we will use a 0.96” 128×64 pixel I2C OLED display. Since OLED screens can be used as an artificial light source, you can enlarge the characters on the screen using lenses and mirrors and reflect them on the desired plane. Systems that can reflect road and traffic information on smart glasses and automobile windows can be made using OLED screens.

Light sensors are sensors that can measure the light levels of the environment they are in, also called photodiodes. The electrical conductivity of the sensor exposed to light changes. We can control the light sensor by coding and developing electronic systems that affect the amount of light.

Details and Algorithm

First we will ask the player to press the button to start the game. Then we will make the OLED screen display NIGHT and DAY randomly for 2 seconds each. If the word NIGHT is displayed, the player should cover the LDR sensor; and if the word DAY is displayed, uncover it. The player has 2 secs to act. Each correct response of the player will earn 10 points. In case of wrong response, the game will be over and a different tone will sound from the buzzer. The score will be displayed on the OLED screen. If the player gives a total of 10 correct responses and gets 100 points, the phrase “Congratulations” will be displayed on the OLED screen and the buzzer will play notes in different tones.

Components

1X PicoBricks

Wiring Diagram

You can code and run Picobricks modules without wiring. If you are going to use the modules by separating them from the board, you should make the module connections with grove cables.

MicroBlocks Codes of the PicoBricks

You can access the Microblocks codes of the project by dragging the image to the Microblocks Run tab or click the button.

MicroPython Codes of the PicoBricks

				
					from machine import Pin, I2C, Timer, ADC, PWM
from picobricks import SSD1306_I2C
import utime
import urandom
#define the libraries
WIDTH = 128
HEIGHT = 64
#OLED Screen Settings
sda=machine.Pin(4)
scl=machine.Pin(5)
#initialize digital pin 4 and 5 as an OUTPUT for OLED Communication
i2c=machine.I2C(0,sda=sda, scl=scl, freq=1000000)
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)
buzzer = PWM(Pin(20))
buzzer.freq(440)
ldr=ADC(Pin(27))
button=Pin(10,Pin.IN,Pin.PULL_DOWN)
#define the input and output pins
oled.text("NIGHT and DAY", 10, 0)
oled.text("<GAME>", 40, 20)
oled.text("Press the Button", 0, 40)
oled.text("to START!", 40, 55)
oled.show()
#OLED Screen Texts Settings
def changeWord():
    global nightorday
    oled.fill(0)
    oled.show()
    nightorday=round(urandom.uniform(0,1))
    #when data is '0', OLED texts NIGHT
    if nightorday==0:
        oled.text("---NIGHT---", 20, 30)
        oled.show()
    else:
        oled.text("---DAY---", 20, 30)
        oled.show()
    #waits for the button to be pressed to activate
        
while button.value()==0:
    print("Press the Button")
    sleep(0.01)
    
oled.fill(0)
oled.show()
start=1
global score
score=0
while start==1:
    global gamerReaction
    global score
    changeWord()
    startTime=utime.ticks_ms()
    #when LDR's data greater than 2000, gamer reaction '0'
    while utime.ticks_diff(utime.ticks_ms(), startTime)<=2000:
        if ldr.read_u16()>20000:
            gamerReaction=0
        #when LDR's data lower than 2000, gamer reaction '1'
        else:
            gamerReaction=1
        sleep(0.01)
    #buzzer working
    buzzer.duty_u16(2000)
    sleep(0.05)
    buzzer.duty_u16(0)
    if gamerReaction==nightorday:
        score += 10
    #when score is 10, OLED says 'Game Over'
    else:
        oled.fill(0)
        oled.show()
        oled.text("Game Over", 0, 18, 1)
        oled.text("Your score " + str(score), 0,35)
        oled.text("Press RESET",0, 45)
        oled.text("To REPEAT",0,55)
        oled.show()
        buzzer.duty_u16(2000)
        sleep(0.05)
        buzzer.duty_u16(0)
        break;
    if score==100:
        #when score is 10, OLED says 'You Won'
        oled.fill(0)
        oled.show()
        oled.text("Congratulation", 10, 10)
        oled.text("Top Score: 100", 5, 35)
        oled.text("Press Reset", 20, 45)
        oled.text("To REPEAT", 25,55)
        oled.show()
        buzzer.duty_u16(2000)
        sleep(0.1)
        buzzer.duty_u16(0)
        sleep(0.1)
        buzzer.duty_u16(2000)
        sleep(0.1)
        buzzer.duty_u16(0)
        break;
				
			

Arduino C Codes of the PicoBricks

				
					#include <Wire.h>
#include "ACROBOTIC_SSD1306.h"
//define the library


#define RANDOM_SEED_PIN     28
int Gamer_Reaction=0;
int Night_or_Day=0;
int Score=0;
int counter=0;

double currentTime=0;
double lastTime=0;
double getLastTime(){
  return currentTime=millis()/1000.0-lastTime;
}

void _delay(float seconds){
  long endTime=millis()+seconds*1000;
  while (millis()<endTime) _loop();
}

void _loop(){
}

void loop(){
  _loop();
}
//define variable

void setup() {
  // put your setup code here, to run once:
  pinMode(10,INPUT);
  pinMode(27, INPUT);
  pinMode(20,OUTPUT);
  randomSeed(RANDOM_SEED_PIN);
  Wire.begin();
  oled.init();
  oled.clearDisplay();
  //define the input and output pins

  oled.clearDisplay();
  oled.setTextXY(1,3);
  oled.putString("NIGHT and DAY");
  oled.setTextXY(2,7);
  oled.putString("GAME");
  oled.setTextXY(5,2);
  oled.putString("Press the BUTTON");
  oled.setTextXY(6,4);
  oled.putString("to START!");
  //write "NIGHT an DAY, GAME, Press the BUTTON, to START" on the x and y coordinates determined on the OLED screen

  Score=0;
  //define the score variable

  while(!(digitalRead(10)==1))  //until the button is pressed
  {
    _loop();
  }
  _delay(0.2);

  while(1){  //while loop
    if(counter==0){
      delay(500);
      Change_Word();
      lastTime=millis()/1000.0;
    }
    while(!(getLastTime()>2)){
      Serial.println(analogRead(27));
      if(analogRead(27)>200){
        Gamer_Reaction=0;

      }
      else{
        Gamer_Reaction=1;
      }
    }
   //determine the gamer reaction based on the value of the LDR sensor
   digitalWrite(20,HIGH);   //turn on the buzzer
   delay(250);  //wait
   digitalWrite(20,LOW);  //turn off the buzzer

   if(Night_or_Day==Gamer_Reaction){  //if the user's reaction and the Night_or_Day variable are the same
    Correct();
   
   }
   else{
    Wrong();
   }
   _loop();

   if(Score==100){
      oled.clearDisplay();
      oled.setTextXY(1,1);
      oled.putString("Congratulation");
      oled.setTextXY(3,1);
      oled.putString("Your Score");
      oled.setTextXY(3,13);
      String String_Score=String(Score);
      oled.putString(String_Score);
      oled.setTextXY(5,3);
      oled.putString("Press Reset");
      oled.setTextXY(6,3);
      oled.putString("To Repeat!");
      //write the "Congratulation, Your Score, press Reset, To Repeat!" and score variable on the x and y coordinates determined on the OLED screen
      for(int i=0;i<3;i++){
        digitalWrite(20,HIGH);
        delay(500);
        digitalWrite(20,LOW);
        delay(500);
     
    }
    //turn the buzzer on and off three times
    counter=1;

   }
  }
}

void Correct(){
  Score+=10;
  oled.clearDisplay();
  oled.setTextXY(3,4);
  oled.putString("10 Points");
  //increase the score by 10 when the gamer answers correctly
}

void Change_Word(){
  
  oled.clearDisplay();
  Night_or_Day=random(0,2);
  if(Night_or_Day==0){
    oled.setTextXY(3,6);
    oled.putString("NIGHT");

  }
  else{
    oled.setTextXY(3,7);
    oled.putString("DAY");
  }
 
}
//write "NIGHT" or "DAY" on random OLED screen

void Wrong(){
  oled.clearDisplay();
  oled.setTextXY(1,3);
  oled.putString("Game Over");
  oled.setTextXY(3,1);
  oled.putString("Your Score");
  oled.setTextXY(1,13);
  String String_Score=String(Score);
  oled.putString(String_Score);
  oled.setTextXY(5,3);
  oled.putString("Pres Reset");
  oled.setTextXY(6,3);
  oled.putString("To Repeat");
  // write the score variable and the expressions is quotation marks to the coordinates determined on the OLED screen.

  digitalWrite(20,HIGH);  //turn on the buzzer
  delay(1000);   //wait
  digitalWrite(20,LOW); //turn off the buzzer
  counter=1;
}
				
			

Project Image

Project Proposal 💡

You can modify the project based on the LDR sensor values, and automatically determine the limit via calibration of the sensor in code. You can add a difficulty level to the game. The difficulty level can be selected with the potentiometer as easy, medium and hard. The change time for words can be 2 seconds for Easy, 1.5 seconds for Medium, and 1 second for Hard.

Leave a Reply

Your email address will not be published.