Pânã
la urmã… tot am fost nevoit sã construiesc montaje electronice, şi sã
renunţ la metodele de lucru vechi (cu smoalã, diluant şi ac de siringã) pentru
cablajul imprimat.Din
mai multe motive, pe care nu le mai povestesc, am ajuns la convingerea ca singurul
mod de lucru civilizat este sa invãţ sã lucrez prin fotocopiere … Si totul trebuia
sã fie “self” şi pe cât posibil, “home made “, cu costuri reduse .
Aveam
nevoie sã pot expune controlat, la luminã
UV cablajul fotosensibil. Mi-am imaginat cã o sã gãsesc uşor pe web un model
gata fãcut! Culmea este cã tot ce am gãsit pe web nu a fost convenabil din diverse şi
variate motive.
Cel mai mult m-a atras varianta de la www.roroid,
dar …. mi-ar fi trebuit un scaner .
Aşa cã am fost nevoit sã îmi fac un
“exponometru “ programabil , cu Arduino Uno, un releu şi o cutie de expunere cu
LED-uri UV.
Tema
de bazã a proiectului :
Un sketch,
"count-down timer”, cu Arduino Uno care sã poatã face urmãtoarele:
- o numãrare
inversã pe un interval de timp, setat in ore, minute, secunde;
-
intrevalul de timp sã poatã fi setat din exterior, cu 3 butoane distincte : h(ore), m(minute), s(secunde);
- în
timpul setãrii sã se poatã reveni asupra oricãrei valori;
- declanşarea
numãrãrii inverse sã se facã independent, din exterior, cu butonul 4. Sã se aprindã LED-urile UV, printr-un releu,
eventual cu alimentare separatã ;
- dupã ce
trece intervalul de timp programat, releul sã stingã LED-urile UV ;
-tot
sistemul sã poatã fi resetat separat (
din al 5-lea buton )
-sã afişeaze în ore, minute, secunde timpul rãmas
pâna la terminarea expunerii;
-în faza
de setare, sã se vadã valorile pe ecranul LCD
;
Am
lucrat cu Arduino Uno v3, pentru încercãri - dupã care am fãcut o placã
consacratã
cu
ATMEGA328 + bootloader Arduino; Am amplasat LCD-ul, releul şi placa de bazã într-o
cutie “de ocazie” şi am cuplat-o la “cutia de expunere” , cum se vede în
imagine.
Am
folosid un LCD- 3 fire , pe care Il aveam disponibil (vezi http://www.roroid.ro/lcd-pe-3-fire/)
.
Am structurat programul pe blocuri, asemãnãtor cu cel de la ( http://www.roroid.ro/aparat-de-expunereuv-bazat-pe-arduino/ ) pentru cã mi-a plãcut cum a fost realizat (l-am şi incercat, fãrã pertea de expunere ). Cel mai greu a fost cã a trebuit sã fac
'de mânã' cablajul pentru placa de bazã !
Nefiind un "mare specialist" în
programare , mi-a luat ceva timp pînã am facut ca totul sã funcţioneze corect
!
Dar, pânã la urmã , merge bine !
/*Cdtimer
.ino */
//……………………………………………………………………………………………//
#include
<Metro.h>
#include
<Wire.h>
#include
<Bounce.h>
#include
<I2CIO.h>
#include
<LCD.h>
#include
<LiquidCrystal.h>
#include
<LiquidCrystal_I2C.h>
#include
<LiquidCrystal_SR.h>
#include
<LiquidCrystal_SR_LCD3.h>
#include
<Bounce.h>
//Se
definesc pini de comunicare pentru LCD
const
int PIN_LCD_STROBE = 4; // pin 4 Arduino
= pin 6 chip
const int PIN_LCD_DATA = 3; // pin 3 Arduino = pin 5 chip
int PIN_LCD_CLOCK = 2; // pin 2 Arduino = pin 4 chip
//initializez
LCD-ul
LiquidCrystal_SR_LCD3
lcd(PIN_LCD_DATA, PIN_LCD_CLOCK, PIN_LCD_STROBE);
//----------------------------------
//functia
pentru scriere pe LCD
void
print_lcd(String text){
lcd.clear();
lcd.print(text.substring(0,16));
}//end print_LCD
Metro
background0 = Metro(5000); // obiect din
clasa Metro
//
are functii: interval(); check();reset();
//-----------------------------------
//
-- setare pini butoane
Bounce
buton1=Bounce(5,5); //pin5 Arduino pin
11 chip debounce pe butonul 1
Bounce
buton2=Bounce(6,5); //pin6 Arduino pin
12 chip debounce pe butonul 2
Bounce
buton3=Bounce(7,5); //pin7 Arduino pin
13 chip debounce pe butonul 3
Bounce
buton4=Bounce(8,5); //pin8 Arduino pin
14 chip debounce pe butonul 4 = start
//--
variabile de lucru --
int
apas_b1=0 ; //retine nr.apasari pe butonul 1
int
apas_b2=0 ; //retine nr.apasari pe butonul 2
int
apas_b3=0 ; //retine nr.apasari pe butonul 3
int
apas_b4=0 ; //retine nr.apasari pe butonul 4
int
hours=0 ; //retine nr de ore
int
hours_lim=24; //ore_limita=24;
int
minutes=0; //retine nr de minute
int
minutes_lim=59; //int minut_limita=59;
int
seconds =0; //retine nr de secunde
int
seconds_lim =59;
int
stare=0;
int
start = 0; // variabila pentru prima rulare a programului
//---------setare
iesiri: ---------------------------------
int
pinAlarm =9; //pin 9 Arduino pin 15 chip - alarma sonora
int
led1Pin = 10; //pin 10 Arduino pin 16 chip LED rosu semnaleaza cowntdown timmer
pornit
int
led2Pin = 13; //pin 13 Arduino pin 19 chip LED verde semnaleaza cowntdown
timmer oprit
int
releuPin = 11; //pin 11 Arduino pin 17 chip = actioneaza releul
//-----functia
Bu1() pt. setare ore
void
Bu1(){
if(buton1.update()){
if(buton1.read()==HIGH){
apas_b1++;
hours = apas_b1-1; // ore= apas_b1-1;
String mesaj="set
ore:";
String mesaj1=mesaj + hours; //mesaj1=mesaj + ore;
//String mesaj2=mesaj1+"
h";
print_lcd(mesaj1);
if(hours == hours_lim){ //if(ore== ore_limita){
apas_b1=0;}
stare=1;
background0.reset();
}
}
}
// end Bu1()
//functia
pentru setare minute
void
Bu2(){
if(buton2.update()){
if(buton2.read()==HIGH){
apas_b2++;
minutes= apas_b2-1;
String mesaj="set.minute:";
String mesaj1=mesaj + minutes; //
String mesaj1=mesaj + minut;
// String mesaj2=mesaj1+"
m";
print_lcd(mesaj1);
if(minutes == minutes_lim){
apas_b2=0;}
stare=1;
background0.reset();
}
}
}
//--end Bu2
//-----------functia
pentru setare secunde--------
void
Bu3(){
if(buton3.update()){
if(buton3.read()==HIGH){
apas_b3++;
seconds= apas_b3-1;
String
mesaj="set.secunde:";
String mesaj1=mesaj + seconds;
//String mesaj2=mesaj1+"
s";
print_lcd(mesaj1);
if(seconds== seconds_lim){ //
if(minut== minut_limita){
apas_b3=0;}
stare=1;
background0.reset();
}
}
}
//-------------------------------------------
//--functia
pentru start count down timer
void
Bu4(){
if(buton4.update()){
if(buton4.read()== HIGH ){
if(hours == 0 &&
minutes == 0 && seconds == 0){ //daca nu au fodt facute setari
lcd.clear();
print_lcd("seteaza
timpul!");
digitalWrite(led1Pin,
LOW);// rosu stins
digitalWrite(led2Pin,
HIGH); // verde aprins
background0.reset();
}else{
//aici comenzi pe LED-uri
lcd.clear();
digitalWrite(led1Pin,
HIGH);// rosu aprins
digitalWrite(led2Pin,
LOW); // verde stins
digitalWrite(releuPin,
HIGH); // releu pornit
countdown(); // apeleaza numararea inversa
}
}
}
}
//----------------------------------
//
--- functia Afis()-- pentru afisarea datelor setate
void
Afis(){
if(stare == 1){
String mesaj= "timp: ";
String mesaj1= mesaj + hours; // String mesaj1= mesaj + ore;
String mesaj2= mesaj1+"h:";
String mesaj3= mesaj2 + minutes +
"m:"; // String mesaj3= mesaj2 + minut + "m:";
String mesaj4= mesaj3 + seconds +
"s";
print_lcd(mesaj4);
stare=0;
}
}//---end
Afis()
//----------------------------------
void
initializare(){
print_lcd("Gata
pt.setare");
}
//----------------------------------
void
setup() {
Serial.begin(9600);
pinMode(led1Pin, OUTPUT); //pin pentru LED rosu
pinMode(led2Pin, OUTPUT); //pin pentru LED verde
pinMode(pinAlarm, OUTPUT); //pin-ul pentru alarma sonora
pinMode(releuPin, OUTPUT);
lcd.begin(16,2); //define the LCD display. 16columns, 2 rows
}
//============================================================
//de
aici , codul pentru contorul de timp si trigger-ul de final
void
countdown(){ // numara in jos; cind
ajunge la 0 baga text
lcd.setCursor(2,0);
lcd.print("timp ramas:");
while (hours > 0 || minutes > 0 ||
seconds >=0) { //aici as baga o
modificare
lcd.setCursor(4, 1);
(hours < 10) ? lcd.print("0") :
NULL;
lcd.print(hours);
lcd.print(":");
(minutes < 10) ? lcd.print("0") :
NULL;
lcd.print(minutes);
lcd.print(":");
(seconds < 10) ? lcd.print("0") :
NULL;
lcd.print(seconds);
lcd.display();
stepDown();
delay(1000);
}
}
void
stepDown(){
if (seconds > 0) {
seconds -= 1;
} else {
if (minutes > 0) {
seconds = 59;
minutes -= 1;
} else {
if (hours > 0) {
seconds = 59;
minutes = 59;
hours -= 1;
} else {
trigger();
}
}
}
}
void
trigger() {
lcd.clear(); // clears the screen and buffer
lcd.setCursor(1, 0); // set timer position on
lcd for bomb.
lcd.println(" declansat!");
lcd.display();
digitalWrite(led1Pin, LOW); //rosu stins
digitalWrite(led2Pin, HIGH); // verde aprins
//digitalWrite(releuPin, HIGH);
digitalWrite(releuPin, LOW); // releu oprit;
beep();
//===============================
alarma sonora
}
// aici se termina comtorul-down + alarma
void
beep(){
tone(9, 1000, 200);
delay(200);
noTone(9);
delay(200);
}
//=====================================================
//aici
incepe programul de lucru
void loop(){
//cum folosesc functia print_lcd(String,
text))
if (background0.check()==1){
Afis();
}
if (start == 0){
start = 1;
print_lcd("initializare");
delay(1000);
initializare();
}
digitalWrite(led1Pin, LOW);// rosu stins
digitalWrite(led2Pin, HIGH); // verde
aprins
digitalWrite(releuPin, LOW); // releu
oprit
Bu1();
Bu2();
Bu3();
Bu4();
}
//============================================