-
Notifications
You must be signed in to change notification settings - Fork 0
/
Vibratory-Tumbler.ino
202 lines (156 loc) · 5.08 KB
/
Vibratory-Tumbler.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
/*
Vibratory-Tumbler v1.1
Arduino code for a time-controlled vibratory tumbler.
This project use the following electronic components:
- 1 x Arduino UNO / Nano v3
- 4 x push-button
- 1 x TM1637 IC (4 digit 7 segment display)
- 1 x relay module
- 1 x active buzzer
- 1 x 200 ohm resistor
The circuit:
- Time increase push-button attached to pin 2
- Time decrease push-button attached to pin 3
- Start push-button attached to pin 4
- Pause/Stop push-button attached to pin 5
- TM1637 display attached to pins 7 & 8
- Relay module attached to pin 12
- Buzzer attached to pin 13 through a 200 ohm resistor
Notes:
- The timer scale can be adjusted between minutes/seconds using the SCALE constant.
Created by: Andres Garcia Alves <andres.garcia.alves@gmail.com>
Version 1.0, 2021.05.24 - Initial release.
Version 1.1, 2021.05.25 - Changing pins for better disposition on Arduino Nano.
This source code is licensed under GPL v3.0
*/
#include <TM1637Display.h>
const int PIN_BTN_INCREASE = 2;
const int PIN_BTN_DECREASE = 3;
const int PIN_BTN_START = 4;
const int PIN_BTN_STOP = 5;
const int PIN_DISPLAY_CLK = 7;
const int PIN_DISPLAY_DIO = 8;
const int PIN_RELE = 12;
const int PIN_BUZZER = 13;
const long int SCALE = 60; // 1 = seconds, 60 = minutes
// arrays that turns all segments on/off
const uint8_t segments_all_on[] = {0xff, 0xff, 0xff, 0xff};
const uint8_t segments_all_off[] = {0x00, 0x00, 0x00, 0x00};
// individual segments to spell 'HOLA' word
const uint8_t segments_hola[] = {
SEG_B | SEG_C | SEG_E | SEG_F | SEG_G, // H
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F, // O
SEG_D | SEG_E | SEG_F, // L
SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G // A
};
// create display object of type TM1637Display
// e.g. #01: display.showNumberDec(24, false, 2, 0);
// e.g. #02: display.showNumberDecEx(countdown, 0b11100000, false, 4, 0);
// e.g. #03: display.setSegments(segments_celsius, 2, 2);
TM1637Display display = TM1637Display(PIN_DISPLAY_CLK, PIN_DISPLAY_DIO);
// variables to stores countdown timer
int countdown = 30;
bool countdown_enabled = false;
unsigned long int countdown_next_milis = 0;
// variables to store the push-buttons readed value
int btnIncreaseState = 0;
int btnDecreaseState = 0;
int btnStartState = 0;
int btnStopState = 0;
// functions declaration
int convertToTimelyNumber(int countNumber);
void setBeep(int frecuency = 450, int duration = 40);
void setRele(bool status);
void timeoutBlinkSecuence();
void setup() {
// Serial.begin(9600);
// Serial.println();
pinMode(PIN_BTN_INCREASE, INPUT_PULLUP);
pinMode(PIN_BTN_DECREASE, INPUT_PULLUP);
pinMode(PIN_BTN_START, INPUT_PULLUP);
pinMode(PIN_BTN_STOP, INPUT_PULLUP);
pinMode(PIN_BUZZER, OUTPUT);
pinMode(PIN_RELE, OUTPUT);
display.clear();
display.setBrightness(2);
delay(1000);
}
void loop() {
// read the state of push-buttons
btnIncreaseState = digitalRead(PIN_BTN_INCREASE);
btnDecreaseState = digitalRead(PIN_BTN_DECREASE);
btnStartState = digitalRead(PIN_BTN_START);
btnStopState = digitalRead(PIN_BTN_STOP);
// check if the push-buttons are pressed
if (btnIncreaseState == LOW) {
countdown = countdown + 10;
setBeep();
delay(100);
}
if (btnDecreaseState == LOW) {
countdown = countdown - 10;
if (countdown < 0) { countdown = 0; }
setBeep();
delay(100);
}
if (btnStartState == LOW && countdown > 0) {
countdown_next_milis = millis() + (SCALE * 1000);
countdown_enabled = true;
setBeep();
setRele(true);
delay(100);
}
if (btnStopState == LOW) {
if (countdown_enabled == true) {
countdown_enabled = false;
setRele(false);
} else { // countdown_enabled == false
countdown = 0;
}
setBeep();
delay(100);
}
// countdown calculations
if (countdown_enabled == true && countdown > 0) {
if (millis() > countdown_next_milis) {
countdown_next_milis = countdown_next_milis + (SCALE * 1000);
countdown = countdown - 1;
}
}
if (countdown_enabled == true && countdown == 0) {
countdown_enabled = false;
setRele(false);
timeoutBlinkSecuence();
}
// print count down
// params: number to display, ':' simbol, fill with zeros, digits to use (right->left), position (0,1,2,3)
int timelyCountdown = convertToTimelyNumber(countdown);
display.showNumberDecEx(timelyCountdown, 0b11100000, false, 4, 0);
delay(100);
}
int convertToTimelyNumber(int countNumber) {
int hours = countNumber / 60;
int remainder = countNumber % 60;
return hours * 100 + remainder;
}
void setBeep(int frecuency, int duration) {
tone(PIN_BUZZER, frecuency); // send 450Hz sound signal
delay(duration);
noTone(PIN_BUZZER); // stop sound
}
void setRele(bool status) {
if (status == true) {
digitalWrite(PIN_RELE, HIGH);
} else {
digitalWrite(PIN_RELE, LOW);
}
}
void timeoutBlinkSecuence() {
for (int i = 0; i < 4; i++) {
display.setSegments(segments_all_off, 4, 0);
delay(300);
display.showNumberDecEx(0, 0b11100000, false, 4, 0);
setBeep();
delay(300);
}
}