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 
;   
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 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();
       }
//============================================
