sâmbătă, 5 septembrie 2015

Am crezut cã este uşor de programat ATTiny85 ….

Cu ideea din titlu, am cumpãrat 4 buc ATTiny 85  neştiind cã  Arduino  IDE trebuie upgradat pentru a putea programa şi acest microcontroller. Am fost nevoit sã mã  "cultiv" din nou pe internet.....
 Arduino IDE trebuie complectat pentru programare  ATTiny 85 cu cîteva fişiere.  O bibliografie bunã şi accesibilã cu ce şi cum se face am gãsit pe siteul :

Pentru cã  pinii lui ATTiny85, precum  şi pinii soclului sânt scurţi şi nu fac contacte sigure pe placa de încercãri (am constatat asta la primele încercãri ) am fãcut o placã –PCB-) care sã aibã:
- conector pentru programare SPI;
- conectori pentru legãturi exterioare;
Nu m-am mai complicat sã schimb frecvenţa de funcţionare , am renunţat la  quarţ , şi lucrez pe 1Mhz.

PCB ATTiny 85

Semnificaţie pini ATTiny 85




Pinii mapaţi în libraria ATTiny (cu culoare violet/verde în poza de sus) sint : 




Pentru cã  pinii lui ATTiny85, precum  şi pinii soclului sânt scurţi. La primele încercãri am constatat cã ei nu fac contacte sigure pe placa de incercare.A trebuit sã fac o placã dedicatã ATTiny85  care sã aibã:
 - conecor pentru programare SPI;
- conectori pentru legãturi exterioare;
Nu m-am mai complicat sã schimb frecvenţa de funcţionare , am renunţat la  quarţ , şi lucrez pe 1Mhz.
Schema PCB: 


Desen cablaj:

Dupã ce am fãcut toate adaptãrile, am cuplat montajul la programatorul  USBTinyIsp, şi am încãrcat sketch-ul BlinkTiny.ino




Nota:
 - am fãcut download din https://code.google.com/p/arduino-tiny/downloads/list poziţia arduino-tiny-0150-020.zip si am dezarhivat-o într-un director, pe un stik ;  am deschis fişierul Readmy.txt şi am parcurs pas cu pas instructiunile, adicã: în directorul unde sint salvate  programele din Arduino IDE (a se vedea locaţia acestuia din  meniul File ->Preferences :


Apoi, trebuie creat directorul “hardware” , unde am copiat fişierele dezarhivate, şi am fãcut fişierul boards.txt : 
      C:\.................................\Arduino\hardware\tiny\license.txt
      C:\.................................\Arduino\hardware\tiny\Prospective Boards.txt
      C:\.................................\Arduino\hardware\tiny\README
      C:\.................................\Arduino\hardware\tiny\bootloaders\
      C:\..................................\Arduino\hardware\tiny\cores\

In plus , am mai fãcut download  de la    aceeaşi  adresã  pentru fişierul tiny-isp-2-0100-0001.zip pe care l-am dezarhivat, într-un director denumit TinyIsp în locatia unde pãstreazã Arduino IDE programele salvate.Acest fişier  (echivalentul lui Arduino ISP din Arduino IDE) transforma Arduino Uno in programator pentru ATTiny .
L-am uloadat pe Arduino Uno , şi  am fãcut conexiunile cu ATTiny 85 . 
Cu încercãrile terminate , am mai fãcut  cîteva etichete pe bord, ca utilizarea sã  fie mai usoarã  














marți, 1 septembrie 2015

Afisaj LDC cu interfata I2c si senzor brick LM50 !

 Am vrut sã scap de cablarea cu fire multe dintre LCD şi Arduino şi mi-am propus sã fac o aplicaţie cu interfaţa I2C. 
 Toate bune şi frumoase , pânã am instalat librãria LiquidCrystal_I2C  şi am constatat cã existã diferenţe faţã de LiquidCrytsal .

Am încercat exemplele “CustomChars.ino” şi “Hello World.ino” din LiquidCrystal_I2C; 
Apoi , am încercat  sã adaptez la I2C  şi exemplele din LiquidCrystal, ca sã mã familiarizez  cu modul de lucru.
Si pentru cã aveam un senzor LM50, am trecut la încercãri.
Ca întotdeauna, am cãutat mai întîi pe modele lucrate de  altcineva  – mi-am zis cã e mai comod.
Am gãsit un exemplu pe:
l-am încercat cu afişare pe SerialMonitor  şi apoi l-am modificat  la afişarea pe LCD I2C.

Cea mai buna bibliografie, pentru explicarea algoritmului 
şi calculelor matematice este pe  site-ul :
ttp://users.utcluj.ro/~rdanescu/pmp-c08.pdf  pagina 31.Tot de aici am preluat şi inaginea paginii 31, cu caracteristicile senzorului LM50 :



............................................................................................................................................
Conexiuni
De la modulul I2c, pinul  SDA  la pinul  A4 de la Ardu Uno
De la modulul I2c , pinul SCL la pinul A5 Ardu Uno
De la Brickul LM50, pinul Out la pinul A0  Ardu Uno

