This week's brief:
#Code by Midlaj
#interface to connect the serial port and to send the values to the board.
<script>
let port;
let writer;
let reader;
let toggle;
async function connectToSerial() {
port = await navigator.serial.requestPort();
await port.open({ baudRate: 9600 });
#allows to send data to the serial device
writer = port.writable.getWriter();
#reads incoming data
reader = port.readable.getReader();
#decodes text from a stream of bytes
const decoder = new TextDecoder();
while(true) {
const { value, done } = await reader.read();
if (done) break;
#decoding stored data into a string
const string = decoder.decode(value);
document.getElementById('outputMsg').textContent += string;
}
}
async function sendMessage() {
const input = document.getElementById('input').value;
if (!writer) return;
const encoder = new TextEncoder();
await writer.write(encoder.encode(input + '\n'));
document.getElementById('input').value = ""
}
async function toggleLED() {
if (!writer) return;
const dataToSend = toggle ? '1' : '0'
const encoder = new TextEncoder();
writer.write(encoder.encode(dataToSend)).then(() => {
if (dataToSend === '0') {
document.getElementById('toggle').innerHTML = ``;
} else {
document.getElementById('toggle').innerHTML = ``;
}
toggle = !toggle;
});
}
document.getElementById('serial').addEventListener('click', connectToSerial);
document.getElementById('upload').addEventListener('click', sendMessage);
document.getElementById('toggle').addEventListener('click', toggleLED);
<script>
python3 -m pip install -U pygame --user
pip install pyserial
# Importing Libraries
import serial
import time
arduino = serial.Serial(port='COM4', baudrate=115200, timeout=.1)
def write_read(x):
arduino.write(bytes(x, 'utf-8'))
time.sleep(0.05)
data = arduino.readline()
return data
while True:
num = input("Enter a number: ") # Taking input from user
value = write_read(num)
print(value) # printing the value
int x;
void setup() {
Serial.begin(115200);
Serial.setTimeout(1);
}
void loop() {
while (!Serial.available());
x = Serial.readString().toInt();
Serial.print(x + 1);
}
//Code for sending data to python when a switch1 input is registered
#define switch1 26
#define switch2 28
int a = 0;
int b = 0;
bool SerUpdate;
void setup() {
Serial.begin(9600);
pinMode(switch1, INPUT);
pinMode(switch2, INPUT);
SerUpdate = false;
}
void loop() {
a = digitalRead(switch1);
b = digitalRead(switch2);
if (a == LOW && !SerUpdate) {
Serial.print("a");
SerUpdate = true;
} else if (b == LOW && !SerUpdate) {
Serial.print("D");
SerUpdate = true;
delay(300);
} else {
SerUpdate = false;
}
}
#code for shifting positon of rectangle
#Code from Coding With Russ modified by namita
import pygame
import sys
import serial
# to read serial data
ser = serial.Serial('COM20', 9800, timeout=1)
ser.readline()
pygame.init()
# for the display window
SCREEN_H = 600
SCREEN_W = 800
screen = pygame.display.set_mode((SCREEN_W,SCREEN_H))
pygame.display.set_caption("My Pygame Window")
player = pygame.Rect((300,250,50,50))
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
pygame.draw.rect(screen,(128, 0, 128),player)
# to receive
input= ser.read()
swinput =str(input,'UTF-8')
# variable to store the incoming serial data
print(swinput)
# to send
# comparing the strings ,if they match the position shifts
if(swinput == "U"):
player.move_ip(0,-30)
elif(swinput == "D"):
player.move_ip(-30,0)
elif(swinput == "J"):
player.move_ip(30,0)
elif(swinput == "A"):
player.move_ip(0,30)
pygame.display.update()
pygame.quit()
sys.exit()
#snake game 1st attempt to control usoing macropad
import pygame
import sys
import serial
ser = serial.Serial('COM20', 9800, timeout=1)
ser.readline()
pygame.init()
SCREEN_H = 600
SCREEN_W = 800
screen = pygame.display.set_mode((SCREEN_W,SCREEN_H))
pygame.display.set_caption("My Pygame Window")
player = pygame.Rect((300,250,50,50))
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
pygame.draw.rect(screen,(128, 0, 128),player)
datatosend =
input= ser.readline()
swinput =str(input,'UTF-8')
print(swinput)
if(swinput == "UP"):
player.move_ip(0,-30)
elif(swinput == "DOWN"):
player.move_ip(0,30)
pygame.display.update()
pygame.quit()
sys.exit()
//arduino ide code for up and down controllers
#define switch1 26
#define switch2 18
#define switch3 28
#define switch4 14
int a = 0;
int b = 0;
int c = 0;
int d = 0;
bool SerUpdate;
void setup() {
Serial.begin(9600);
pinMode(switch1, INPUT);
pinMode(switch2, INPUT);
pinMode(switch3, INPUT);
pinMode(switch4, INPUT);
SerUpdate = false;
}
void loop() {
a = digitalRead(switch1);
b = digitalRead(switch2);
c = digitalRead(switch3);
d = digitalRead(switch4);
if (a == LOW && !SerUpdate){
Serial.print("UP");
SerUpdate = true;
delay(300);
}else if (b == LOW && !SerUpdate) {
Serial.print("JUMP");
SerUpdate = true;
delay(300);
}else if (c == LOW && !SerUpdate) {
Serial.print("DOWN");
SerUpdate = true;
delay(300);
}else if (d == LOW && !SerUpdate) {
Serial.print("ATTACK");
SerUpdate = true;
delay(300);
}else
SerUpdate = false;
// delay(100);
}
#snake game by edureka , modified by Namita
# to be controlled using an external macropad
import pygame
import time
import random
import serial
# declared a null variable
ser = ""
pygame.init()
white = (255, 255, 255)
yellow = (255, 255, 102)
black = (211, 211, 211)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (21, 27, 84)
dis_width = 600
dis_height = 400
dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('Snake Game by Edureka modified by Namita')
#caption for display window
clock = pygame.time.Clock()
snake_block = 10
snake_speed = 15
#speed of snake
font_style = pygame.font.SysFont("lemonmilk", 25)
score_font = pygame.font.SysFont("montserrat", 25)
#fonts for displaying
def Your_score(score):
value = score_font.render("Your Score: " + str(score), True, white)
dis.blit(value, [10, 0])
def our_snake(snake_block, snake_list):
# dis.blit(img, (snake_list[-1][0], snake_list[-1][1]))
for x in snake_list:
pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])
def message(msg, color):
mesg = font_style.render(msg, True, color)
dis.blit(mesg, [dis_width /6, dis_height / 3])
def serialInit():
global ser
ser = serial.Serial('COM20', 2000000 , timeout=1)
# ser.read()
def gameOver():
ser.write(b'0')
def gameRestart():
ser.write(b'1')
def gameLoop():
#for checking is serial port is open/close
serialInit()
if ser.is_open:
print("Serial port is open.")
else:
print("Serial port is closed.")
ser.write(b'1')
game_over = False
game_close = False
#position coordinates
x1 = dis_width / 2
y1 = dis_height / 2
x1_change = 0
y1_change = 0
snake_List = []
Length_of_snake = 1
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
while not game_over:
#to quit or restart game
while game_close == True:
dis.fill(blue)
message("You Lost! Press C-Play Again or Q-Quit", red)
Your_score(Length_of_snake - 1)
if ser.is_open:
ser.write(b'0')
ser.close()
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
game_over = True
game_close = False
if event.key == pygame.K_c:
message("Loading...", white)
gameLoop()
if ser.in_waiting > 0:
input= ser.read()
swinput =str(input,'UTF-8')
print(swinput)
if swinput == "D":
x1_change = -snake_block
y1_change = 0
elif swinput == "J":
x1_change = snake_block
y1_change = 0
elif swinput == "U":
y1_change = -snake_block
x1_change = 0
elif swinput == "A":
y1_change = snake_block
x1_change = 0
#interfacing with macropad
if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
game_close = True
x1 += x1_change
y1 += y1_change
dis.fill(blue)
pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])
snake_Head = []
snake_Head.append(x1)
snake_Head.append(y1)
snake_List.append(snake_Head)
if len(snake_List) > Length_of_snake:
del snake_List[0]
#If snake head touches the tail
for x in snake_List[:-1]:
if x == snake_Head:
game_close = True
our_snake(snake_block, snake_List)
Your_score(Length_of_snake - 1)
pygame.display.update()
#when snake encounters food
if x1 == foodx and y1 == foody:
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
Length_of_snake += 1
ser.write(b'2')
clock.tick(snake_speed)
pygame.quit()
quit()
gameLoop()
// Code for pygame snake
#define switch1 26
#define switch2 18
#define switch3 28
#define switch4 14
//defining all the switches
#define ledPin 12 // neopixel pin
#include <Adafruit_NeoPixel.h> // addressable LED library
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
#include <LiquidCrystal.h> // library for LCD
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 4
Adafruit_NeoPixel pixels(NUMPIXELS,ledPin, NEO_GRB + NEO_KHZ800);
#define DELAYVAL 500
// Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
int a = 0;
int b = 0;
int c = 0;
int d = 0;
bool SerUpdate; //for debouncing
int incoming;
const int buzzerPin = 22;
const int rs = 6, en = 7, d4 = 13, d5 = 11, d6 = 9, d7 = 8;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
Serial.begin(2000000);
pinMode(switch1, INPUT);
pinMode(switch2, INPUT);
pinMode(switch3, INPUT);
pinMode(switch4, INPUT);
SerUpdate = false;
pixels.begin(); // INITIALIZE NeoPixel strip object
lcd.begin(2, 16);
// Print a message to the LCD.
lcd.print("START GAME");
}
void loop() {
a = digitalRead(switch1);
b = digitalRead(switch2);
c = digitalRead(switch3);
d = digitalRead(switch4);
incoming = Serial.read(); // variable storing serial data sent from python code
if (incoming > -1) {
Serial.println(incoming);
}
if (incoming == '0') { // if serial read as 0 , game over ( turns on led and plays the game over tune)
gameover_seq();
gamefail();
lcd.print("GAME OVER");
lcd.clear();
delay(100);
clearPixel();
}
if (incoming == '1') { // if serail is read as 1 , restarts the game(turns LED off and plays the startup tune)
clearPixel();
startup();
start_seq();
// lcd.clear();
// lcd.print("GAME OVER");
}
if (incoming == '2') { //serial when the snake eats food
tone(buzzerPin, 3500, 10);
}
// checking if switch is pressed
if (a == LOW && !SerUpdate) {
Serial.print("U");
tone(buzzerPin, 2000, 20);
SerUpdate = true;
delay(300);
} else if (b == LOW && !SerUpdate) {
Serial.print("J");
tone(buzzerPin, 2000, 20);
SerUpdate = true;
delay(300);
} else if (c == LOW && !SerUpdate) {
Serial.print("D");
tone(buzzerPin, 2000, 20);
SerUpdate = true;
delay(300);
} else if (d == LOW && !SerUpdate) {
Serial.print("A");
tone(buzzerPin, 2000, 20);
SerUpdate = true;
delay(300);
} else
SerUpdate = false;
}
// led sequence when game starts
void start_seq() {
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(0, 255, 0));
pixels.show();
// delay(300);
clearPixel();
// delay(DELAYVAL);
}
}
// led sequence when game is over
void gameover_seq() {
pixels.clear();
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(255, 0, 0));
pixels.show();
}
}
//clears led colours
void clearPixel() {
pixels.clear();
pixels.show();
}
// buzzer melody sequence when game starts
void startup() {
tone(buzzerPin, 262, 500); // C4
delay(200);
tone(buzzerPin, 294, 500); // D4
delay(200);
tone(buzzerPin, 330, 500); // E4
delay(200);
tone(buzzerPin, 349, 500); // F4
delay(200);
noTone(buzzerPin);
delay(500);
}
// buzzer melody sequence when game is over
void gamefail() {
tone(buzzerPin, 500, 200);
delay(200);
tone(buzzerPin, 500, 200);
delay(200);
tone(buzzerPin, 500, 200);
delay(200);
tone(buzzerPin, 800, 150);
delay(150);
tone(buzzerPin, 500, 500);
delay(500);
tone(buzzerPin, 600, 1000);
delay(10000);
}
We explored different tools to make an interface. We tried out tools like Kodular, Pygame, Processing, Flutter, and HTML with CSS for creating computer interfaces. The main objective was to understand how we can use various tools to help in making an interface for our final projects.