Advertisement
baldengineer

use F()

Nov 19th, 2017
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.49 KB | None | 0 0
  1. // before 1679
  2. // after  1331
  3.  
  4. // include libraries
  5. #include "SparkFunBME280.h"
  6. #include "Wire.h"
  7. #include "RTClib.h"
  8. #include <SPI.h>
  9. #include <SD.h>
  10. #include <LiquidCrystal.h>
  11.  
  12. // DS1307 Real-time Clock
  13. RTC_DS1307 rtc;
  14.  
  15. // SD card
  16. const unsigned int cardPin = 10;
  17. String dataString;
  18. String fileName = "data.csv";
  19.  
  20. // LCD display
  21. LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
  22.  
  23. // degree C symbol data
  24. byte degreeCSymbol[8] = {
  25.   0b01000,
  26.   0b10100,
  27.   0b01000,
  28.   0b00011,
  29.   0b00100,
  30.   0b00100,
  31.   0b00011,
  32.   0b00000
  33. };
  34.  
  35. // degree F symbol data
  36. byte degreeFSymbol[8] = {
  37.   0b01000,
  38.   0b10100,
  39.   0b01000,
  40.   0b00011,
  41.   0b00100,
  42.   0b00111,
  43.   0b00100,
  44.   0b00000
  45. };
  46.  
  47. // BMP280 sensor object
  48. BME280 bmp280sensor;
  49.  
  50. // sensor data
  51. float tempC;
  52. float tempF;
  53. float pressPa;
  54. float presskPa;
  55. float altM;
  56. float altFt;
  57.  
  58. // CSV row counter
  59. unsigned int sampleNumber = 0;
  60.  
  61. // reset function at address 0
  62. void(* resetFunc) (void) = 0;
  63.  
  64. // function to initalize SD card
  65. void initSD() {
  66.   Serial.print(F("Initializing SD card..."));
  67.   // see if the card is present and can be initialized:
  68.   if (!SD.begin(cardPin)) {
  69.     // card failed
  70.     Serial.println(F("Card failed, or not present"));
  71.     // tell the user
  72.     lcd.clear();
  73.     lcd.print(F(" CHECK SD CARD! "));
  74.     delay(5000);
  75.     // reset the arduino
  76.     resetFunc();
  77.   }
  78.   Serial.println("card initialized. \n");
  79. }
  80.  
  81. // function to initalize RTC
  82. void initRTC() {
  83.   if (! rtc.begin()) {
  84.     // no RTC found
  85.     Serial.println(F("RTC not found!"));
  86.     while(1);
  87.   }
  88.   // rtc was found but isn't running
  89.   if (! rtc.isrunning()) {
  90.     Serial.println(F("RTC found, but not running!"));
  91.     // set the RTC date/time to when sketch complied
  92.     rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  93.   }
  94.   Serial.println(F("RTC initalized!"));
  95. }
  96.  
  97. // funtion to initalize LCD
  98. void initLCD() {
  99.   lcd.begin(16, 2);
  100.   Serial.println(F("LCD initialized."));
  101.   // initalize custom degree c symbol
  102.   lcd.createChar(0, degreeCSymbol);
  103.   Serial.println(F("degree C character created."));
  104.   // initalize custom degree f symbol
  105.   lcd.createChar(1, degreeFSymbol);
  106.   Serial.println(F("degree F character created. \n"));
  107.   // clear LCD to begin
  108.   lcd.clear();
  109. }
  110.  
  111. // function to initalize BMP280 sensor
  112. void initBMP() {
  113.   // initalize BMP280 Driver with settings
  114.   bmp280sensor.settings.commInterface = I2C_MODE;
  115.   bmp280sensor.settings.I2CAddress = 0x76; //0x77(default) or 0x76
  116.   bmp280sensor.settings.runMode = 3; //Normal mode
  117.   bmp280sensor.settings.tStandby = 0; // 0.5ms
  118.   bmp280sensor.settings.filter = 0; //filter off
  119.   bmp280sensor.settings.tempOverSample = 1; //oversampling 1
  120.   bmp280sensor.settings.pressOverSample = 1; // oversampling 1
  121.   bmp280sensor.settings.humidOverSample = 0; // skipped
  122.   Serial.print(F("Starting BME280... result of .begin(): 0x"));
  123.   // calling .begin() causes the settings to be loaded
  124.   delay(10); // make sure sensor had enough time to turn on. BME280 requires 2ms to start up.
  125.   Serial.println(bmp280sensor.begin(), HEX);
  126.   Serial.print(F("\n"));
  127. }
  128.  
  129. // setup the arduino
  130. void setup()
  131. {
  132.   // initialize serial connection
  133.   Serial.begin(57600);
  134.   Serial.println(F("Program Started\n"));
  135.  
  136.   // initalize on-board LED
  137.   pinMode(13, OUTPUT);
  138.  
  139.   // init sd
  140.   initSD();
  141.  
  142.   // init RTC
  143.   initRTC();
  144.  
  145.   // init lcd
  146.   initLCD();
  147.  
  148.   // init sensor
  149.   initBMP();
  150.  
  151.   // displaying remainder of program on LCD
  152.   Serial.print(F("please allow 30 seconds for the first reading to appear."));
  153.   Serial.print(F("\n\n"));
  154. }
  155.  
  156. // loop logic
  157. void loop()
  158. {  
  159.   // create DateTime object from RTC.now()
  160.   DateTime now = rtc.now();
  161.  
  162.   // build CSV data
  163.   if (sampleNumber == 0) {
  164.     // build a first-row of column headers
  165.     dataString = "";
  166.     dataString +="Sample,";
  167.     dataString +="Timestamp,";
  168.     dataString +="T(deg C),";
  169.     dataString +="T(deg F),";
  170.     dataString +="P(Pa),";
  171.     dataString +="P(kPa),";
  172.     dataString +="Alt(m),";
  173.     dataString +="Alt(ft),";
  174.     dataString +=("");
  175.   }
  176.   else {
  177.     // collect and display data
  178.     dataString = "";
  179.     dataString += sampleNumber;
  180.     dataString += ",";
  181.     dataString += now.year();
  182.     dataString += '/';
  183.     dataString += now.month();
  184.     dataString += '/';
  185.     dataString += now.day();
  186.     dataString += '-';
  187.     dataString += now.hour();
  188.     dataString += ':';
  189.     dataString += now.minute();
  190.     dataString += ':';
  191.     dataString += now.second();
  192.     dataString += ",";
  193.  
  194.     // read and display data
  195.     displayData(0, " C",   1, 6);
  196.     displayData(0, " F",   2, 6);
  197.     displayData(1, " Pa",  3, 6);
  198.     displayData(1, " kPa", 4, 6);
  199.     displayData(2, " M",   5, 6);
  200.     displayData(2, " Ft",  6, 6);
  201.   }
  202.  
  203.   // save to SD card
  204.   saveSD();
  205.  
  206.   // increase CSV counter
  207.   sampleNumber++;
  208. }
  209.  
  210. // read, format, display, requested measurments
  211. void displayData(unsigned int measurment, String unit, unsigned int posX, unsigned int posY) {
  212.  
  213.   // measurment begins
  214.   digitalWrite(13, HIGH );
  215.  
  216.   // what data are we displaying?
  217.   switch (measurment) {
  218.     // requesting Temperature
  219.     case 0:
  220.     if (unit == " C") {
  221.       // requesting celsius
  222.       lcd.print(F("Temperature: "));
  223.       // update progress on LCD
  224.       lcd.setCursor(13, 0);
  225.       lcd.print(posX);
  226.       lcd.print("/");
  227.       lcd.print(posY);
  228.       // read sensor
  229.       tempC = bmp280sensor.readTempC();
  230.       // move cursor to new line
  231.       lcd.setCursor(0, 1);
  232.       // print measurement to LCD
  233.       lcd.print(tempC,2);
  234.       // print measurement to Serial/CSV/SD
  235.       dataString += tempC;
  236.       dataString += ",";
  237.       // print degree character
  238.       lcd.write((uint8_t)0);
  239.  
  240.     }
  241.     else if (unit == " F") {
  242.       // requesting ferinheight
  243.       lcd.print(F("Temperature: "));
  244.       // update progress on LCD
  245.       lcd.setCursor(13, 0);
  246.       lcd.print(posX);
  247.       lcd.print("/");
  248.       lcd.print(posY);
  249.       // read sensor
  250.       tempF = bmp280sensor.readTempF();
  251.       // move cursor to new line
  252.       lcd.setCursor(0, 1);
  253.       // print measurement to LCD
  254.       lcd.print(tempF,2);
  255.       // print measurement to Serial/CSV/SD
  256.       dataString += tempF;
  257.       dataString += ",";
  258.       // print degree character
  259.       lcd.write((uint8_t)1);
  260.     }
  261.     break;
  262.  
  263.     // requesting Pressure
  264.     case 1:
  265.     if (unit == " Pa") {
  266.       // requesting Pascals
  267.       lcd.print(F("Pressure: "));
  268.       // update progress on LCD
  269.       lcd.setCursor(13, 0);
  270.       lcd.print(posX);
  271.       lcd.print("/");
  272.       lcd.print(posY);
  273.       // read sensor
  274.       pressPa = bmp280sensor.readFloatPressure();
  275.       // move cursor to new line
  276.       lcd.setCursor(0, 1);
  277.       // print measurement to LCD
  278.       lcd.print(pressPa,2);
  279.       // print measurement to Serial/CSV/SD
  280.       dataString += pressPa;
  281.       dataString += ",";
  282.       // print unit of measure
  283.       lcd.print(unit);
  284.     }
  285.     else if (unit == " kPa") {
  286.       // requesting Kilo-Pascals
  287.       lcd.print(F("Pressure: "));
  288.       // update progress on LCD
  289.       lcd.setCursor(13, 0);
  290.       lcd.print(posX);
  291.       lcd.print("/");
  292.       lcd.print(posY);
  293.       // read sensor
  294.       presskPa = (bmp280sensor.readFloatPressure() / 1000);
  295.       // move cursor to new line
  296.       lcd.setCursor(0, 1);
  297.       // print measurement to LCD
  298.       lcd.print(presskPa,2);
  299.       // print measurement to Serial/CSV/SD
  300.       dataString += presskPa;
  301.       dataString += ",";
  302.       // print unit of measure
  303.       lcd.print(unit);
  304.     }
  305.     break;
  306.  
  307.     // requesting Altitude
  308.     case 2:
  309.     if (unit == " M") {
  310.       // requesting Meters
  311.       lcd.print(F("Altitude: "));
  312.       // update progress on LCD
  313.       lcd.setCursor(13, 0);
  314.       lcd.print(posX);
  315.       lcd.print(F("/"));
  316.       lcd.print(posY);
  317.       // read sensor
  318.       altM = bmp280sensor.readFloatAltitudeMeters();
  319.       // move cursor to new line
  320.       lcd.setCursor(0, 1);
  321.       // print measurement to LCD
  322.       lcd.print(altM,2);
  323.       // print measurement to Serial/CSV/SD
  324.       dataString += altM;
  325.       dataString += ",";
  326.       // print unit of measure
  327.       lcd.print(unit);
  328.  
  329.     }
  330.     else if (unit == " Ft") {
  331.       // requesting Feet
  332.       lcd.print("Altitude: ");
  333.       // update progress on LCD
  334.       lcd.setCursor(13, 0);
  335.       lcd.print(posX);
  336.       lcd.print("/");
  337.       lcd.print(posY);
  338.       // read sensor
  339.       altFt = bmp280sensor.readFloatAltitudeFeet();
  340.       // move cursor to new line
  341.       lcd.setCursor(0, 1);
  342.       // print measurement to LCD
  343.       lcd.print(altFt,2);
  344.       // print measurement to Serial/CSV/SD
  345.       dataString += altFt;
  346.       dataString += ",";
  347.       // print unit of measure
  348.       lcd.print(unit);
  349.     }
  350.     break;
  351.   }
  352.  
  353.   // measurment ends
  354.   digitalWrite(13, LOW );
  355.  
  356.   // delay for displaying on LCD
  357.   delay(5000);
  358.  
  359.   // clear LCD for next measurment
  360.   lcd.clear();
  361.  
  362. }
  363.  
  364. // save dataString to SD card
  365. void saveSD() {
  366.   // open the file
  367.   File dataFile = SD.open(fileName, FILE_WRITE);
  368.  
  369.   // if the file is available, write to it:
  370.   if (dataFile) {
  371.     // print datastring to file
  372.     dataFile.println(dataString);
  373.     // close the file
  374.     dataFile.close();
  375.     // print to the serial port too:
  376.     Serial.println(dataString);
  377.   }
  378.   // if the file isn't open, pop up an error:
  379.   else {
  380.     // couldn't open file!
  381.     Serial.print(F("error opening "));
  382.     Serial.println(fileName);
  383.     // tell the user
  384.     lcd.clear();
  385.     lcd.print(F(" CHECK SD CARD! "));
  386.     delay(5000);
  387.     // reset the arduino
  388.     resetFunc();
  389.   }
  390. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement