ArduShop.ro

ArduShop.ro
cod tehnic.go.ro_02 reducere 5%, pentru vizitatorii paginilor mele !

miercuri, 14 ianuarie 2015

Modul de afisare cu 8 cifre LED din 7 segmente fiecare controlate de MAX7219 (VI)

   Fata de articolele anterioare, unde aveam reglaj complet la ceasul RTC cu DS1307 dintr-un encoder (folosindu-ma de informatiile de la http://andydoz.blogspot.com/) acum am 3 taste...
   Schema de conectare este similara, deoarece am pastrat conexiunile principale, punand chiat si tastele ca la encoder):
   In modul obisnuit, pe ecranul apar ciclic informatii despre:
- ora:
- data:
- temperatura si umiditate:
   Daca apas scurt pe tasta MENU/NEXT apare pe ecran ID-ul meu "niq_ro":
   Daca apas lung (mai mult de 3 secunde) se intra in modul de reglaj:
- an:
- luna:
- zi:
- ora:
- minut:
   Am facut si 2 filmulete:
   Sketch-ul folosit de mine este:
// adapted sketch by niq_ro from http://arduinotehniq.blogspot.com
// and http://nicuflorica.blogspot.ro
// version 1.0 in 6.11.2014, Craiova - Romanaia
// curent version in 12.1.2015
// source for LEDControl: http://embedded-lab.com/blog/?p=6862
#include "LedControl.h" 
/*
 Now we need a LedControl to work with.
 ***** These pin numbers will probably not work with your hardware *****
 pin 12 is connected to the DataIn 
 pin 11 is connected to the CLK 
 pin 10 is connected to LOAD 
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(12,11,10,1);

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain
#include "DHT.h"
#define DHTPIN A1     // what pin we're connected to A1
// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// if is just sensor:
// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

DHT dht(DHTPIN, DHTTYPE);

// declaration for type of value
int t, h;

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
// original sketck from http://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit/
// add part with SQW=1Hz from http://tronixstuff.wordpress.com/2010/10/20/tutorial-arduino-and-the-i2c-bus/

// Dawn & Dusk controller. http://andydoz.blogspot.ro/2014_08_01_archive.html
// 16th August 2014 - (C) A.G.Doswell 2014

#include <Wire.h>
#include "RTClib.h" // from https://github.com/adafruit/RTClib
#include <LiquidCrystal.h>
//#include <Encoder.h> // from http://www.pjrc.com/teensy/td_libs_Encoder.html

RTC_DS1307 RTC; // Tells the RTC library that we're using a DS1307 RTC
///Encoder knob(2, 3); //encoder connected to pins 2 and 3 (and ground)

//the variables provide the holding values for the set clock routine
int setyeartemp; 
int setmonthtemp;
int setdaytemp;
int sethourstemp;
int setminstemp;
int setsecs = 0;
int maxday; // maximum number of days in the given month
int TimeOut = 10;
int TimeOutCounter;

// These variables are for the push button routine
int buttonstate = 0; //flag to see if the button has been pressed, used internal on the subroutine only
int pushlengthset = 3000; // value for a long push in mS
int pushlength = pushlengthset; // set default pushlength
int pushstart = 0;// sets default push value for the button going low
int pushstop = 0;// sets the default value for when the button goes back high

int knobval; // value for the rotation of the knob
boolean buttonflag = false; // default value for the button flag

byte SW1 = 2;  // switch for down
byte SW2 = 3;  // switch for up

void setup()
{
// Initialize MAX7219 device
lc.shutdown(0,false); // Enable display 
lc.setIntensity(0,3); // Set brightness level (0 is min, 15 is max) 
lc.clearDisplay(0); // Clear display register 
 
// Initialize HTD sensor
dht.begin();

    Wire.begin();
    RTC.begin();
//  if (! RTC.isrunning()) {
    //Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
// }
// part code from http://tronixstuff.wordpress.com/
Wire.beginTransmission(0x68);
Wire.write(0x07); // move pointer to SQW address
//Wire.write(0x10); // sends 0x10 (hex) 00010000 (binary) to control register - turns on square wave
Wire.write(0x13); // sends 0x13 (hex) 00010011 (binary) to control register - turns on square wave at 32kHz
Wire.endTransmission();
// end part code from http://tronixstuff.wordpress.com/

pinMode(A0,INPUT);//push button on encoder connected to A0 (and GND) or MENU/NEXT
digitalWrite(A0,HIGH); //Pull A0 high

 pinMode(SW1, INPUT);  // N.O. push button switch
 pinMode(SW2, INPUT);  // N.O. push button switch

 digitalWrite(SW1, HIGH);
 digitalWrite(SW2, HIGH);

/*
 Serial.begin(9600);
 Serial.println("test for niq_ro");
 Serial.println("------------------");
*/
}

void loop()
{
 // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
h = dht.readHumidity();
// t = dht.readTemperature(); 
  
/* test part  
// test humidity value
h = 37;
// test temperature value
t = 19;
*/

// 
lc.clearDisplay(0); // Clear display register 

for(int j=0; j<300; j++){
temperatura (t);
umiditate (h);

    pushlength = pushlengthset;
    pushlength = getpushlength ();
    delay (10);
    if (pushlength <pushlengthset) {
      ShortPush ();   
    }
       //This runs the setclock routine if the knob is pushed for a long time
       if (pushlength >pushlengthset) {
       lc.clearDisplay(0); // Clear display register 
         DateTime now = RTC.now();
         setyeartemp=now.year(),DEC;
         setmonthtemp=now.month(),DEC;
         setdaytemp=now.day(),DEC;
         sethourstemp=now.hour(),DEC;
         setminstemp=now.minute(),DEC;
         setclock();
         pushlength = pushlengthset;
       };

}


//delay(3000);

lc.clearDisplay(0); // Clear display register 
for(int j=0; j<300; j++){
DateTime now = RTC.now();
int ora0 = now.hour();
int minut0 = now.minute();
int second0 = now.second();
/*
// serial monitor
  Serial.print(now.hour(), DEC);
  Serial.print(":");
  Serial.print(now.minute(), DEC);
  Serial.print(":");
  Serial.print(now.second(), DEC);
  Serial.print(" -> ");
  Serial.print(ora1);
  Serial.println(":");
  Serial.print(minut1);
  Serial.print(":");
  Serial.print(second1);
  Serial.println("------------------");
*/
ora (ora0, minut0, second0);

    pushlength = pushlengthset;
    pushlength = getpushlength ();
    delay (10);
    if (pushlength <pushlengthset) {
      ShortPush ();   
    }
       //This runs the setclock routine if the knob is pushed for a long time
       if (pushlength >pushlengthset) {
         lc.clearDisplay(0); // Clear display register 
         DateTime now = RTC.now();
         setyeartemp=now.year(),DEC;
         setmonthtemp=now.month(),DEC;
         setdaytemp=now.day(),DEC;
         sethourstemp=now.hour(),DEC;
         setminstemp=now.minute(),DEC;
         setclock();
         pushlength = pushlengthset;
       };



//delay (900);
}

t = dht.readTemperature(); // read data for temperature

lc.clearDisplay(0); // Clear display register 
for(int j=0; j<300; j++){
DateTime now = RTC.now();
int ziua0 = now.day();
int luna0 = now.month();
int anul0 = now.year();
/*
// serial monitor
  Serial.print(now.day(), DEC);
  Serial.print(":");
  Serial.print(now.month(), DEC);
  Serial.print(":");
  Serial.print(now.year(), DEC);
  Serial.print(" -> ");
  Serial.print(ziua0);
  Serial.println(".");
  Serial.print(luna0);
  Serial.print(".");
  Serial.print(anul0);
  Serial.println("------------------");
*/
data (ziua0, luna0, anul0);



    pushlength = pushlengthset;
    pushlength = getpushlength ();
    delay (10);
    if (pushlength <pushlengthset) {
      ShortPush ();   
    }
       //This runs the setclock routine if the knob is pushed for a long time
       if (pushlength >pushlengthset) {
         lc.clearDisplay(0); // Clear display register 
         DateTime now = RTC.now();
         setyeartemp=now.year(),DEC;
         setmonthtemp=now.month(),DEC;
         setdaytemp=now.day(),DEC;
         sethourstemp=now.hour(),DEC;
         setminstemp=now.minute(),DEC;
         setclock();
         pushlength = pushlengthset;
       };



//delay (900);
}



}


void umiditate (int umidit)
{
int zu = int(umidit/10); // determin cifra zecilor
int uu = umidit - 10*zu; // determin cifra unitatilor
  
lc.setDigit(0,2,zu, false); // afisez un 5 pe coloana 2
lc.setDigit(0,1,uu, false); // afisez un 0 pe coloana 1
lc.setRow(0,0,B0110111);  // afisez litera "H"
}


void temperatura (int temper)
{
int zt = int(temper/10); // determin cifra zecilor
int ut = temper - 10*zt; // determin cifra unitatilor
  
lc.setDigit(0,7,zt, false); // afisez un 5 pe coloana 7
lc.setDigit(0,6,ut, false); // afisez un 0 pe coloana 1
lc.setRow(0,5,B1100011); // afisez un semn de grad pe coloana 5
lc.setRow(0,4,B1001110); // afisez un C pe coloana 4
}

void ora (int ora1, int minut1, int second1) 
{
// hour
int zo = int(ora1/10); // determin cifra zecilor
int uo = ora1 - 10*zo; // determin cifra unitatilor
if (zo >= 1) lc.setDigit(0,7,zo, false); // afisez zecile de ore pe coloana 7 (in stanga)
lc.setDigit(0,6,uo, false); // afisez unitatile de ore pe coloana 6
lc.setRow(0,5,B0000001);  // afisez o liniuta pe coloana 5
// minutes
int zm = int(minut1/10); // determin cifra zecilor
int um = minut1 - 10*zm; // determin cifra unitatilor
lc.setDigit(0,4,zm, false); // afisez zecile de minute pe coloana 4
lc.setDigit(0,3,um, false); // afisez unitatile de minute pe coloana 3
lc.setRow(0,2,B0000001);  // afisez o liniuta pe coloana 2
// seconds
int zs = int(second1/10); // determin cifra zecilor
int us = second1 - 10*zs; // determin cifra unitatilor
lc.setDigit(0,1,zs, false); // afisez zecile de secunde pe coloana 1
lc.setDigit(0,0,us, false); // afisez unitatile de minute pe coloana 0 (dreapta) 
}

void data (int ziua1, int luna1, int anul1) 
{
// ziua (day)
int zz = int(ziua1/10); // determin cifra zecilor
int uz = ziua1 - 10*zz; // determin cifra unitatilor
if (zz >= 1) lc.setDigit(0,7,zz, false); // afisez zecile de ore pe coloana 7 (in stanga)
lc.setDigit(0,6,uz, true); // afisez unitatile de ore pe coloana 6
//lc.setRow(0,5,B0000001);  // afisez o liniuta pe coloana 5

// luna (mounth)
int zl = int(luna1/10); // determin cifra zecilor
int ul = luna1 - 10*zl; // determin cifra unitatilor
lc.setDigit(0,5,zl, false); // afisez zecile de minute pe coloana 5
lc.setDigit(0,4,ul, true); // afisez unitatile de minute pe coloana 4
//lc.setRow(0,2,B0000001);  // afisez o liniuta pe coloana 2

// anul (year)
int ma = int(anul1/1000); // determin cifra miilor
int rsa = anul1 - 1000*ma; // determin restul sutelor
int sa = int(rsa/100); // determin cifra sutelor
int rza = rsa - 100*sa; // determin restul zecilor
int za = int(rza/10); // determin cifra zecilor
int ua = rza - 10*za; // determin cifra anilor

lc.setDigit(0,3,ma, false); // afisez zecile de secunde pe coloana 3
lc.setDigit(0,2,sa, false); // afisez unitatile de minute pe coloana 2  
lc.setDigit(0,1,za, false); // afisez zecile de secunde pe coloana 1
lc.setDigit(0,0,ua, false); // afisez unitatile de minute pe coloana 0 (dreapta) 
}


//sets the clock
void setclock (){
   setyear ();
lc.clearDisplay(0); // Clear display register 
   setmonth ();
lc.clearDisplay(0); // Clear display register 
   setday ();
lc.clearDisplay(0); // Clear display register 
   sethours ();
lc.clearDisplay(0); // Clear display register 
   setmins ();
lc.clearDisplay(0); // Clear display register 
   
   RTC.adjust(DateTime(setyeartemp,setmonthtemp,setdaytemp,sethourstemp,setminstemp,setsecs));

   delay (1000);
   
}

// subroutine to return the length of the button push.
int getpushlength () {
  buttonstate = digitalRead(A0);  
       if(buttonstate == LOW && buttonflag==false) {     
              pushstart = millis();
              buttonflag = true;
          };
          
       if (buttonstate == HIGH && buttonflag==true) {
         pushstop = millis ();
         pushlength = pushstop - pushstart;
         buttonflag = false;
       };
       return pushlength;
}
// The following subroutines set the individual clock parameters
int setyear () {
//lcd.clear();
//lc.clearDisplay(0); // Clear display register 
//    lcd.print ("Set Year");
lc.setRow(0,7,B0111011);  // afisez litera "y" pe coloane 7 (in stanga de tot)
lc.setRow(0,6,B1101111);  // afisez litera "e" pe coloane 6
lc.setRow(0,5,B1111101);  // afisez litera "a" pe coloane 5
//lc.setRow(0,4,B0000101);  // afisez litera "r" pe coloane 4
lc.setRow(0,4,B10000101);  // afisez litera "r" cu punct jos

    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setyeartemp;
    }

//lc.clearDisplay(0); // Clear display register
    if (!digitalRead(SW1)) { //bit of software de-bounce
      knobval = -1;
       delay(150);
          setyeartemp=setyeartemp + knobval;
    if (setyeartemp < 2014) { //Year can't be older than currently, it's not a time machine.
      setyeartemp = 2014;
    }
    }
    if (!digitalRead(SW2)) {
      knobval = 1;  
       delay(150);
          setyeartemp=setyeartemp + knobval;
    if (setyeartemp < 2014) { //Year can't be older than currently, it's not a time machine.
      setyeartemp = 2014;
    }
    }
 //   setyeartemp=setyeartemp + knobval;
 //   if (setyeartemp < 2014) { //Year can't be older than currently, it's not a time machine.
 //     setyeartemp = 2014;
 //   }
//    lcd.print (setyeartemp);
int zua = setyeartemp - 2000;  // aflu ultimele 2 cifre din an
int za = zua / 10;  // aflu cifra zecilor din an
int ua = zua - 10*za; // aflu cifra unitatilor din an
lc.setDigit(0,3,2, false); // afisez cifra "2" din an pe coloana 3
lc.setDigit(0,2,0, false); // afisez cifra "0" din an pe coloana 2
lc.setDigit(0,1,za, false); // afisez cifra zecilor din an pe coloana 1
lc.setDigit(0,0,ua, false); // afisez cifra unitatilor din an pe coloana 0 (dreapta de tot)
    setyear();
//    delay(150);
}

  
int setmonth () {
//lcd.clear();
//lcd.print ("Set Month");
lc.setRow(0,7,B0110111);  // afisez litera "H" (in loc de "m") pe coloane 7 (in stanga de tot)
//lc.setRow(0,7,B1001111);  // afisez litera "E" (in loc de "m") pe coloane 7 (in stanga de tot)
lc.setRow(0,6,B0011101);  // afisez litera "o" pe coloane 6
lc.setRow(0,5,B0010101);  // afisez litera "n" pe coloane 5
lc.setRow(0,4,B0001111);  // afisez litera "t" pe coloane 4
lc.setRow(0,3,B0010111);  // afisez litera "h" pe coloane 3

    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setmonthtemp;
    }

//    lcd.setCursor (0,1);
   if (!digitalRead(SW1)) { //bit of software de-bounce
      knobval = -1;
      delay(150);
        setmonthtemp=setmonthtemp + knobval;
    if (setmonthtemp < 1) {// month must be between 1 and 12
      setmonthtemp = 1;
    }
    }
    if (!digitalRead(SW2)) {
      knobval = 1;
      delay(150);
      setmonthtemp=setmonthtemp + knobval;
    if (setmonthtemp > 12) {
      setmonthtemp=12;
    }  
    }  
  
 //   lcd.print (setmonthtemp);
 //   lcd.print("  ");
int zl = setmonthtemp / 10;  // aflu cifra zecilor din luna
int ul = setmonthtemp - 10*zl; // aflu cifra unitatilor din luna
lc.setDigit(0,1,zl, false); // afisez cifra zecilor din luna pe coloana 1
lc.setDigit(0,0,ul, false); // afisez cifra unitatilor din luna pe coloana 0 (dreapta de tot)
     setmonth();
}

int setday () {
  if (setmonthtemp == 4 || setmonthtemp == 6 || setmonthtemp == 9 || setmonthtemp == 11) { //30 days hath September, April June and November
    maxday = 30;
  }
  else {
  maxday = 31; //... all the others have 31
  }
  if (setmonthtemp ==2 && setyeartemp % 4 ==0) { //... Except February alone, and that has 28 days clear, and 29 in a leap year.
    maxday = 29;
  }
  if (setmonthtemp ==2 && setyeartemp % 4 !=0) {
    maxday = 28;
  }
//lcd.clear();  
//    lcd.print ("Set Day");
lc.setRow(0,7,B0111101);  // afisez litera "d" pe coloane 7
lc.setRow(0,6,B1111101);  // afisez litera "a" pe coloane 6
lc.setRow(0,5,B0111011);  // afisez litera "y" pe coloane 5

    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setdaytemp;
    }

 //   lcd.setCursor (0,1);
    if (!digitalRead(SW1)) { //bit of software de-bounce
      knobval = -1;
      delay(150);
        setdaytemp=setdaytemp+ knobval;
    if (setdaytemp < 1) {
      setdaytemp = 1;
    }
    }
    if (!digitalRead(SW2)) {
      knobval = 1;  
      delay(150);
        setdaytemp=setdaytemp+ knobval;
    if (setdaytemp > maxday) {
      setdaytemp = maxday;
    }
    } 
  
//    lcd.print (setdaytemp);
//    lcd.print("  "); 
int zz = setdaytemp / 10;  // aflu cifra zecilor din zi
int uz = setdaytemp - 10*zz; // aflu cifra unitatilor din zi
lc.setDigit(0,1,zz, false); // afisez cifra zecilor din zi pe coloana 1
lc.setDigit(0,0,uz, false); // afisez cifra unitatilor din zi pe coloana 0 (dreapta de tot)
    setday();
}

int sethours () {
//lcd.clear();
//    lcd.setCursor (0,0);
//    lcd.print ("Set Hours");
lc.setRow(0,7,B0010111);  // afisez litera "h" pe coloane 7
lc.setRow(0,6,B0011101);  // afisez litera "o" pe coloane 6
lc.setRow(0,5,B0011100);  // afisez litera "u" pe coloane 5
lc.setRow(0,4,B0000101);  // afisez litera "r" pe coloane 4

    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return sethourstemp;
    }

