This is a stand-alone Arduino compatible ATmega328P microcontroller programmed to power a release device (electromagnet?) until the timer ends. The prototype only has an LED indicator for output at this time since the magnets are on order from China. The display is either 10 LEDs (5 for minutes, 5 for hours) or an Adafruit.com display module.
The wiring is fairly simple (especially if you use the display module). Wiring diagram will be provided in the future. The prototype uses a USB cord from a USB battery for power. Four buttons (stop, hours, minutes, start) wired from ground to their respective input pin provide the input. A pull-up resistor to VCC (+5V power) is recommended especially if the buttons are wired away from the circuit board. LEDs are wired from ground to their output pins through a resistor (should be 510 ohm, the prototype is stupid bright with 330 ohms). The display just needs +/- power and 2 data pins. Wire the output through a MOSFET transistor. That is all.
The code is as follows:
Code: Select all
/* This timer is to time an electromagnet release.
This version uses the LEDs for the remaining time.
*/
#include <Wire.h> // Enable this line if using Arduino Uno, Mega, etc.
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
Adafruit_7segment matrix = Adafruit_7segment();
byte hr = 0;
byte mi = 10;
byte sec = 0;
byte start = 0;
byte inByte;
#define OUT 11 // Change in future versions
#define H 4
#define M 6
#define START 8
#define STOP 2
#define M1 10
#define M2 9
#define M3 7
#define M4 5
#define M5 3
#define H1 12
#define H2 A0
#define H3 A1
#define H4 A2
#define H5 A3
int BB = 300;
long interval = 1000; // interval at which to blink (milliseconds)
long previousMillis = 0; // will store last time LED was updated
int ledState = HIGH;
const int ledPin = 13; // the number of the LED pin
bool displayFlag = true;
volatile byte displayValue [4] = {0,0,0,0};
// Set to true to display time in 12 hour format, or false to use 24 hour:
byte TIME_24_HOUR = true;
void setup() {
Serial.begin(9600);
matrix.begin(0x70);
pinMode(ledPin, OUTPUT);
pinMode(OUT, OUTPUT);
pinMode(H1, OUTPUT);
pinMode(H2, OUTPUT);
pinMode(H3, OUTPUT);
pinMode(H4, OUTPUT);
pinMode(H5, OUTPUT);
pinMode(M1, OUTPUT);
pinMode(M2, OUTPUT);
pinMode(M3, OUTPUT);
pinMode(M4, OUTPUT);
pinMode(M5, OUTPUT);
dtest();
digitalWrite(H, HIGH);
digitalWrite(M, HIGH);
digitalWrite(START, HIGH);
digitalWrite(STOP, HIGH);
}
void loop() {
check_buttons();
mills();
Display();
}
void check_buttons() {
int hb = digitalRead(H);
int mb = digitalRead(M);
int startb = digitalRead(START);
int stopb = digitalRead(STOP);
if(stopb == LOW && start != 0)
ESTOP();
else if(startb == LOW && start == 0) {
startt();
}
else if(hb == LOW && mb == LOW && start == 0) {
hr = 0;
mi = 0;
sec = 0;
ttime();
delay(BB);
}
else if(hb == LOW && start == 0) {
hr ++;
if(hr > 99) // Change to number of hour LEDs
hr = 0;
delay(BB);
ttime();
}
else if(mb == LOW && start == 0) {
mi = mi + 10;
if(mi > 50)
mi = 0;
delay(BB);
ttime();
}
else if(stopb == LOW && start == 0) {
sec = sec + 30;
if(sec > 30)
sec = 0;
delay(BB);
ttime();
}
}
void mills() {
// clock function
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
cerial();
// save the last time you blinked the LED
previousMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(ledPin, ledState);
if(start != 0)
sec --;
ttime();
display_update();
displayFlag = true;
}
}
void ESTOP() {
digitalWrite(OUT, LOW);
start = 0;
hr = 0;
mi = 0;
sec = 0;
dtest();
delay(5000);
}
void startt() {
start = 1;
long x = sec * 1000;
sec = 0;
ttime();
delay(x);
digitalWrite(OUT, HIGH);
}
void ttime() {
if(hr <= 0 && mi <= 0 && sec <= 0 && start == 1)
ESTOP();
else if(sec > 59) {
if(mi > 0) {
mi --;
sec = 59;
}
else if (hr > 0 && mi == 0) {
hr --;
mi = 59;
sec = 59;
}
}
if(hr == 0) {
digitalWrite(H1, LOW);
digitalWrite(H2, LOW);
digitalWrite(H3, LOW);
digitalWrite(H4, LOW);
digitalWrite(H5, LOW);
}
else if(hr == 1) {
digitalWrite(H1, HIGH);
digitalWrite(H2, LOW);
digitalWrite(H3, LOW);
digitalWrite(H4, LOW);
digitalWrite(H5, LOW);
}
else if(hr == 2) {
digitalWrite(H1, HIGH);
digitalWrite(H2, HIGH);
digitalWrite(H3, LOW);
digitalWrite(H4, LOW);
digitalWrite(H5, LOW);
}
else if(hr == 3) {
digitalWrite(H1, HIGH);
digitalWrite(H2, HIGH);
digitalWrite(H3, HIGH);
digitalWrite(H4, LOW);
digitalWrite(H5, LOW);
}
else if(hr == 4) {
digitalWrite(H1, HIGH);
digitalWrite(H2, HIGH);
digitalWrite(H3, HIGH);
digitalWrite(H4, HIGH);
digitalWrite(H5, LOW);
}
else if(hr == 5) {
digitalWrite(H1, HIGH);
digitalWrite(H2, HIGH);
digitalWrite(H3, HIGH);
digitalWrite(H4, HIGH);
digitalWrite(H5, HIGH);
}
if(mi >= 0 && mi < 10) {
digitalWrite(M1, LOW);
digitalWrite(M2, LOW);
digitalWrite(M3, LOW);
digitalWrite(M4, LOW);
digitalWrite(M5, LOW);
}
else if(mi >= 10 && mi < 20) {
digitalWrite(M1, HIGH);
digitalWrite(M2, LOW);
digitalWrite(M3, LOW);
digitalWrite(M4, LOW);
digitalWrite(M5, LOW);
}
else if(mi >= 20 && mi < 30) {
digitalWrite(M1, HIGH);
digitalWrite(M2, HIGH);
digitalWrite(M3, LOW);
digitalWrite(M4, LOW);
digitalWrite(M5, LOW);
}
else if(mi >= 30 && mi < 40) {
digitalWrite(M1, HIGH);
digitalWrite(M2, HIGH);
digitalWrite(M3, HIGH);
digitalWrite(M4, LOW);
digitalWrite(M5, LOW);
}
else if(mi >= 40 && mi < 50) {
digitalWrite(M1, HIGH);
digitalWrite(M2, HIGH);
digitalWrite(M3, HIGH);
digitalWrite(M4, HIGH);
digitalWrite(M5, LOW);
}
else if(mi >= 50 && mi < 60) {
digitalWrite(M1, HIGH);
digitalWrite(M2, HIGH);
digitalWrite(M3, HIGH);
digitalWrite(M4, HIGH);
digitalWrite(M5, HIGH);
}
}
void dtest() {
matrix.print(0xBEEF, HEX);
matrix.writeDisplay();
digitalWrite(H1, HIGH);
digitalWrite(H2, HIGH);
digitalWrite(H3, HIGH);
digitalWrite(H4, HIGH);
digitalWrite(H5, HIGH);
digitalWrite(M1, HIGH);
digitalWrite(M2, HIGH);
digitalWrite(M3, HIGH);
digitalWrite(M4, HIGH);
digitalWrite(M5, HIGH);
}
void Display() {
if(displayFlag == true) {
displayFlag = !displayFlag;
matrix.writeDisplay();
}
}
void display_update() {
// set display values to the hours and minutes
displayValue [0] = hr/10;
displayValue [1] = hr%10;
displayValue [2] = mi/10;
displayValue [3] = mi%10;
if(displayValue [0] == 0) { // check to see if display value equals 0
matrix.writeDigitRaw(0, displayValue [0]); // blank the digit if zero
}
else { // when greater than zero, write the digit
matrix.writeDigitNum(0, displayValue [0]);
}
matrix.writeDigitNum(1, displayValue [1]);
matrix.writeDigitNum(3, displayValue [2]);
matrix.writeDigitNum(4, displayValue [3]);
}
void cerial() {
//the serial stuff goes here.
// DateTime now = rtc.now(); // Get the time from the RTC IC
Serial.print(hr, DEC);
Serial.print(':');
Serial.print(mi, DEC);
Serial.print(':');
Serial.print(sec, DEC);
Serial.println();
}