Advertisement
Guest User

z

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