* Notes
* Notes
* Notes

week 3: embedded programming

soldering session with Anthony and introduction to Arduino


Since I was admitted to the class later I had asychronus office hours with Anthony that he explained to me step by step

soldering session
Anthony showed me the components that I will be using for the project
soldering session
different sizes of resistors
soldering session
tools that were necessary for the soldering session
soldering session
soldering machine
soldering session
this is the soldering iron that I had to use and the golden metal spiral elements help with the cleaning of the tip of the soldering iron
soldering session
first I had to learn how to use the soldering iron properly
soldering session
Anthony soldered the first resistor
soldering session
I soldered the second resistor
soldering session
soldering session
the first side of the microcontroller
soldering session
microcontroller ready
soldering session
I checked the holes that the screen would be attached
soldering session
screen attached
soldering session
Antony showed me how to use the voltage detector
soldering session
here he explained to me the role of the resistors in an electric circuit
soldering session
and the next step was to introduce me to arduino which I downloaded
soldering session
I had also to download the required libraries
soldering session
and select the microcontroller and the port that I was about to use
soldering session
I connected the usb c cable and the led reacted
soldering session
and then we tried some test codes
soldering session
first for the screen the Hello world message
and then the led blikning
last code was about testing the buttons

falling block dodge game


Once I was comfortable with these individual testing functions, I wanted to combine them to make a game. Using the knowledge gained from the button, LED, and display experiments, I structured a simple game framework. I started by defining the player and obstacle entities, including their positions, sizes, and states. I then implemented the player movement, using the buttons to move the player block left or right while constraining it within the screen boundaries. Following that, I developed the obstacle spawning and movement logic, where obstacles fall from the top of the screen at a fixed speed and reset once they leave the display area.

Next, I implemented collision detection between the player and obstacles using axis-aligned bounding boxes, which allowed the game to detect a “game over” event accurately. I also added a scoring system, incrementing the score over time and displaying it dynamically on the screen. Finally, I integrated all the elements into a main loop that reads inputs, updates the game state, checks for collisions, and redraws the player, obstacles, and score every frame.

I did use ChatGPT to clarify certain programming approaches and optimize code structure. By incrementally building on small, verified functions, I was able to transition from simple tests to a fully functioning interactive game, demonstrating both my understanding of the hardware and my ability to translate that understanding into code.

Arduino Falling block dodge game



#include 
#include 
#include 
#include 

// ---------------- Display ----------------
#define SCREEN_WIDTH   128
#define SCREEN_HEIGHT  64
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// ---------------- Touch mapping ----------------
const uint8_t TOUCH_PINS[6] = { 26, 2, 27, 1, 4, 3 };
const int IDX_U = 0;   // up (unused)
const int IDX_D = 1;   // down (unused)
const int IDX_L = 2;   // move left
const int IDX_R = 3;   // move right
const int IDX_A = 4;   // restart/start
const int IDX_B = 5;   // pause/resume

uint16_t touch_baseline[6], touch_thresh[6], touch_value[6];
bool touch_now[6], touch_prev[6];

// ---------------- Player ----------------
int playerX = 60;
const int playerY = 55;
const int PLAYER_W = 8;
const int PLAYER_H = 8;

// ---------------- Obstacles ----------------
struct Obstacle { int x, y, w, h; };
#define MAX_OBS 5
Obstacle obs[MAX_OBS];

// Game state
bool running = false, paused = false;
unsigned long lastMs;
uint32_t score = 0;

// ---------------- Touch ----------------
uint16_t touchReadOne(uint8_t pin){
  pinMode(pin,OUTPUT); digitalWrite(pin,LOW); delayMicroseconds(10);
  pinMode(pin,INPUT_PULLUP);
  uint16_t c=0; while(digitalRead(pin)==LOW && c<8000){ c++; }
  return c;
}

void calibrateTouch(){
  for(int i=0;i<6;i++) touch_baseline[i]=0;
  for(int s=0;s<24;s++){
    for(int i=0;i<6;i++) touch_baseline[i]+=touchReadOne(TOUCH_PINS[i]);
    delay(5);
  }
  for(int i=0;i<6;i++){
    touch_baseline[i]/=24;
    touch_thresh[i]=touch_baseline[i]+10;
    touch_prev[i]=false; touch_now[i]=false;
  }
}

void updateTouch(){
  for(int i=0;i<6;i++){
    uint16_t v = touchReadOne(TOUCH_PINS[i]);
    touch_value[i]=v;
    bool p = touch_now[i];
    if(!p){ if(v>=touch_thresh[i]) p=true; }
    else { if(v+6ox)&&(pyoy);
}

void drawPlayer(){ display.fillRect(playerX, playerY, PLAYER_W, PLAYER_H, SSD1306_WHITE); }
void drawObstacles(){
  for(int i=0;iSCREEN_WIDTH-PLAYER_W) playerX = SCREEN_WIDTH-PLAYER_W;

  // Timing
  unsigned long now = millis();
  float dt = (now-lastMs)/1000.0f;
  if(dt < 1.0f/60.0f) return;
  lastMs = now;

  // Move obstacles
  for(int i=0;i SCREEN_HEIGHT){
      obs[i].y = -8;
      obs[i].x = random(0, SCREEN_WIDTH-obs[i].w);
      score++;
    }
    // collision
    if(collide(playerX, playerY, PLAYER_W, PLAYER_H, obs[i].x, obs[i].y, obs[i].w, obs[i].h)){
      running = false;
      display.clearDisplay();
      display.setCursor(20,20); display.println("GAME OVER");
      display.setCursor(10,35); display.println("Press A to restart");
      display.display();
      return;
    }
  }

  // Draw
  display.clearDisplay();
  drawPlayer();
  drawObstacles();
  display.setCursor(0,0); display.print("Score: "); display.print(score);
  display.display();
}

  
soldering session
game works