GND – este comun ; Vcc la +5v, comun
............................................................................................................................................

Codul modificat şi complectat (am blocat afişarea pe Serial Monitor ) este redat mai jos :
//…………………………………
//temperaturaC_I2C.ino
//…………………………………
#include <Wire.h>
#include <LiquidCrystal_I2C.h>   
// cu senzor brick LM 50
// am plecat de la schita de pe Robofun cu LM50 si
//http://users.utcluj.ro/~rdanescu/pmp-c08.pdf  pagina 31
//  am adaugat cod pentru afisare pe LCD I2C 16x2
//.......................................
LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup(){
 // Serial.begin(9600);
     lcd.init();                      // initialize the lcd
     lcd.backlight(); 
    // Print a message to the LCD.
     lcd.print("Temperatura: ");  
}

void loop(){
 Serial.print("Temperatura: ");
  float temperatura = readTempInCelsius(10,0); //apeleaza functia, cu 10 citiri pe pinul analg A0)
// functia returneaza media a 10 citiri succesive
lcd.setCursor(0,1);
lcd.print(temperatura);
lcd.setCursor ( 6, 1 ); // sare pe linia 2
lcd.print((char)223); // Tipareste cerculetul de la grade Celsius  pe linia 2
lcd.setCursor ( 7, 1 ); // sare pe linia 2
lcd.print("C");
 // Serial.print(temperatura);
 // Serial.print("  ");
  //Serial.write(176);
  //Serial.println("C");
  //delay(200);
  delay(1000);
}

// functia pentru citirea temperaturii , referinte :http://www.robofun.ro/senzor-temperatura-brick
//http://users.utcluj.ro/~rdanescu/pmp-c08.pdf exemplu pagina 31
float readTempInCelsius(int count, int pin) { //unde count= numarul de citiri; la pin-ul specigicat-0
       
        float sumaTemperatura;
        for (int i =0; i < count; i++) { // pentru i de la 1  la 10
            int reading = analogRead(pin);  // citeste pinul analog 0
            float voltage = reading * 5.0;  // 5 este rezolutia la tensiunea de referinta 5V pt Arduino Uno
            voltage /= 1024.0; // imparte la rezolutie senzor
            float temperatureCelsius = (voltage - 0.5) * 100 ; //scade deplasament
            sumaTemperatura = sumaTemperatura + temperatureCelsius;
            }
          return sumaTemperatura / (float)count; //calculeaza media
          }


Succes la cine doreşte sã  încerce !





























vineri, 28 august 2015

Primul PCB… cu fotocopiere !









De fapt , mi-am propus sã lucrez cu  un grup de 4 module LED 8x8 - Max  7219 , pe care sã le  cuplez la Arduino Uno (le-am cumparat on-line, la un preţ convenabil – 16 lei /1 buc – probabil lichidare de stoc).






Apoi, am început sã încerc diverse programe – bineînţeles, dupa tutoriale, exemple şi aplicaţii de pe net.
Am plecat de la un modul, şi am ajuns  pâna la 4 module. Pânã la urmã , cel mai potrivit tutorial a fost de la  http://nicuflorica.blogspot.ro/2015/08/afisaj-matriceal-din-8x8-leduri.html ( are şi nişte link-uri utile pe blog !) – aşa cã am sã scriu numai despre  problemele pe care le-am avut. Bineînţeles - matricile mele fiind “made in China” soclurile nu prea erau egale. In final , a trebuit sã dau jos matricile din socluri şi sã le ajustez, ca sã le pot alinia
………………………………………………………………..
Notã: Am pus şi poza modulului, şi a matricei cu LED-uri
Pe parcurs, am fost nevoit sã scot matricea din soclul placii , şi … mi-a pus probleme sã gãsesc pozitia corectã ( nu mi-a dat prin cap sã marchez un semn comun pentru matrice şi pentru soclu atunci câd le-am desfãcut !)
…………………………………………………………………………………………………………..  Dupã ce am tot montat o pãdure de cabluri, (care se mai  deconecteazã accidental) am zis cã trebuie sã fac totuşi o placã de bazã. Sã scap de mulţimea de sârme şi sã aliniez modulele! 
Am rezolvat dotarea tehnicã pentru fotocopiere prin sistem"home-made" ( temporizator + cutie cu LED-uri UV ) şi  am fost nevoit sã ânvãţ sã lucrez cu Eagle.
  Nu mai povestesc ce şi cum – dar a fost nasol pînã am prins mişcarea cum sã gãsesc piesele prin librãrii. Cu toate tutorialele de pe net, nu am gãsit nimic “antiprost” sau … mai blînd spus pentru novici !
Ce a ieşit, urmeazã mai jos:
1. Schema In Eagle :
4 - 8x8 dot MATRIX with MAX 7219

2. PCB-ul :
 

