Advertisement
Guest User

moj

a guest
Feb 17th, 2014
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.57 KB | None | 0 0
  1. #include <Wire.h>
  2. #include <OneWire.h>
  3. #include <SPI.h>
  4. #include <SD.h>
  5. #include <LiquidCrystal_I2C.h>
  6. #include <DallasTemperature.h>
  7. #include "RTClib.h"
  8. #include <IRremote.h>
  9. #include "PCF8574.h"
  10. #define ONE_WIRE_BUS 4
  11.  
  12. LiquidCrystal_I2C lcd(0x21,16,2);
  13. RTC_DS1307 RTC;
  14. IRsend irsend;
  15. PCF8574 expander;
  16. char INBYTE;
  17. OneWire oneWire(ONE_WIRE_BUS);
  18. DallasTemperature sensors(&oneWire);
  19. DeviceAddress temp1={0x28, 0x48, 0x08, 0xA1, 0x04, 0x00, 0x00, 0x4C};
  20. DeviceAddress temp2={0x28, 0x7A, 0x8C, 0x9F, 0x03, 0x00, 0x00, 0x3C};
  21. File dataFile;
  22.  
  23. int switchPin = 2;
  24. int BedLed = 9;
  25. int PcLed = A2;
  26. int lcdBacklight = A3;
  27. int photocellPin = 0;    
  28. int photocellReading;
  29. int LuxReading;
  30. int pirPin = 5;
  31. int resolution = 11;
  32. int delayInMillis = 0;
  33. int idle = 0;
  34. int tempMax = 0.0;
  35. int tempMin = 30.0;
  36. int lastTime = -1;
  37. const int chipSelect = 10;
  38. const int batteryPin = 1;
  39. boolean lastButton = LOW;
  40. boolean currentButton = LOW;
  41. unsigned long lastTempRequest = 0;
  42. float temperature1 = 0.0;
  43. float temperature2 = 0.0;
  44. const float referenceVolts = 5.0; //
  45. byte newChar[8] = {B00110, B01001, B01001, B00110, B00000, B00000, B00000, B00000}; //znak stopni
  46.  
  47. int latchPin = 8;
  48. int clockPin =6;
  49. int dataPin = 7;
  50. int segmentSelect[4]= { 1,2,4,8 };  
  51. int seven_seg_digits[10]={ 192,249,164,176,153,146,130,248,128,152 };
  52. long interval = 1000;    
  53. int firstDigit=0;
  54. int secondDigit=0;
  55. int thirdDigit=0;
  56. int fourthDigit=0;
  57. long previousMillis = 0;
  58.  
  59.  
  60. void setup() {
  61.   Serial.begin(19200);
  62.   Wire.begin();
  63.   RTC.begin();
  64.   SD.begin();
  65.   expander.begin(0x20);
  66.   lcd.init();
  67.   pinMode(switchPin, INPUT);
  68.   pinMode(SS, OUTPUT);
  69.   pinMode(BedLed, OUTPUT);
  70.   pinMode(pirPin, INPUT);
  71.   pinMode(PcLed, OUTPUT);
  72.   pinMode(lcdBacklight, OUTPUT);
  73.   pinMode(latchPin, OUTPUT);
  74.   pinMode(clockPin, OUTPUT);
  75.   pinMode(dataPin, OUTPUT);
  76.   for (int i=0; i<8; i++)
  77.   expander.pinMode(i, OUTPUT);
  78.   expander.digitalWrite(4, HIGH);
  79.   sensors.begin();
  80.   sensors.setResolution(temp1, resolution);
  81.   sensors.setResolution(temp2, resolution);
  82.   sensors.setWaitForConversion(false);
  83.   sensors.requestTemperatures();
  84.   delayInMillis = 750 / (1 << (12 - resolution));
  85.   lastTempRequest = millis();
  86.    
  87.   char filename[] = "LOGGER00.CSV";
  88.   for (uint8_t i = 0; i < 100; i++) {
  89.     filename[6] = i/10 + '0';
  90.     filename[7] = i%10 + '0';
  91.     if (! SD.exists(filename)) {
  92.       // only open a new file if it doesn't exist
  93.       dataFile = SD.open(filename, FILE_WRITE);
  94.       break;  // leave the loop!
  95.     }
  96.    }
  97.   dataFile.println("datetime, temp1, temp2");
  98.  
  99.  displayLCDstart();
  100. }
  101.  
  102. void loop() {
  103.  
  104.   if (millis() - lastTempRequest >= delayInMillis) // waited long enough??
  105.   {
  106.     temperature1 = sensors.getTempC(temp1);
  107.     temperature2 = sensors.getTempC(temp2);
  108.     sensors.requestTemperatures();
  109.     lastTempRequest = millis();
  110.   }
  111.  
  112.   logs();
  113.   pir();
  114.   displayLCD();
  115.   displayNumber();
  116.   logSD();
  117.  
  118.   if (Serial.available() < 1) return;     // if serial empty, return to loop().
  119.    else {
  120.    serialread();  
  121.    }
  122. }
  123.  
  124. boolean debounce(boolean last)
  125. {
  126.   boolean current = digitalRead(switchPin);
  127.   if (last != current)
  128.   {
  129.     delay(5);
  130.     current = digitalRead(switchPin);
  131.   }
  132.   return current;
  133. }
  134.  
  135. void serialread() {
  136.   INBYTE = Serial.read();        // read next available byte
  137.   if( INBYTE == '1' ) digitalWrite(BedLed, HIGH);
  138.   if( INBYTE == '2' ) digitalWrite(BedLed, LOW);
  139.   if( INBYTE == '6' ) digitalWrite(PcLed, HIGH);
  140.   if( INBYTE == '5' ) digitalWrite(PcLed, LOW);
  141.   if( INBYTE == '3' ) digitalWrite(lcdBacklight, HIGH);
  142.   if( INBYTE == '4' ) digitalWrite(lcdBacklight, LOW);
  143.   if( INBYTE == '8' ) expander.digitalWrite(4, LOW);
  144.   if( INBYTE == '7' ) expander.digitalWrite(4, HIGH);
  145.   if( INBYTE == 'a' ) irsend.sendNEC(0xFF00FF, 32);  // Audio On/Off
  146.   if( INBYTE == 'b' ) irsend.sendNEC(0xFF8877, 32);  // Audio Vol Up
  147.   if( INBYTE == 'c' ) irsend.sendNEC(0xFF08F7, 32);  // Audio Vol Down
  148.   if( INBYTE == 'd' ) irsend.sendNEC(0xFF50AF, 32);  // Audio Bass Up
  149.   if( INBYTE == 'e' ) irsend.sendNEC(0xFF708F, 32);  // Audio Bass Down
  150.   if( INBYTE == 'f' ) irsend.sendNEC(0xFF906F, 32);  // Audio Treble Up
  151.   if( INBYTE == 'g' ) irsend.sendNEC(0xFFB04F, 32);  // Audio Treble Down
  152.   if( INBYTE == 'h' ) irsend.sendNEC(0xFF20DF, 32);  // Audio Change Input
  153.   if( INBYTE == 'i' ) irsend.sendSamsung(0xE0E0807F, 38);  // TV Source
  154.   if( INBYTE == 'j' ) irsend.sendSamsung(0xE0E0E01F, 38);  // TV Vol Up
  155.   if( INBYTE == 'k' ) irsend.sendSamsung(0xE0E0D02F, 38);  // TV Vol Down
  156.   if( INBYTE == 'l' ) irsend.sendSamsung(0xE0E040BF, 38);  // TV ON/OFF
  157.   if( INBYTE == 'm' ) irsend.sendSamsung(0xE0E048B7, 38);  // TV Chanel Up
  158.   if( INBYTE == 'n' ) irsend.sendSamsung(0xE0E008F7, 38);  // TV Chanel Down
  159. }
  160.  
  161. void displayLCDstart() {
  162.   lcd.createChar(0, newChar);
  163.   lcd.clear();        
  164.   lcd.setCursor(2,0);
  165.   lcd.print("Home Temp");
  166.   lcd.setCursor(8,1);
  167.   lcd.print("by CoX");
  168.   delay(1500);
  169. }
  170.  
  171. void displayLCD() {
  172.   DateTime now = RTC.now();
  173.  currentButton = debounce(lastButton);
  174.   if (lastButton == LOW && currentButton == HIGH)
  175.   {
  176.     DateTime now = RTC.now();
  177.     lcd.clear();
  178.     lcd.setCursor(3,0);
  179.     if(now.day() < 10)
  180.     {  
  181.     lcd.print("0");
  182.     }
  183.     lcd.print(now.day(), DEC);
  184.     lcd.print('/');
  185.     if(now.month() < 10)
  186.     {  
  187.     lcd.print("0");
  188.     }
  189.     lcd.print(now.month(), DEC);
  190.     lcd.print('/');
  191.     lcd.print(now.year(), DEC);
  192.     lcd.setCursor(1,1);
  193.     lcd.print("Max=");
  194.     lcd.print(tempMax);
  195.     lcd.print("  Min=");
  196.     lcd.print(tempMin);
  197.     delay(3000);
  198.   }
  199.   lastButton = currentButton;
  200.  
  201.   lcd.clear();
  202.   lcd.setCursor(0,0);
  203.   lcd.print(temperature1);
  204.   lcd.write(8);
  205.   lcd.print("C");
  206.   lcd.setCursor(10,0);
  207.   if(now.hour() < 10)
  208.   {  
  209.   lcd.print("0");
  210.   }
  211.   lcd.print(now.hour(), DEC);
  212.   lcd.print(':');
  213.   if(now.minute() < 10)
  214.   {  
  215.   lcd.print("0");
  216.   }
  217.   lcd.print(now.minute(), DEC);
  218.   lcd.setCursor(0,1);
  219.   lcd.print(temperature2);
  220.   lcd.write(8);
  221.   lcd.print("C");
  222. }
  223.  
  224. void logs() {
  225.   photocellReading = analogRead(photocellPin);
  226.   LuxReading = map(photocellReading, 0, 1023, 10, 900);
  227.  
  228.   int val = analogRead(batteryPin);
  229.   float volts = (val / 1023.0) * referenceVolts;
  230.  
  231.   Serial.print(temperature1);
  232.   Serial.print(temperature2);
  233.   if (LuxReading < 100) {
  234.   Serial.print("0");
  235.   Serial.print(LuxReading);
  236.   }
  237.   else {
  238.   Serial.print(LuxReading);
  239.   }
  240.   Serial.println(volts);
  241.   Serial.print('\r');
  242.   Serial.flush();
  243.  
  244.   tempMin = min(tempMin, temperature1);
  245.   tempMax = max(tempMax, temperature1);
  246. }
  247.  
  248. void logSD() {
  249.  
  250.   DateTime now = RTC.now();
  251.   int time = now.second();
  252.  
  253.  if (abs(time - lastTime) > 10)
  254.  {
  255.   dataFile.print('"');
  256.   dataFile.print(now.day(), DEC);
  257.   dataFile.print("/");
  258.   dataFile.print(now.month(), DEC);
  259.   dataFile.print("/");
  260.   dataFile.print(now.year(), DEC);
  261.   dataFile.print(" ");
  262.   dataFile.print(now.hour(), DEC);
  263.   dataFile.print(":");
  264.   dataFile.print(now.minute(), DEC);
  265.   dataFile.print(":");
  266.   dataFile.print(now.second(), DEC);
  267.   dataFile.print('"');
  268.   dataFile.print(", ");
  269.   dataFile.print(temperature1);
  270.   dataFile.print(", ");
  271.   dataFile.print(temperature2);
  272.   dataFile.print(", ");
  273.   dataFile.println();
  274.   dataFile.flush();
  275.   lastTime = time;
  276.  }
  277. }
  278.  
  279. void pir() {
  280.  if (LuxReading < 70){
  281.   if (digitalRead(pirPin) == HIGH) {
  282.     digitalWrite(BedLed, HIGH);
  283.   }
  284.   else {
  285.     digitalWrite(BedLed, LOW);
  286.   }
  287.  }
  288. }
  289.  
  290. void clearDisplay() {
  291.         digitalWrite(latchPin, LOW);
  292.         shiftOut(dataPin, clockPin, MSBFIRST, 0);
  293.         shiftOut(dataPin, clockPin, MSBFIRST, 0);
  294.         digitalWrite(latchPin, HIGH);  
  295. }      
  296.  
  297. void displayNumber() {
  298.  
  299.   long beginTime = millis();
  300.   for(int digit = 4 ; digit > 0 ; digit--) {
  301.  
  302.     switch(digit) {
  303.     case 1:
  304.       displayDigitOne();
  305.       break;
  306.     case 2:
  307.       displayDigitTwo();
  308.       break;
  309.     case 3:
  310.       displayDigitThree();
  311.       break;
  312.     case 4:
  313.       displayDigitFour();
  314.       break;
  315.     }
  316.    
  317.     delayMicroseconds(3000);
  318.     updateDisplay();
  319.     clearDisplay();
  320.   }
  321.    //Wait for 20ms to pass before we paint the display again
  322.     while( (millis() - beginTime) < 10) ;
  323.  
  324.    unsigned long currentMillis = millis();
  325.  
  326.     if(currentMillis - previousMillis > interval) {
  327.    
  328.     // save the last time you blinked the Colon LED
  329.     previousMillis = currentMillis;  
  330.     }
  331. }
  332.  
  333. void updateDisplay() {
  334.       DateTime now = RTC.now();
  335.       firstDigit=now.hour()/10;
  336.       secondDigit=now.hour()%10;
  337.       thirdDigit=now.minute()/10;
  338.       fourthDigit=(now.minute()%10);    
  339. }
  340.  
  341. void displayDigitOne() {  
  342.         digitalWrite(latchPin, LOW);
  343.         shiftOut(dataPin, clockPin, MSBFIRST, seven_seg_digits[firstDigit]);
  344.         shiftOut(dataPin, clockPin, MSBFIRST, segmentSelect[0]);
  345.         digitalWrite(latchPin, HIGH);  
  346. }
  347.  
  348. void displayDigitTwo() {
  349.         digitalWrite(latchPin, LOW);
  350.         shiftOut(dataPin, clockPin, MSBFIRST, seven_seg_digits[secondDigit]);
  351.         shiftOut(dataPin, clockPin, MSBFIRST, segmentSelect[1]);
  352.         digitalWrite(latchPin, HIGH);    
  353. }
  354.  
  355. void displayDigitThree() {
  356.         digitalWrite(latchPin, LOW);      
  357.         shiftOut(dataPin, clockPin, MSBFIRST, seven_seg_digits[thirdDigit]);
  358.         shiftOut(dataPin, clockPin, MSBFIRST, segmentSelect[2]);
  359.         digitalWrite(latchPin, HIGH);
  360. }
  361.  
  362. void displayDigitFour() {
  363.         digitalWrite(latchPin, LOW);
  364.         shiftOut(dataPin, clockPin, MSBFIRST, seven_seg_digits[fourthDigit]);
  365.         shiftOut(dataPin, clockPin, MSBFIRST, segmentSelect[3]);
  366.         digitalWrite(latchPin, HIGH);
  367. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement