marți, 11 august 2015

count down timer

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

//============================================

























Niciun comentariu:

Trimiteți un comentariu