//    lcd.setCursor (0,1);
    if (!digitalRead(SW1)) { //bit of software de-bounce
      knobval = -1;
       delay(150);
        sethourstemp=sethourstemp + knobval;
    if (sethourstemp < 0) {
      sethourstemp = 0;
    }
    }
    if (!digitalRead(SW2)) {
      knobval = 1;
     delay(150);  
    sethourstemp=sethourstemp + knobval;
    if (sethourstemp > 23) {
      sethourstemp=23;
    }
    }
//    lcd.print (sethourstemp);
//    lcd.print("  "); 
int zo = sethourstemp / 10;  // aflu cifra zecilor de ore
int uo = sethourstemp - 10*zo; // aflu cifra unitatilor de ore
lc.setDigit(0,1,zo, false); // afisez cifra zecilor de ora pe coloana 1
lc.setDigit(0,0,uo, false); // afisez cifra unitatilor de ora pe coloana 0 (dreapta de tot)
    sethours();
}

int setmins () {
//lcd.clear();
//   lcd.setCursor (0,0);
//    lcd.print ("Set Mins");
lc.setRow(0,7,B0110111);  // afisez litera "H" (in loc de "m") pe coloane 7 (in stanga de tot)
//lc.setRow(0,7,B1001111);  // afisez litera "E" (in loc de "m") pe coloane 7 (in stanga de tot)    
lc.setRow(0,6,B0010000);  // afisez litera "i" pe coloane 6
lc.setRow(0,5,B0010101);  // afisez litera "n" pe coloane 5
lc.setRow(0,4,B0011100);  // afisez litera "u" pe coloane 4
lc.setRow(0,3,B0001111);  // afisez litera "t" pe coloane 3
//lc.setChar(0,2,'e',true);
lc.setRow(0,2,B11101111);  // afisez litera "e" cu punct jos


    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setminstemp;
    }

//    lcd.setCursor (0,1);
   if (!digitalRead(SW1)) { //bit of software de-bounce
      knobval = -1;
       delay(150);  
         setminstemp=setminstemp + knobval;
    if (setminstemp < 0) {
      setminstemp = 0;
    }
    }
    if (!digitalRead(SW2)) {
      knobval = 1;  
       delay(150);   
    setminstemp=setminstemp + knobval;
    if (setminstemp > 59) {
      setminstemp=59;
    }
    }
//    lcd.print (setminstemp);
//    lcd.print("  ");
int zm = setminstemp / 10;  // aflu cifra zecilor de minute
int um = setminstemp - 10*zm; // aflu cifra unitatilor de minute
lc.setDigit(0,1,zm, false); // afisez cifra zecilor de minute pe coloana 1
lc.setDigit(0,0,um, false); // afisez cifra unitatilor de minute pe coloana 0 (dreapta de tot)
    setmins();
}


void ShortPush () {
  //This displays show something
lc.clearDisplay(0); // Clear display register
for (long Counter = 0; Counter < 10 ; Counter ++) { //returns to the main loop if it's been run 604 times 
                                                 
//  lcd.setCursor (2,0);
//  lcd.print ("Hi, niq_ro!");
lc.setRow(0,6,B1100010);  // afisez litera "n" pe coloane 6
lc.setRow(0,5,B0100000);  // afisez litera "i" pe coloane 5
lc.setRow(0,4,B1110011);  // afisez litera "q" pe coloane 4
lc.setRow(0,3,B0000001);  // afisez semnul "-" pe coloane 3
lc.setRow(0,2,B1000010);  // afisez litera "r" pe coloane 2
lc.setRow(0,1,B1100011);  // afisez litera "o" pe coloane 1
delay(200);
}
lc.clearDisplay(0); // Clear display register
}