Uxcell 7-segment, common cathode display, available on Amazon.
Category Archives: source code
Basic Arduino Function
This simple sketch illustrates the Arduino syntax for creating a function.
More information can be found here.
void setup(){ Serial.begin(9600); } void loop() { int i = 2; int j = 3; int k; k = myMultiplyFunction(i, j); // k now contains 6 Serial.println(k); delay(500); } int myMultiplyFunction(int x, int y){ int result; result = x * y; return result; }
Java Pacman
A basic Java implementation of Pacman. Requires two class files, Board.java and Pacman.java in addition to the images files contained in this zip file.
import java.awt.EventQueue; import javax.swing.JFrame; public class Pacman extends JFrame { public Pacman() { initUI(); } private void initUI() { add(new Board()); setTitle("Pacman"); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(380, 420); setLocationRelativeTo(null); setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(() -> { Pacman ex = new Pacman(); ex.setVisible(true); }); } }
import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Event; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.ImageIcon; import javax.swing.JPanel; import javax.swing.Timer; public class Board extends JPanel implements ActionListener { private Dimension d; private final Font smallFont = new Font("Helvetica", Font.BOLD, 14); private Image ii; private final Color dotColor = new Color(192, 192, 0); private Color mazeColor; private boolean inGame = false; private boolean dying = false; private final int BLOCK_SIZE = 24; private final int N_BLOCKS = 15; private final int SCREEN_SIZE = N_BLOCKS * BLOCK_SIZE; private final int PAC_ANIM_DELAY = 2; private final int PACMAN_ANIM_COUNT = 4; private final int MAX_GHOSTS = 12; private final int PACMAN_SPEED = 6; private int pacAnimCount = PAC_ANIM_DELAY; private int pacAnimDir = 1; private int pacmanAnimPos = 0; private int N_GHOSTS = 6; private int pacsLeft, score; private int[] dx, dy; private int[] ghost_x, ghost_y, ghost_dx, ghost_dy, ghostSpeed; private Image ghost; private Image pacman1, pacman2up, pacman2left, pacman2right, pacman2down; private Image pacman3up, pacman3down, pacman3left, pacman3right; private Image pacman4up, pacman4down, pacman4left, pacman4right; private int pacman_x, pacman_y, pacmand_x, pacmand_y; private int req_dx, req_dy, view_dx, view_dy; private final short levelData[] = { 19, 26, 26, 26, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 22, 21, 0, 0, 0, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 20, 21, 0, 0, 0, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 20, 21, 0, 0, 0, 17, 16, 16, 24, 16, 16, 16, 16, 16, 16, 20, 17, 18, 18, 18, 16, 16, 20, 0, 17, 16, 16, 16, 16, 16, 20, 17, 16, 16, 16, 16, 16, 20, 0, 17, 16, 16, 16, 16, 24, 20, 25, 16, 16, 16, 24, 24, 28, 0, 25, 24, 24, 16, 20, 0, 21, 1, 17, 16, 20, 0, 0, 0, 0, 0, 0, 0, 17, 20, 0, 21, 1, 17, 16, 16, 18, 18, 22, 0, 19, 18, 18, 16, 20, 0, 21, 1, 17, 16, 16, 16, 16, 20, 0, 17, 16, 16, 16, 20, 0, 21, 1, 17, 16, 16, 16, 16, 20, 0, 17, 16, 16, 16, 20, 0, 21, 1, 17, 16, 16, 16, 16, 16, 18, 16, 16, 16, 16, 20, 0, 21, 1, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 20, 0, 21, 1, 25, 24, 24, 24, 24, 24, 24, 24, 24, 16, 16, 16, 18, 20, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 25, 24, 24, 24, 28 }; private final int validSpeeds[] = {1, 2, 3, 4, 6, 8}; private final int maxSpeed = 6; private int currentSpeed = 3; private short[] screenData; private Timer timer; public Board() { loadImages(); initVariables(); initBoard(); } private void initBoard() { addKeyListener(new TAdapter()); setFocusable(true); setBackground(Color.black); setDoubleBuffered(true); } private void initVariables() { screenData = new short[N_BLOCKS * N_BLOCKS]; mazeColor = new Color(5, 100, 5); d = new Dimension(400, 400); ghost_x = new int[MAX_GHOSTS]; ghost_dx = new int[MAX_GHOSTS]; ghost_y = new int[MAX_GHOSTS]; ghost_dy = new int[MAX_GHOSTS]; ghostSpeed = new int[MAX_GHOSTS]; dx = new int[4]; dy = new int[4]; timer = new Timer(40, this); timer.start(); } @Override public void addNotify() { super.addNotify(); initGame(); } private void doAnim() { pacAnimCount--; if (pacAnimCount <= 0) { pacAnimCount = PAC_ANIM_DELAY; pacmanAnimPos = pacmanAnimPos + pacAnimDir; if (pacmanAnimPos == (PACMAN_ANIM_COUNT - 1) || pacmanAnimPos == 0) { pacAnimDir = -pacAnimDir; } } } private void playGame(Graphics2D g2d) { if (dying) { death(); } else { movePacman(); drawPacman(g2d); moveGhosts(g2d); checkMaze(); } } private void showIntroScreen(Graphics2D g2d) { g2d.setColor(new Color(0, 32, 48)); g2d.fillRect(50, SCREEN_SIZE / 2 - 30, SCREEN_SIZE - 100, 50); g2d.setColor(Color.white); g2d.drawRect(50, SCREEN_SIZE / 2 - 30, SCREEN_SIZE - 100, 50); String s = "Press s to start."; Font small = new Font("Helvetica", Font.BOLD, 14); FontMetrics metr = this.getFontMetrics(small); g2d.setColor(Color.white); g2d.setFont(small); g2d.drawString(s, (SCREEN_SIZE - metr.stringWidth(s)) / 2, SCREEN_SIZE / 2); } private void drawScore(Graphics2D g) { int i; String s; g.setFont(smallFont); g.setColor(new Color(96, 128, 255)); s = "Score: " + score; g.drawString(s, SCREEN_SIZE / 2 + 96, SCREEN_SIZE + 16); for (i = 0; i < pacsLeft; i++) { g.drawImage(pacman3left, i * 28 + 8, SCREEN_SIZE + 1, this); } } private void checkMaze() { short i = 0; boolean finished = true; while (i < N_BLOCKS * N_BLOCKS && finished) { if ((screenData[i] & 48) != 0) { finished = false; } i++; } if (finished) { score += 50; if (N_GHOSTS < MAX_GHOSTS) { N_GHOSTS++; } if (currentSpeed < maxSpeed) { currentSpeed++; } initLevel(); } } private void death() { pacsLeft--; if (pacsLeft == 0) { inGame = false; } continueLevel(); } private void moveGhosts(Graphics2D g2d) { short i; int pos; int count; for (i = 0; i < N_GHOSTS; i++) { if (ghost_x[i] % BLOCK_SIZE == 0 && ghost_y[i] % BLOCK_SIZE == 0) { pos = ghost_x[i] / BLOCK_SIZE + N_BLOCKS * (int) (ghost_y[i] / BLOCK_SIZE); count = 0; if ((screenData[pos] & 1) == 0 && ghost_dx[i] != 1) { dx[count] = -1; dy[count] = 0; count++; } if ((screenData[pos] & 2) == 0 && ghost_dy[i] != 1) { dx[count] = 0; dy[count] = -1; count++; } if ((screenData[pos] & 4) == 0 && ghost_dx[i] != -1) { dx[count] = 1; dy[count] = 0; count++; } if ((screenData[pos] & 8) == 0 && ghost_dy[i] != -1) { dx[count] = 0; dy[count] = 1; count++; } if (count == 0) { if ((screenData[pos] & 15) == 15) { ghost_dx[i] = 0; ghost_dy[i] = 0; } else { ghost_dx[i] = -ghost_dx[i]; ghost_dy[i] = -ghost_dy[i]; } } else { count = (int) (Math.random() * count); if (count > 3) { count = 3; } ghost_dx[i] = dx[count]; ghost_dy[i] = dy[count]; } } ghost_x[i] = ghost_x[i] + (ghost_dx[i] * ghostSpeed[i]); ghost_y[i] = ghost_y[i] + (ghost_dy[i] * ghostSpeed[i]); drawGhost(g2d, ghost_x[i] + 1, ghost_y[i] + 1); if (pacman_x > (ghost_x[i] - 12) && pacman_x < (ghost_x[i] + 12) && pacman_y > (ghost_y[i] - 12) && pacman_y < (ghost_y[i] + 12) && inGame) { dying = true; } } } private void drawGhost(Graphics2D g2d, int x, int y) { g2d.drawImage(ghost, x, y, this); } private void movePacman() { int pos; short ch; if (req_dx == -pacmand_x && req_dy == -pacmand_y) { pacmand_x = req_dx; pacmand_y = req_dy; view_dx = pacmand_x; view_dy = pacmand_y; } if (pacman_x % BLOCK_SIZE == 0 && pacman_y % BLOCK_SIZE == 0) { pos = pacman_x / BLOCK_SIZE + N_BLOCKS * (int) (pacman_y / BLOCK_SIZE); ch = screenData[pos]; if ((ch & 16) != 0) { screenData[pos] = (short) (ch & 15); score++; } if (req_dx != 0 || req_dy != 0) { if (!((req_dx == -1 && req_dy == 0 && (ch & 1) != 0) || (req_dx == 1 && req_dy == 0 && (ch & 4) != 0) || (req_dx == 0 && req_dy == -1 && (ch & 2) != 0) || (req_dx == 0 && req_dy == 1 && (ch & 8) != 0))) { pacmand_x = req_dx; pacmand_y = req_dy; view_dx = pacmand_x; view_dy = pacmand_y; } } // Check for standstill if ((pacmand_x == -1 && pacmand_y == 0 && (ch & 1) != 0) || (pacmand_x == 1 && pacmand_y == 0 && (ch & 4) != 0) || (pacmand_x == 0 && pacmand_y == -1 && (ch & 2) != 0) || (pacmand_x == 0 && pacmand_y == 1 && (ch & 8) != 0)) { pacmand_x = 0; pacmand_y = 0; } } pacman_x = pacman_x + PACMAN_SPEED * pacmand_x; pacman_y = pacman_y + PACMAN_SPEED * pacmand_y; } private void drawPacman(Graphics2D g2d) { if (view_dx == -1) { drawPacnanLeft(g2d); } else if (view_dx == 1) { drawPacmanRight(g2d); } else if (view_dy == -1) { drawPacmanUp(g2d); } else { drawPacmanDown(g2d); } } private void drawPacmanUp(Graphics2D g2d) { switch (pacmanAnimPos) { case 1: g2d.drawImage(pacman2up, pacman_x + 1, pacman_y + 1, this); break; case 2: g2d.drawImage(pacman3up, pacman_x + 1, pacman_y + 1, this); break; case 3: g2d.drawImage(pacman4up, pacman_x + 1, pacman_y + 1, this); break; default: g2d.drawImage(pacman1, pacman_x + 1, pacman_y + 1, this); break; } } private void drawPacmanDown(Graphics2D g2d) { switch (pacmanAnimPos) { case 1: g2d.drawImage(pacman2down, pacman_x + 1, pacman_y + 1, this); break; case 2: g2d.drawImage(pacman3down, pacman_x + 1, pacman_y + 1, this); break; case 3: g2d.drawImage(pacman4down, pacman_x + 1, pacman_y + 1, this); break; default: g2d.drawImage(pacman1, pacman_x + 1, pacman_y + 1, this); break; } } private void drawPacnanLeft(Graphics2D g2d) { switch (pacmanAnimPos) { case 1: g2d.drawImage(pacman2left, pacman_x + 1, pacman_y + 1, this); break; case 2: g2d.drawImage(pacman3left, pacman_x + 1, pacman_y + 1, this); break; case 3: g2d.drawImage(pacman4left, pacman_x + 1, pacman_y + 1, this); break; default: g2d.drawImage(pacman1, pacman_x + 1, pacman_y + 1, this); break; } } private void drawPacmanRight(Graphics2D g2d) { switch (pacmanAnimPos) { case 1: g2d.drawImage(pacman2right, pacman_x + 1, pacman_y + 1, this); break; case 2: g2d.drawImage(pacman3right, pacman_x + 1, pacman_y + 1, this); break; case 3: g2d.drawImage(pacman4right, pacman_x + 1, pacman_y + 1, this); break; default: g2d.drawImage(pacman1, pacman_x + 1, pacman_y + 1, this); break; } } private void drawMaze(Graphics2D g2d) { short i = 0; int x, y; for (y = 0; y < SCREEN_SIZE; y += BLOCK_SIZE) { for (x = 0; x < SCREEN_SIZE; x += BLOCK_SIZE) { g2d.setColor(mazeColor); g2d.setStroke(new BasicStroke(2)); if ((screenData[i] & 1) != 0) { g2d.drawLine(x, y, x, y + BLOCK_SIZE - 1); } if ((screenData[i] & 2) != 0) { g2d.drawLine(x, y, x + BLOCK_SIZE - 1, y); } if ((screenData[i] & 4) != 0) { g2d.drawLine(x + BLOCK_SIZE - 1, y, x + BLOCK_SIZE - 1, y + BLOCK_SIZE - 1); } if ((screenData[i] & 8) != 0) { g2d.drawLine(x, y + BLOCK_SIZE - 1, x + BLOCK_SIZE - 1, y + BLOCK_SIZE - 1); } if ((screenData[i] & 16) != 0) { g2d.setColor(dotColor); g2d.fillRect(x + 11, y + 11, 2, 2); } i++; } } } private void initGame() { pacsLeft = 3; score = 0; initLevel(); N_GHOSTS = 6; currentSpeed = 3; } private void initLevel() { int i; for (i = 0; i < N_BLOCKS * N_BLOCKS; i++) { screenData[i] = levelData[i]; } continueLevel(); } private void continueLevel() { short i; int dx = 1; int random; for (i = 0; i < N_GHOSTS; i++) { ghost_y[i] = 4 * BLOCK_SIZE; ghost_x[i] = 4 * BLOCK_SIZE; ghost_dy[i] = 0; ghost_dx[i] = dx; dx = -dx; random = (int) (Math.random() * (currentSpeed + 1)); if (random > currentSpeed) { random = currentSpeed; } ghostSpeed[i] = validSpeeds[random]; } pacman_x = 7 * BLOCK_SIZE; pacman_y = 11 * BLOCK_SIZE; pacmand_x = 0; pacmand_y = 0; req_dx = 0; req_dy = 0; view_dx = -1; view_dy = 0; dying = false; } private void loadImages() { ghost = new ImageIcon("images/ghost.png").getImage(); pacman1 = new ImageIcon("images/pacman.png").getImage(); pacman2up = new ImageIcon("images/up1.png").getImage(); pacman3up = new ImageIcon("images/up2.png").getImage(); pacman4up = new ImageIcon("images/up3.png").getImage(); pacman2down = new ImageIcon("images/down1.png").getImage(); pacman3down = new ImageIcon("images/down2.png").getImage(); pacman4down = new ImageIcon("images/down3.png").getImage(); pacman2left = new ImageIcon("images/left1.png").getImage(); pacman3left = new ImageIcon("images/left2.png").getImage(); pacman4left = new ImageIcon("images/left3.png").getImage(); pacman2right = new ImageIcon("images/right1.png").getImage(); pacman3right = new ImageIcon("images/right2.png").getImage(); pacman4right = new ImageIcon("images/right3.png").getImage(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setColor(Color.black); g2d.fillRect(0, 0, d.width, d.height); drawMaze(g2d); drawScore(g2d); doAnim(); if (inGame) { playGame(g2d); } else { showIntroScreen(g2d); } g2d.drawImage(ii, 5, 5, this); Toolkit.getDefaultToolkit().sync(); g2d.dispose(); } class TAdapter extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if (inGame) { if (key == KeyEvent.VK_LEFT) { req_dx = -1; req_dy = 0; } else if (key == KeyEvent.VK_RIGHT) { req_dx = 1; req_dy = 0; } else if (key == KeyEvent.VK_UP) { req_dx = 0; req_dy = -1; } else if (key == KeyEvent.VK_DOWN) { req_dx = 0; req_dy = 1; } else if (key == KeyEvent.VK_ESCAPE && timer.isRunning()) { inGame = false; } else if (key == KeyEvent.VK_PAUSE) { if (timer.isRunning()) { timer.stop(); } else { timer.start(); } } } else { if (key == 's' || key == 'S') { inGame = true; initGame(); } } } @Override public void keyReleased(KeyEvent e) { int key = e.getKeyCode(); if (key == Event.LEFT || key == Event.RIGHT || key == Event.UP || key == Event.DOWN) { req_dx = 0; req_dy = 0; } } } @Override public void actionPerformed(ActionEvent e) { repaint(); } }
DHT-22 Temperature and Humidity Senor Sample Code
Sample code for the DHT-22 temperature and humidity sensor in arduino.
Code borrowed from this Instructable, a useful guide to using the sensor.
Second code block includes temperature in Fahrenheit and comes from the Adafruit sensor library.
/* How to use the DHT-22 sensor with Arduino uno Temperature and humidity sensor More info: http://www.ardumotive.com/how-to-use-dht-22-sensor-en.html Dev: Michalis Vasilakis // Date: 1/7/2015 // www.ardumotive.com */ //Libraries #include <DHT.h> //Constants #define DHTPIN 2 // what pin we're connected to #define DHTTYPE DHT22 // DHT 22 (AM2302) DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino //Variables int chk; float hum; //Stores humidity value float temp; //Stores temperature value void setup() { Serial.begin(9600); dht.begin(); } void loop() { //Read data and store it to variables hum and temp hum = dht.readHumidity(); temp= dht.readTemperature(); //Print temp and humidity values to serial monitor Serial.print("Humidity: "); Serial.print(hum); Serial.print(" %, Temp: "); Serial.print(temp); Serial.println(" Celsius"); delay(2000); //Delay 2 sec. }
#include <Adafruit_Sensor.h> #include <Adafruit_LIS3DH.h> // Example testing sketch for various DHT humidity/temperature sensors // Written by ladyada, public domain #include "DHT.h" #define DHTPIN 2 // what digital pin we're connected to // Uncomment whatever type you're using! //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //#define DHTTYPE DHT21 // DHT 21 (AM2301) // Connect pin 1 (on the left) of the sensor to +5V // NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1 // to 3.3V instead of 5V! // Connect pin 2 of the sensor to whatever your DHTPIN is // Connect pin 4 (on the right) of the sensor to GROUND // Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor // Initialize DHT sensor. // Note that older versions of this library took an optional third parameter to // tweak the timings for faster processors. This parameter is no longer needed // as the current DHT reading algorithm adjusts itself to work on faster procs. DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); } void loop() { // Wait a few seconds between measurements. delay(2000); // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h = dht.readHumidity(); // Read temperature as Celsius (the default) float t = dht.readTemperature(); // Read temperature as Fahrenheit (isFahrenheit = true) float f = dht.readTemperature(true); // Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t) || isnan(f)) { Serial.println("Failed to read from DHT sensor!"); return; } // Compute heat index in Fahrenheit (the default) float hif = dht.computeHeatIndex(f, h); // Compute heat index in Celsius (isFahreheit = false) float hic = dht.computeHeatIndex(t, h, false); Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.print(" *C "); Serial.print(f); Serial.print(" *F\t"); Serial.print("Heat index: "); Serial.print(hic); Serial.print(" *C "); Serial.print(hif); Serial.println(" *F"); }
BoeBot Arduino Servo Calibration
Servo calibration code for the BoeBot. Both servos should remain still. If either is drifting, the potentiometer must be adjusted until the servo stops spinning or humming.
Complete textbook for the BoeBot can be found here.
/* Robotics with the BOE Shield – BothServosStayStill Generate signals to make the servos stay still for centering. */ #include <Servo.h> // Include servo library Servo servoLeft; // Declare left servo signal Servo servoRight; // Declare right servo signal void setup() // Built in initialization block { servoLeft.attach(13); // Attach left signal to pin 13 servoRight.attach(12); // Attach left signal to pin 12 servoLeft.writeMicroseconds(1500); // 1.5 ms stay still sig, pin 13 servoRight.writeMicroseconds(1500); // 1.5 ms stay still sig, pin 12 } void loop() // Main loop auto-repeats { // Empty, nothing needs repeating }
Emic 2 Sample Code
Sample code for the Emic 2 Text-to-speech module from Parallax on arduino.
Further documentation found here.
/* Emic 2 Text-to-Speech Module: Basic Demonstration Author: Joe Grand [www.grandideastudio.com] Contact: support@parallax.com Program Description: This program provides a simple demonstration of the Emic 2 Text-to-Speech Module. Please refer to the product manual for full details of system functionality and capabilities. Revisions: 1.0 (February 13, 2012): Initial release 1.1 (April 29, 2014): Changed rxPin/txPin to use pins 10/11, respectively, for widest support across the Arduino family (http://arduino.cc/en/Reference/SoftwareSerial) */ // include the SoftwareSerial library so we can use it to talk to the Emic 2 module #include <SoftwareSerial.h> #define rxPin 10 // Serial input (connects to Emic 2's SOUT pin) #define txPin 11 // Serial output (connects to Emic 2's SIN pin) #define ledPin 13 // Most Arduino boards have an on-board LED on this pin // set up a new serial port SoftwareSerial emicSerial = SoftwareSerial(rxPin, txPin); void setup() // Set up code called once on start-up { // define pin modes pinMode(ledPin, OUTPUT); pinMode(rxPin, INPUT); pinMode(txPin, OUTPUT); // set the data rate for the SoftwareSerial port emicSerial.begin(9600); digitalWrite(ledPin, LOW); // turn LED off /* When the Emic 2 powers on, it takes about 3 seconds for it to successfully initialize. It then sends a ":" character to indicate it's ready to accept commands. If the Emic 2 is already initialized, a CR will also cause it to send a ":" */ emicSerial.print('\n'); // Send a CR in case the system is already up while (emicSerial.read() != ':'); // When the Emic 2 has initialized and is ready, it will send a single ':' character, so wait here until we receive it delay(10); // Short delay emicSerial.flush(); // Flush the receive buffer } void loop() // Main code, to run repeatedly { // Speak some text emicSerial.print('S'); emicSerial.print("Hello. My name is the Emic 2 Text-to-Speech module. I would like to sing you a song."); // Send the desired string to convert to speech emicSerial.print('\n'); digitalWrite(ledPin, HIGH); // Turn on LED while Emic is outputting audio while (emicSerial.read() != ':'); // Wait here until the Emic 2 responds with a ":" indicating it's ready to accept the next command digitalWrite(ledPin, LOW); delay(500); // 1/2 second delay // Sing a song emicSerial.print("D1\n"); digitalWrite(ledPin, HIGH); // Turn on LED while Emic is outputting audio while (emicSerial.read() != ':'); // Wait here until the Emic 2 responds with a ":" indicating it's ready to accept the next command digitalWrite(ledPin, LOW); while(1) // Demonstration complete! { delay(500); digitalWrite(ledPin, HIGH); delay(500); digitalWrite(ledPin, LOW); } }
Java Simple Graph
Graphing class using swing. Creates a JPanel with a plot of 4 points.
Original code can be found here.
import java.awt.*; import javax.swing.*; public class PlotTest extends JPanel { int[] data = { 25, 60, 42, 75 }; final int PAD = 20; protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); int w = getWidth(); int h = getHeight(); g2.drawLine(PAD, PAD, PAD, h-PAD); g2.drawLine(PAD, h-PAD, w-PAD, h-PAD); double xScale = (w - 2*PAD)/(data.length + 1); double maxValue = 100.0; double yScale = (h - 2*PAD)/maxValue; // The origin location. int x0 = PAD; int y0 = h-PAD; g2.setPaint(Color.red); for(int j = 0; j < data.length; j++) { int x = x0 + (int)(xScale * (j+1)); int y = y0 - (int)(yScale * data[j]); g2.fillOval(x-2, y-2, 4, 4); } } public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().add(new PlotTest()); f.setSize(400,400); f.setLocation(200,200); f.setVisible(true); } }
Java Timer
A Java system timer that measures execution time of a loop in milliseconds.
public class Timer{ public static void main(String[] args) { final long startTime = System.currentTimeMillis(); for (int i = 0; i < 5; i++) { //Do something } final long endTime = System.currentTimeMillis(); System.out.println("Total execution time: " + (endTime - startTime) ); } }
Ultrasonic Sensor HC-SR04 Sample Code
Sample rangefinding code for the HC-SR04 ultrasonic sensor.
Code borrowed from this Instructable.
#define trigPin 13 #define echoPin 12 void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; Serial.print(distance); Serial.println(" cm"); delay(500); }
/* HC-SR04 Ping distance sensor] VCC to arduino 5v GND to arduino GND Echo to Arduino pin 13 Trig to Arduino pin 12 Red POS to Arduino pin 11 Green POS to Arduino pin 10 560 ohm resistor to both LED NEG and GRD power rail More info at: http://goo.gl/kJ8Gl Original code improvements to the Ping sketch sourced from Trollmaker.com Some code and wiring inspired by http://en.wikiversity.org/wiki/User:Dstaub/robotcar */ #define trigPin 13 #define echoPin 12 #define led 11 #define led2 10 void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(led, OUTPUT); pinMode(led2, OUTPUT); } void loop() { long duration, distance; digitalWrite(trigPin, LOW); // Added this line delayMicroseconds(2); // Added this line digitalWrite(trigPin, HIGH); // delayMicroseconds(1000); - Removed this line delayMicroseconds(10); // Added this line digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; if (distance &lt; 4) { // This is where the LED On/Off happens digitalWrite(led,HIGH); // When the Red condition is met, the Green LED should turn off digitalWrite(led2,LOW); } else { digitalWrite(led,LOW); digitalWrite(led2,HIGH); } if (distance &gt;= 200 || distance &lt;= 0){ Serial.println("Out of range"); } else { Serial.print(distance); Serial.println(" cm"); } delay(500); }
Java Tetris
A simple Tetris game in Java by DataWraith. Source code can be found here: https://gist.github.com/DataWraith/5236083.
Click here for the piece creator worksheet.
import java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.ArrayList; import java.util.Collections; import javax.swing.JFrame; import javax.swing.JPanel; public class Tetris extends JPanel { private static final long serialVersionUID = -8715353373678321308L; private final Point[][][] Tetraminos = { // I-Piece { { new Point(0, 1), new Point(1, 1), new Point(2, 1), new Point(3, 1) }, { new Point(1, 0), new Point(1, 1), new Point(1, 2), new Point(1, 3) }, { new Point(0, 1), new Point(1, 1), new Point(2, 1), new Point(3, 1) }, { new Point(1, 0), new Point(1, 1), new Point(1, 2), new Point(1, 3) } }, // J-Piece { { new Point(0, 1), new Point(1, 1), new Point(2, 1), new Point(2, 0) }, { new Point(1, 0), new Point(1, 1), new Point(1, 2), new Point(2, 2) }, { new Point(0, 1), new Point(1, 1), new Point(2, 1), new Point(0, 2) }, { new Point(1, 0), new Point(1, 1), new Point(1, 2), new Point(0, 0) } }, // L-Piece { { new Point(0, 1), new Point(1, 1), new Point(2, 1), new Point(2, 2) }, { new Point(1, 0), new Point(1, 1), new Point(1, 2), new Point(0, 2) }, { new Point(0, 1), new Point(1, 1), new Point(2, 1), new Point(0, 0) }, { new Point(1, 0), new Point(1, 1), new Point(1, 2), new Point(2, 0) } }, // O-Piece { { new Point(0, 0), new Point(0, 1), new Point(1, 0), new Point(1, 1) }, { new Point(0, 0), new Point(0, 1), new Point(1, 0), new Point(1, 1) }, { new Point(0, 0), new Point(0, 1), new Point(1, 0), new Point(1, 1) }, { new Point(0, 0), new Point(0, 1), new Point(1, 0), new Point(1, 1) } }, // S-Piece { { new Point(1, 0), new Point(2, 0), new Point(0, 1), new Point(1, 1) }, { new Point(0, 0), new Point(0, 1), new Point(1, 1), new Point(1, 2) }, { new Point(1, 0), new Point(2, 0), new Point(0, 1), new Point(1, 1) }, { new Point(0, 0), new Point(0, 1), new Point(1, 1), new Point(1, 2) } }, // T-Piece { { new Point(1, 0), new Point(0, 1), new Point(1, 1), new Point(2, 1) }, { new Point(1, 0), new Point(0, 1), new Point(1, 1), new Point(1, 2) }, { new Point(0, 1), new Point(1, 1), new Point(2, 1), new Point(1, 2) }, { new Point(1, 0), new Point(1, 1), new Point(2, 1), new Point(1, 2) } }, // Z-Piece { { new Point(0, 0), new Point(1, 0), new Point(1, 1), new Point(2, 1) }, { new Point(1, 0), new Point(0, 1), new Point(1, 1), new Point(0, 2) }, { new Point(0, 0), new Point(1, 0), new Point(1, 1), new Point(2, 1) }, { new Point(1, 0), new Point(0, 1), new Point(1, 1), new Point(0, 2) } } }; private final Color[] tetraminoColors = { Color.cyan, Color.blue, Color.orange, Color.yellow, Color.green, Color.pink, Color.red }; private Point pieceOrigin; private int currentPiece; private int rotation; private ArrayList<Integer> nextPieces = new ArrayList<Integer>(); private long score; private Color[][] well; // Creates a border around the well and initializes the dropping piece private void init() { well = new Color[12][24]; for (int i = 0; i < 12; i++) { for (int j = 0; j < 23; j++) { if (i == 0 || i == 11 || j == 22) { well[i][j] = Color.GRAY; } else { well[i][j] = Color.BLACK; } } } newPiece(); } // Put a new, random piece into the dropping position public void newPiece() { pieceOrigin = new Point(5, 2); rotation = 0; if (nextPieces.isEmpty()) { Collections.addAll(nextPieces, 0, 1, 2, 3, 4, 5, 6); Collections.shuffle(nextPieces); } currentPiece = nextPieces.get(0); nextPieces.remove(0); } // Collision test for the dropping piece private boolean collidesAt(int x, int y, int rotation) { for (Point p : Tetraminos[currentPiece][rotation]) { if (well[p.x + x][p.y + y] != Color.BLACK) { return true; } } return false; } // Rotate the piece clockwise or counterclockwise public void rotate(int i) { int newRotation = (rotation + i) % 4; if (newRotation < 0) { newRotation = 3; } if (!collidesAt(pieceOrigin.x, pieceOrigin.y, newRotation)) { rotation = newRotation; } repaint(); } // Move the piece left or right public void move(int i) { if (!collidesAt(pieceOrigin.x + i, pieceOrigin.y, rotation)) { pieceOrigin.x += i; } repaint(); } // Drops the piece one line or fixes it to the well if it can't drop public void dropDown() { if (!collidesAt(pieceOrigin.x, pieceOrigin.y + 1, rotation)) { pieceOrigin.y += 1; } else { fixToWell(); } repaint(); } // Make the dropping piece part of the well, so it is available for // collision detection. public void fixToWell() { for (Point p : Tetraminos[currentPiece][rotation]) { well[pieceOrigin.x + p.x][pieceOrigin.y + p.y] = tetraminoColors[currentPiece]; } clearRows(); newPiece(); } public void deleteRow(int row) { for (int j = row-1; j > 0; j--) { for (int i = 1; i < 11; i++) { well[i][j+1] = well[i][j]; } } } // Clear completed rows from the field and award score according to // the number of simultaneously cleared rows. public void clearRows() { boolean gap; int numClears = 0; for (int j = 21; j > 0; j--) { gap = false; for (int i = 1; i < 11; i++) { if (well[i][j] == Color.BLACK) { gap = true; break; } } if (!gap) { deleteRow(j); j += 1; numClears += 1; } } switch (numClears) { case 1: score += 100; break; case 2: score += 300; break; case 3: score += 500; break; case 4: score += 800; break; } } // Draw the falling piece private void drawPiece(Graphics g) { g.setColor(tetraminoColors[currentPiece]); for (Point p : Tetraminos[currentPiece][rotation]) { g.fillRect((p.x + pieceOrigin.x) * 26, (p.y + pieceOrigin.y) * 26, 25, 25); } } @Override public void paintComponent(Graphics g) { // Paint the well g.fillRect(0, 0, 26*12, 26*23); for (int i = 0; i < 12; i++) { for (int j = 0; j < 23; j++) { g.setColor(well[i][j]); g.fillRect(26*i, 26*j, 25, 25); } } // Display the score g.setColor(Color.WHITE); g.drawString("" + score, 19*12, 25); // Draw the currently falling piece drawPiece(g); } public static void main(String[] args) { JFrame f = new JFrame("Tetris"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(12*26+10, 26*23+25); f.setVisible(true); final Tetris game = new Tetris(); game.init(); f.add(game); // Keyboard controls f.addKeyListener(new KeyListener() { public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_UP: game.rotate(-1); break; case KeyEvent.VK_DOWN: game.rotate(+1); break; case KeyEvent.VK_LEFT: game.move(-1); break; case KeyEvent.VK_RIGHT: game.move(+1); break; case KeyEvent.VK_SPACE: game.dropDown(); game.score += 1; break; } } public void keyReleased(KeyEvent e) { } }); // Make the falling piece drop every second new Thread() { @Override public void run() { while (true) { try { Thread.sleep(1000); game.dropDown(); } catch ( InterruptedException e ) {} } } }.start(); } }