3.Stratul “top” , pentru imprimanta laser :




 
Si de aici , a inceput lipsa de experienţã :
-imprimanta mea laser , este un “second hand” . Ca urmare, pe folia transparentã au aparut defecte ( pişcãturi ). Am corectat defectele cu CD marker, şi marker “edding400” .Atenţie – daca e cãldura mare (cum a fost luna august) markerul “edding400” se usuca prea repede, nu poţi face corecturi.
 Daca e mai rãcoare, urma neagrã lãsatã de edding400 e “mai neagra” decit cea lãsatã de “CD marker” !
A trebuit sã refac de multe ori mişcarea asta, pânã când am retuşat corect folia !
Chiar şi la imprimanta laser nouã, mai apar urme – de la praf / zgãrieturi pe tamburul cu seleniu sau de la rolele imprimantei  – şi tre fãcutã corecţia .
Atenţie şi la rezoluţia setatã. Eagle scoate fişierul în formatul  pdf. La inprimantã , tre setatã scara 1:1,  printat pe o foaie A4 şi verificat fizic dacã pinii pieselor se  potrivesc cu gãurile din desen.
N-am facut treaba asta , şi am luat un bobîrnac. Dupã ce am fãcut corodarea, placa a fost cu distanţa dintre gãuri mai micã şi modulele nu au încãput pe ea. ( am printat folia la cineva , cu imprimanta nouã –şi n-am mai fãcut verificarea asta !).
In fine – dupã toate treburile astea, care m-au cam desumflat de multe ori , am scos o folie buna pentru fotocopiere.
Apoi , a urmat execuţia si vopsirea plãcii.
 Lucrul dracului la uşa sãracului. Am tãiat placa de sticlotex, am curãţat-o ch şmirghel de 600, am spãlat-o cu spirt şi diluant.
 La vopsirea cu lac ( Positiv 20 - spray ):
- de la orice distanţã am încercat sã aplic lacul, apare efectul de “coaja de portocalã” cu multe puncte şi punctişoare unde lacul este subţire;
-incontestabil, orice am fãcut, la marginile plãcii de sticlotex , stratul depus este mai gros decât în orice alt loc de pe plãcuţã;
- este adevãrat cã dacã placuţa stã pe masã perfect orizontalã, stratul de lac fotosensibil are tendinţa sã se uniformizeze ca grosime, mai puţin la marginile plãcii ;
- la developare , grosimea stratului de lac nu este aşa de importantã, dar uniformitatea grosimii stratului este foarte importantã;
- foarte important, este ca dupa aplicarea lacului, imediat sa pui placuta intr-o cutie de tablã inchisã – lacul atrage firele de praf din aer care se lipesc şi compromit calitatea stratului de lac ; am fost contrariat de apariţia subitã a firelor de praf/scame , chiar şi dupã ce am lucrat în baie , unde n-am textile şi surse de praf şi scame;
- am  pus cutia la soare, şi aproximativ  intr-o orã s-a uscat bine; am încercat uscarea pe talpa fierului de cãlcat (când ploua afarã) , undeva reglat pentru matase – şi uscarea a durat cam o orã ;
-la expunere, a trebuit sã pun o bucatã de sticlã peste folia transparentã, pentru ca aceasta sã stea “lipitã” de plãcuţa de sticlotex In timpul expunerii; dacã am nimerit o placa de sticlotex curbatã, am prins cu marginile unor pioneze pachetul sticlotex+folie+ sticlã; nu merge sa prinzi cu scoci pe capete, ca face burta la mijloc si traseele nu mai ies bine;  
- la expunere UV, dupã încercãri, am ajuns la un timp de 7minute şi 20 secunde  pâna la 7 minute şi 30 de secunde;
- la developat am folosit initial soda causticã, dar cu dozajul la “linguriţã”, soluţia a ieşit prea concentratã şi când am bagat plãcuţa la developat , în 3 secunde , s-a dus tot stratul de lac – expus neexpus la UV ! Prin încercãri , am diluat soluţia.
Am folosit şi plãcuţa de cablaj fotosensibilã din fabricaţie (comerţ ) şi am avut aceleaşi eşecuri- cu toate tutorialele de pe internet !  
Sînt convins cã e importantã şi distanţa de la sursa de raze UV şi placa fotosensibilã- şi asta diferã de la o instalaţie la alta(la mine este cam 25-30 mm).Trebuie fãcute încercãri pentru stabilirea timpului de expunere .
Acum , la developare folosesc pliculeţe tarate din comert pentru 500 ml soluţie , şi este mult mai bine.( developer universal pentru Fotorezist pozitiv tip Seno 4007).
 încãperea în care dai cu lac) .
In final, aşa aratã placa mea:
   
 

AM MAI AVUT O PROBLEMA MAJORA – scandalul cu nevasta, deoarece pentru mine, lacul uscat sau neuscat are un pic de miros specific, dar pentru ea … pute al dracului în  casã !
 Adevãrul e cã nu-ţi  mai vine sã stai în încãperea în care dai cu lac! .







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

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