Hello! This device have four function, first is number system converter, it converts binary numbers to decimal and hexadecimal. Second is binary calculator, third is for writing text, and last one is of course gaming. I can change mode with this potentiometer and this buton.
You can check all functons in video below!
I created this device to help my student to learn binary to decimal conversion and vice versa, also to practice ASCII codes with them.
Whole project is created in Arduino IDE, I created prototype on breadboard. Microcontroler is taken from Arduino Uno after sketch is uploaded.
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSans9pt7b.h>
#include <Fonts/FreeSans12pt7b.h>
#include <Fonts/FreeSans18pt7b.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
const unsigned char PROGMEM calc [] = {
0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF,
0xC0, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x7F,
0xFF, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x80,
0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x07, 0xF8, 0x00, 0x00, 0x3F, 0xE0, 0x07, 0xF0, 0x00, 0x00,
0x0F, 0xE0, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x1F, 0xE0, 0x00, 0x00, 0x0F, 0xF8, 0x1F, 0xE0,
0xFF, 0xFF, 0x0F, 0xF8, 0x3F, 0xE1, 0xFF, 0xFF, 0x8F, 0xFC, 0x3F, 0xE1, 0xFF, 0xFF, 0x8F, 0xFC,
0x3F, 0xE1, 0xFF, 0xFF, 0x8F, 0xFC, 0x7F, 0xE1, 0xFF, 0xFF, 0x8F, 0xFE, 0x7F, 0xE1, 0xFF, 0xFF,
0x8F, 0xFE, 0x7F, 0xE0, 0x00, 0x00, 0x0F, 0xFE, 0x7F, 0xE0, 0x00, 0x00, 0x0F, 0xFE, 0xFF, 0xE0,
0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xE1, 0xCE, 0x73, 0x8F, 0xFF,
0xFF, 0xE1, 0xCE, 0x73, 0x8F, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xE0, 0x00, 0x00,
0x0F, 0xFF, 0x7F, 0xE0, 0x00, 0x00, 0x0F, 0xFF, 0x7F, 0xE1, 0x8E, 0x71, 0x8F, 0xFE, 0x7F, 0xE1,
0x8E, 0x71, 0x8F, 0xFE, 0x7F, 0xE0, 0x00, 0x00, 0x0F, 0xFE, 0x3F, 0xE0, 0x00, 0x00, 0x0F, 0xFE,
0x3F, 0xE0, 0x00, 0x00, 0x0F, 0xFC, 0x3F, 0xE1, 0x8E, 0x71, 0x8F, 0xFC, 0x1F, 0xE1, 0x8E, 0x71,
0x8F, 0xF8, 0x1F, 0xE0, 0x00, 0x00, 0x0F, 0xF8, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x07, 0xF0,
0x00, 0x00, 0x0F, 0xF0, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0,
0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0xFF,
0xFE, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x03,
0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00
};
const unsigned char PROGMEM pc [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xFF,
0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x03, 0xC0,
0x00, 0x00, 0x00, 0x1E, 0x03, 0x80, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0xFC, 0x00, 0x00, 0x00, 0x0E,
0x7F, 0xFC, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFE, 0x00, 0x00,
0x00, 0x0E, 0xE0, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFE,
0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x0E,
0xE0, 0x1E, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x0E, 0x00, 0x00,
0x00, 0x0E, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFE,
0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x0E,
0xFF, 0xFE, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFE, 0x00, 0x00,
0x00, 0x0E, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFE,
0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0xFF, 0xFF, 0xFF,
0xFF, 0xFE, 0xE3, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE,
0x03, 0xFE, 0x00, 0x00, 0xFF, 0xFE, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0xFE, 0x03, 0xFE, 0x00, 0x00,
0xFF, 0xFE, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x07, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x0F, 0xFF,
0x00, 0x00, 0xFF, 0xFE, 0x3F, 0xFF, 0xE0, 0x00, 0x7F, 0xFC, 0x7F, 0xFF, 0xE0, 0x00, 0x3F, 0xF8,
0x7F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const unsigned char PROGMEM youtube[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x7F, 0xFE, 0x7F, 0xFE, 0x7C, 0xFE, 0x7C, 0x3E,
0x7C, 0x3E, 0x7C, 0xFE, 0x7F, 0xFE, 0x7F, 0xFE, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
void setup() {
for(int i=5;i<13;i++)
pinMode(i,INPUT_PULLUP);
pinMode(A1,INPUT_PULLUP);
pinMode(A2,INPUT_PULLUP);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
display.clearDisplay();
display.setTextSize(0);
display.setFont(&FreeSans9pt7b);
int pom=4;
display.setTextColor(WHITE);
display.setCursor(0,14);
display.println("VoloS");
display.setCursor(0,30);
display.println("ProjectS");
display.drawBitmap(82, 10,pc, 48,48, 1);
display.drawBitmap(0, 46+pom,youtube, 16,16, 1);
display.setFont();
display.drawLine(0,36,22,36,1);
display.setCursor(0,38+pom);
display.println("ELECTRONICS");
display.setCursor(22,50+pom);
display.println("CHANNEL");
display.display();
delay(3500);
}
int calcp=0;
int bx=60;
int by=32;
int sco=0;
int px=2;
int py=2;
int duz=122;
int pom=0;
String bb;
byte broj=0;
int poz=0;
byte mode=0;
byte fase=0;
byte first=0;
byte second=0;
int result=0;
char operation;
char o[4]={'+','-','*','='};
String txt="";
int show=0;
void loop() {
broj=0;
display.clearDisplay();
poz=map(analogRead(A0),0,900,0,3);
for(int i=5;i<13;i++)
{
if(digitalRead(i)==0)
bitWrite(broj,13-(i+1),1);
}
if(digitalRead(A1)==0 && mode==0)
mode=poz;
if(digitalRead(A2)==0)
mode=0;
if(mode==0)
{
calcp=0;
show=0;
fase=0;
txt="";
display.setFont(&FreeSans9pt7b);
display.setCursor(1,12);
display.println(broj,BIN);
display.setCursor(1,36);
display.println(broj);
display.setCursor(1,58);
display.println(broj,HEX);
display.setFont();
display.setCursor(88,0);
display.println("BINARY");
display.setCursor(36,28);
display.println("DECIMAL");
display.setCursor(36,50);
display.println("HEXA");
display.setFont(&FreeSans9pt7b);
display.setFont();
display.setCursor(100,22);
display.println("CONV");
display.setCursor(100,32);
display.println("CALC");
display.setCursor(100,42);
display.println("TEXT");
display.setCursor(100,52);
display.println("GAME");
display.setCursor(90,22+(poz*10));
display.println(">");
display.drawLine(0,16,124,16,1);
display.drawLine(0,17,124,17,1);
display.drawLine(86,16,86,64,1);
display.drawLine(84,16,84,64,1);
display.drawLine(36,42,78,42,1);
display.drawLine(0,63,128,63,1);
}
if(mode==1)
{
if(calcp==0)
{
calcp=1;
display.clearDisplay();
display.drawBitmap(42, 10,calc, 48,48, 1);
display.display();
delay(1400);
}
if(digitalRead(A1)==0)
{
if(pom==0)
{
pom=1;
if(fase==2 && poz==3)
{
second=broj;
if(operation=='+')
result=first+second;
if(operation=='-')
result=first-second;
if(operation=='*')
result=first*second;
fase=3;
}
if(fase==1)
{
fase=2;
first=broj;
bb=bb+String(o[poz]);
operation=o[poz];
}
if(fase==0)
fase=1;
}}else{pom=0;}
display.setFont();
display.setCursor(110,25);
display.println("+");
display.setCursor(110,35);
display.println("-");
display.setCursor(110,45);
display.println("*");
display.setCursor(110,55);
display.println("=");
display.setCursor(94,25+(poz*10));
display.println(">");
display.drawLine(0,16,124,16,1);
display.drawLine(0,17,124,17,1);
display.drawLine(86,16,86,64,1);
display.setFont(&FreeSans9pt7b);
display.setCursor(0,12);
if(fase==0)
{ display.setFont();
display.setCursor(10,7);
display.println("BINARY CALCULATOR:");
}
if(fase==1){
bb=String(broj);
display.println(bb);
display.setFont();
display.setCursor(16,28);
display.println(broj,BIN);
display.setCursor(92,7);
display.println("FIRST");
}
if(fase==2)
{display.print(bb);
display.print(broj);
display.setFont();
display.setCursor(90,7);
display.println("SECOND");
display.setCursor(16,28);
display.println(first,BIN);
display.setCursor(8,38);
display.println(operation);
display.setCursor(16,38);
display.println(broj,BIN);}
if(fase==3)
{
String finis=String(first)+String(operation)+String(second)+"="+String(result);
display.print(finis);
display.setFont();
display.setCursor(16,28);
display.println(first,BIN);
display.setCursor(8,38);
display.println(operation);
display.setCursor(16,38);
display.println(second,BIN);
display.drawLine(8,48,70,48,1);
display.setCursor(16,52);
display.println(result,BIN);
}
}
if(mode==2)
{
if(show==0)
{
if(digitalRead(A1)==0 )
{
if(pom==0){
pom=1;
if(poz==0)
txt=txt+String(char(broj));
if(poz==1)
txt.remove(txt.length()-1);
if(poz==3)
show=1;
}
}else {pom=0;}
display.setFont();
display.setCursor(94,25);
display.println("ADD");
display.setCursor(94,35);
display.println("DEL");
display.setCursor(94,45);
display.println("SAVE");
display.setCursor(94,55);
display.println("SHOW");
display.setCursor(2,39);
display.print("DEC:");
display.print(broj);
display.setCursor(2,56);
display.println("ASCII");
display.drawLine(0,52,48,52,1);
display.drawLine(48,52,48,38,1);
display.drawLine(48,38,78,38,1);
display.drawLine(82,16,82,64,1);
display.drawLine(84,16,84,64,1);
display.setCursor(86,25+(poz*10));
display.println(">");
display.drawLine(0,16,124,16,1);
display.setFont(&FreeSans9pt7b);
display.setCursor(0,32);
display.println(broj,BIN);
display.setFont(&FreeSans12pt7b);
display.setCursor(54,62);
display.println(char(broj));
display.setFont(&FreeSans9pt7b);
display.setCursor(0,12);
display.println(txt);
}
if(show==1)
{
if(txt.length()==0)
txt="Subscribe Please :)";
display.setFont(&FreeSans18pt7b);
display.setCursor(duz,55);
display.println(txt);
duz=duz-2;
if(duz<-260)
duz=122;
delay(poz*1);
}
}
if(mode==3)
{
display.setFont();
display.setCursor(0,0);
display.println("SCORE:");
display.setCursor(38,0);
display.println(sco);
display.drawRect(-2,8,130,56,1);
int pp=map(analogRead(A0),0,1024,8,50);
display.fillRect(0,pp,4,14,1);
display.fillCircle(bx,by,3,1);
if(bx>128-6)
px=px*-1;
if(by>64-6)
py=py*-1;
if(by<13)
py=py*-1;
if(bx<7)
if(by>=pp && by<=pp+15)
{px=px*-1;
sco=sco+1;}
if(bx<-2)
{
display.clearDisplay();
display.setFont(&FreeSans9pt7b);
display.setCursor(6,35);
display.println("GAME OVER!");
display.setCursor(36,55);
display.println(sco);
display.display();
delay(2000);
bx=random(20,45);
by=random(20,55);
sco=0;
px=px*-1;
}
bx=bx+px;
by=by+py;
}
display.display();
}
Comments