#include <SoftwareSerial.h>
#include <ArduinoStream.h>
#include <bufstream.h>
#include <ios.h>
#include <iostream.h>
#include <istream.h>
#include <ostream.h>
#include <Sd2Card.h>
#include <Sd2PinMap.h>
#include <SdBaseFile.h>
#include <SdFat.h>
#include <SdFatConfig.h>
#include <SdFatmainpage.h>
#include <SdFatStructs.h>
#include <SdFatUtil.h>
#include <SdFile.h>
#include <SdInfo.h>
#include <SdStream.h>
#include <SdVolume.h>
#define MAX_BITS 100 // max number of bits
#define WEIGAND_WAIT_TIME 3000 // time to wait for another weigand pulse.
#define txPin 4 // White wire from Serial LCD screen
const int LCDdelay = 10; // conservative, 2 actually works
unsigned char databits[MAX_BITS]; // stores all of the data bits
volatile unsigned int bitCount = 0;
unsigned char flagDone; // goes low when data is currently being captured
unsigned int weigand_counter; // countdown until we assume there are no more bits
volatile unsigned long facilityCode=0; // decoded facility code
volatile unsigned long cardCode=0; // decoded card code
// Breaking up card value into 2 chunks to create 10 char HEX value
volatile unsigned long bitHolder1 = 0;
volatile unsigned long bitHolder2 = 0;
volatile unsigned long cardChunk1 = 0;
volatile unsigned long cardChunk2 = 0;
// SD card variables
const uint8_t chipSelect = 10; // CS from SD to Pin 10 on Arduino
SdFat sd; // file system object for SD card
SdFile file; // file object
char dataFile[] = "cards.txt"; // file to save card ids to
///////////////////////////////////////////////////////
// Process interrupts
// interrupt that happens when INTO goes low (0 bit)
void ISR_INT0()
{
//Serial.print("0");
bitCount++;
flagDone = 0;
if(bitCount < 23) {
bitHolder1 = bitHolder1 << 1;
}
else {
bitHolder2 = bitHolder2 << 1;
}
weigand_counter = WEIGAND_WAIT_TIME;
}
// interrupt that happens when INT1 goes low (1 bit)
void ISR_INT1()
{
//Serial.print("1");
databits[bitCount] = 1;
bitCount++;
flagDone = 0;
if(bitCount < 23) {
bitHolder1 = bitHolder1 << 1;
bitHolder1 |= 1;
}
else {
bitHolder2 = bitHolder2 << 1;
bitHolder2 |= 1;
}
weigand_counter = WEIGAND_WAIT_TIME;
}
///////////////////////////////////////////////////////
// LCD setup - 20x4
SoftwareSerial LCD(0, txPin);
void lcdPosition(int row, int col) {
LCD.[color=#CC6600]write/color; //command flag
LCD.write((col + row*64 + 128)); //position
[color=#CC6600]delay/color;
}
void lcdPositionLine2() {
LCD.[color=#CC6600]write/color; //command flag
LCD.[color=#CC6600]write/color;
LCD.[color=#CC6600]write/color;
[color=#CC6600]delay/color;
}
void lcdPositionLine3() {
LCD.[color=#CC6600]write/color; //command flag
LCD.[color=#CC6600]write/color;
LCD.[color=#CC6600]write/color;
[color=#CC6600]delay/color;
}
void lcdPositionLine4() {
LCD.[color=#CC6600]write/color; //command flag
LCD.[color=#CC6600]write/color;
LCD.[color=#CC6600]write/color;
[color=#CC6600]delay/color;
}
void clearLCD(){
LCD.[color=#CC6600]write/color; //command flag
LCD.[color=#CC6600]write/color; //clear command.
[color=#CC6600]delay/color;
}
void serCommand(){ //a general function to call the command flag for issuing all other commands
LCD.[color=#CC6600]write/color;
}
void setLCDContrast() {
LCD.[color=#CC6600]write/color; //command flag
LCD.[color=#CC6600]write/color;
LCD.[color=#CC6600]write/color; //value 1 to 50 (50 is highest contrast)
[color=#CC6600]delay/color;
}
void setLCDBrightness() {
LCD.[color=#CC6600]write/color; //command flag
LCD.[color=#CC6600]write/color;
LCD.[color=#CC6600]write/color; //value 1 to 8
[color=#CC6600]delay/color;
}
///////////////////////////////////////////////////////
// SETUP function
void [color=#CC6600]setup/color
{
pinMode(13, OUTPUT); // LED
pinMode(2, INPUT); // DATA0 (INT0)
pinMode(3, INPUT); // DATA1 (INT1)
Serial.[color=#CC6600]begin/color;
Serial.println("RFID Readers");
pinMode(txPin, OUTPUT);
LCD.[color=#CC6600]begin/color;
setLCDContrast();
setLCDBrightness();
// Setup output pin to SD card
pinMode(10, OUTPUT);
pinMode(chipSelect, OUTPUT);
// Initialize SD card
while(!sd.init(SPI_HALF_SPEED, chipSelect)) {
Serial.println("No SD Card!");
clearLCD();
LCD.print("No SD Card!");
}
// Commented out with no LCD
if(!sd.init(SPI_HALF_SPEED, chipSelect)) {
clearLCD();
LCD.print("Problem with SD card");
}
else {
clearLCD();
LCD.print("SD card initialized.");
}
// binds the ISR functions to the falling edge of INTO and INT1
attachInterrupt(0, ISR_INT0, FALLING);
attachInterrupt(1, ISR_INT1, FALLING);
weigand_counter = WEIGAND_WAIT_TIME;
}
///////////////////////////////////////////////////////
// LOOP function
void [color=#CC6600]loop/color
{
// This waits to make sure that there have been no more data pulses before processing data
if (!flagDone) {
[color=#CC6600]if[/color] (--weigand_counter == 0)
flagDone = 1;
}
// if we have bits and we the weigand counter went out
if (bitCount > 0 && flagDone) {
unsigned char i;
getCardValues();
getCardNumAndSiteCode();
printBits();
writeSD();
[color=#7E7E7E]// cleanup and get ready for the next card[/color]
bitCount = 0; facilityCode = 0; cardCode = 0;
bitHolder1 = 0; bitHolder2 = 0;
cardChunk1 = 0; cardChunk2 = 0;
[color=#CC6600]for[/color] (i=0; i<MAX_BITS; i++)
{
databits[i] = 0;
}
}
}
///////////////////////////////////////////////////////
// PRINTBITS function
void printBits()
{
// I really hope you can figure out what this function does
Serial.[color=#CC6600]print/color;
Serial.print(" bit card. ");
Serial.print("FC = ");
Serial.[color=#CC6600]print/color;
Serial.print(", CC = ");
Serial.[color=#CC6600]print/color;
Serial.print(", 44bit HEX = ");
Serial.print(cardChunk1, HEX);
Serial.println(cardChunk2, HEX);
clearLCD();
LCD.[color=#CC6600]print[/color](bitCount);
LCD.[color=#CC6600]print[/color]([color=#006699]" bit card."[/color]);
lcdPositionLine2();
LCD.[color=#CC6600]print[/color]([color=#006699]"Facility = "[/color]);
LCD.[color=#CC6600]print[/color](facilityCode);
lcdPositionLine3();
LCD.[color=#CC6600]print[/color]([color=#006699]"Card = "[/color]);
LCD.[color=#CC6600]print[/color](cardCode);
lcdPositionLine4();
LCD.[color=#CC6600]print[/color]([color=#006699]"44bitHEX= "[/color]);
LCD.[color=#CC6600]print[/color](cardChunk1, [color=#006699]HEX[/color]);
LCD.[color=#CC6600]print[/color](cardChunk2, [color=#006699]HEX[/color]);
[color=#CC6600]delay[/color](2500);
clearLCD();
}
///////////////////////////////////////////////////////
// SETUP function
void getCardNumAndSiteCode()
{
unsigned char i;
[color=#7E7E7E]// we will decode the bits differently depending on how many bits we have[/color]
[color=#7E7E7E]// see www.pagemac.com/azure/data_formats.php for more info[/color]
[color=#7E7E7E]// also specifically: www.brivo.com/app/static_data/js/calculate.js[/color]
[color=#CC6600]switch[/color] (bitCount) {
[color=#7E7E7E]///////////////////////////////////////[/color]
[color=#7E7E7E]// standard 26 bit format[/color]
[color=#7E7E7E]// facility code = bits 2 to 9 [/color]
[color=#CC6600]case[/color] 26:
[color=#CC6600]for[/color] (i=1; i<9; i++)
{
facilityCode <<=1;
facilityCode |= databits[i];
}
[color=#7E7E7E]// card code = bits 10 to 23[/color]
[color=#CC6600]for[/color] (i=9; i<25; i++)
{
cardCode <<=1;
cardCode |= databits[i];
}
[color=#CC6600]break[/color];
[color=#7E7E7E]///////////////////////////////////////[/color]
[color=#7E7E7E]// 33 bit HID Generic [/color]
[color=#CC6600]case[/color] 33:
[color=#CC6600]for[/color] (i=1; i<8; i++)
{
facilityCode <<=1;
facilityCode |= databits[i];
}
[color=#7E7E7E]// card code[/color]
[color=#CC6600]for[/color] (i=8; i<32; i++)
{
cardCode <<=1;
cardCode |= databits[i];
}
[color=#CC6600]break[/color];
[color=#7E7E7E]///////////////////////////////////////[/color]
[color=#7E7E7E]// 34 bit HID Generic [/color]
[color=#CC6600]case[/color] 34:
[color=#CC6600]for[/color] (i=1; i<17; i++)
{
facilityCode <<=1;
facilityCode |= databits[i];
}
[color=#7E7E7E]// card code[/color]
[color=#CC6600]for[/color] (i=17; i<33; i++)
{
cardCode <<=1;
cardCode |= databits[i];
}
[color=#CC6600]break[/color];
[color=#7E7E7E]///////////////////////////////////////[/color]
[color=#7E7E7E]// 35 bit HID Corporate 1000 format[/color]
[color=#7E7E7E]// facility code = bits 2 to 14 [/color]
[color=#CC6600]case[/color] 35:
[color=#CC6600]for[/color] (i=2; i<14; i++)
{
facilityCode <<=1;
facilityCode |= databits[i];
}
[color=#7E7E7E]// card code = bits 15 to 34[/color]
[color=#CC6600]for[/color] (i=14; i<34; i++)
{
cardCode <<=1;
cardCode |= databits[i];
}
[color=#CC6600]break[/color];
}
[color=#CC6600]return[/color];
}
//////////////////////////////////////
// Function to append the card value (bitHolder1 and bitHolder2) to the necessary array then tranlate that to
// the two chunks for the card value that will be output
void getCardValues() {
switch (bitCount) {
case 26:
// Example of full card value
// |> preamble <| |> Actual card value <|
// 000000100000000001 11 111000100000100100111000
// |> write to chunk1 <| |> write to chunk2 <|
[color=#CC6600]for[/color]([color=#CC6600]int[/color] i = 19; i >= 0; i--) {
[color=#CC6600]if[/color](i == 13 || i == 2){
[color=#CC6600]bitWrite[/color](cardChunk1, i, 1); [color=#7E7E7E]// Write preamble 1's to the 13th and 2nd bits[/color]
}
[color=#CC6600]else[/color] [color=#CC6600]if[/color](i > 2) {
[color=#CC6600]bitWrite[/color](cardChunk1, i, 0); [color=#7E7E7E]// Write preamble 0's to all other bits above 1[/color]
}
[color=#CC6600]else[/color] {
[color=#CC6600]bitWrite[/color](cardChunk1, i, [color=#CC6600]bitRead[/color](bitHolder1, i + 20)); [color=#7E7E7E]// Write remaining bits to cardChunk1 from bitHolder1[/color]
}
[color=#CC6600]if[/color](i < 20) {
[color=#CC6600]bitWrite[/color](cardChunk2, i + 4, [color=#CC6600]bitRead[/color](bitHolder1, i)); [color=#7E7E7E]// Write the remaining bits of bitHolder1 to cardChunk2[/color]
}
[color=#CC6600]if[/color](i < 4) {
[color=#CC6600]bitWrite[/color](cardChunk2, i, [color=#CC6600]bitRead[/color](bitHolder2, i)); [color=#7E7E7E]// Write the remaining bit of cardChunk2 with bitHolder2 bits[/color]
}
}
[color=#CC6600]break[/color];
[color=#CC6600]case[/color] 27:
[color=#CC6600]for[/color]([color=#CC6600]int[/color] i = 19; i >= 0; i--) {
[color=#CC6600]if[/color](i == 13 || i == 3){
[color=#CC6600]bitWrite[/color](cardChunk1, i, 1);
}
[color=#CC6600]else[/color] [color=#CC6600]if[/color](i > 3) {
[color=#CC6600]bitWrite[/color](cardChunk1, i, 0);
}
[color=#CC6600]else[/color] {
[color=#CC6600]bitWrite[/color](cardChunk1, i, [color=#CC6600]bitRead[/color](bitHolder1, i + 19));
}
[color=#CC6600]if[/color](i < 19) {
[color=#CC6600]bitWrite[/color](cardChunk2, i + 5, [color=#CC6600]bitRead[/color](bitHolder1, i));
}
[color=#CC6600]if[/color](i < 5) {
[color=#CC6600]bitWrite[/color](cardChunk2, i, [color=#CC6600]bitRead[/color](bitHolder2, i));
}
}
[color=#CC6600]break[/color];
[color=#CC6600]case[/color] 28:
[color=#CC6600]for[/color]([color=#CC6600]int[/color] i = 19; i >= 0; i--) {
[color=#CC6600]if[/color](i == 13 || i == 4){
[color=#CC6600]bitWrite[/color](cardChunk1, i, 1);
}
[color=#CC6600]else[/color] [color=#CC6600]if[/color](i > 4) {
[color=#CC6600]bitWrite[/color](cardChunk1, i, 0);
}
[color=#CC6600]else[/color] {
[color=#CC6600]bitWrite[/color](cardChunk1, i, [color=#CC6600]bitRead[/color](bitHolder1, i + 18));
}
[color=#CC6600]if[/color](i < 18) {
[color=#CC6600]bitWrite[/color](cardChunk2, i + 6, [color=#CC6600]bitRead[/color](bitHolder1, i));
}
[color=#CC6600]if[/color](i < 6) {
[color=#CC6600]bitWrite[/color](cardChunk2, i, [color=#CC6600]bitRead[/color](bitHolder2, i));
}
}
[color=#CC6600]break[/color];
[color=#CC6600]case[/color] 29:
[color=#CC6600]for[/color]([color=#CC6600]int[/color] i = 19; i >= 0; i--) {
[color=#CC6600]if[/color](i == 13 || i == 5){
[color=#CC6600]bitWrite[/color](cardChunk1, i, 1);
}
[color=#CC6600]else[/color] [color=#CC6600]if[/color](i > 5) {
[color=#CC6600]bitWrite[/color](cardChunk1, i, 0);
}
[color=#CC6600]else[/color] {
[color=#CC6600]bitWrite[/color](cardChunk1, i, [color=#CC6600]bitRead[/color](bitHolder1, i + 17));
}
[color=#CC6600]if[/color](i < 17) {
[color=#CC6600]bitWrite[/color](cardChunk2, i + 7, [color=#CC6600]bitRead[/color](bitHolder1, i));
}
[color=#CC6600]if[/color](i < 7) {
[color=#CC6600]bitWrite[/color](cardChunk2, i, [color=#CC6600]bitRead[/color](bitHolder2, i));
}
}
[color=#CC6600]break[/color];
[color=#CC6600]case[/color] 30:
[color=#CC6600]for[/color]([color=#CC6600]int[/color] i = 19; i >= 0; i--) {
[color=#CC6600]if[/color](i == 13 || i == 6){
[color=#CC6600]bitWrite[/color](cardChunk1, i, 1);
}
[color=#CC6600]else[/color] [color=#CC6600]if[/color](i > 6) {
[color=#CC6600]bitWrite[/color](cardChunk1, i, 0);
}
[color=#CC6600]else[/color] {
[color=#CC6600]bitWrite[/color](cardChunk1, i, [color=#CC6600]bitRead[/color](bitHolder1, i + 16));
}
[color=#CC6600]if[/color](i < 16) {
[color=#CC6600]bitWrite[/color](cardChunk2, i + 8, [color=#CC6600]bitRead[/color](bitHolder1, i));
}
[color=#CC6600]if[/color](i < 8) {
[color=#CC6600]bitWrite[/color](cardChunk2, i, [color=#CC6600]bitRead[/color](bitHolder2, i));
}
}
[color=#CC6600]break[/color];
[color=#CC6600]case[/color] 31:
[color=#CC6600]for[/color]([color=#CC6600]int[/color] i = 19; i >= 0; i--) {
[color=#CC6600]if[/color](i == 13 || i == 7){
[color=#CC6600]bitWrite[/color](cardChunk1, i, 1);
}
[color=#CC6600]else[/color] [color=#CC6600]if[/color](i > 7) {
[color=#CC6600]bitWrite[/color](cardChunk1, i, 0);
}
[color=#CC6600]else[/color] {
[color=#CC6600]bitWrite[/color](cardChunk1, i, [color=#CC6600]bitRead[/color](bitHolder1, i + 15));
}
[color=#CC6600]if[/color](i < 15) {
[color=#CC6600]bitWrite[/color](cardChunk2, i + 9, [color=#CC6600]bitRead[/color](bitHolder1, i));
}
[color=#CC6600]if[/color](i < 9) {
[color=#CC6600]bitWrite[/color](cardChunk2, i, [color=#CC6600]bitRead[/color](bitHolder2, i));
}
}
[color=#CC6600]break[/color];
[color=#CC6600]case[/color] 32:
[color=#CC6600]for[/color]([color=#CC6600]int[/color] i = 19; i >= 0; i--) {
[color=#CC6600]if[/color](i == 13 || i == 8){
[color=#CC6600]bitWrite[/color](cardChunk1, i, 1);
}
[color=#CC6600]else[/color] [color=#CC6600]if[/color](i > 8) {
[color=#CC6600]bitWrite[/color](cardChunk1, i, 0);
}
[color=#CC6600]else[/color] {
[color=#CC6600]bitWrite[/color](cardChunk1, i, [color=#CC6600]bitRead[/color](bitHolder1, i + 14));
}
[color=#CC6600]if[/color](i < 14) {
[color=#CC6600]bitWrite[/color](cardChunk2, i + 10, [color=#CC6600]bitRead[/color](bitHolder1, i));
}
[color=#CC6600]if[/color](i < 10) {
[color=#CC6600]bitWrite[/color](cardChunk2, i, [color=#CC6600]bitRead[/color](bitHolder2, i));
}
}
[color=#CC6600]break[/color];
[color=#CC6600]case[/color] 33:
[color=#CC6600]for[/color]([color=#CC6600]int[/color] i = 19; i >= 0; i--) {
[color=#CC6600]if[/color](i == 13 || i == 9){
[color=#CC6600]bitWrite[/color](cardChunk1, i, 1);
}
[color=#CC6600]else[/color] [color=#CC6600]if[/color](i > 9) {
[color=#CC6600]bitWrite[/color](cardChunk1, i, 0);
}
[color=#CC6600]else[/color] {
[color=#CC6600]bitWrite[/color](cardChunk1, i, [color=#CC6600]bitRead[/color](bitHolder1, i + 13));
}
[color=#CC6600]if[/color](i < 13) {
[color=#CC6600]bitWrite[/color](cardChunk2, i + 11, [color=#CC6600]bitRead[/color](bitHolder1, i));
}
[color=#CC6600]if[/color](i < 11) {
[color=#CC6600]bitWrite[/color](cardChunk2, i, [color=#CC6600]bitRead[/color](bitHolder2, i));
}
}
[color=#CC6600]break[/color];
[color=#CC6600]case[/color] 34:
[color=#CC6600]for[/color]([color=#CC6600]int[/color] i = 19; i >= 0; i--) {
[color=#CC6600]if[/color](i == 13 || i == 10){
[color=#CC6600]bitWrite[/color](cardChunk1, i, 1);
}
[color=#CC6600]else[/color] [color=#CC6600]if[/color](i > 10) {
[color=#CC6600]bitWrite[/color](cardChunk1, i, 0);
}
[color=#CC6600]else[/color] {
[color=#CC6600]bitWrite[/color](cardChunk1, i, [color=#CC6600]bitRead[/color](bitHolder1, i + 12));
}
[color=#CC6600]if[/color](i < 12) {
[color=#CC6600]bitWrite[/color](cardChunk2, i + 12, [color=#CC6600]bitRead[/color](bitHolder1, i));
}
[color=#CC6600]if[/color](i < 12) {
[color=#CC6600]bitWrite[/color](cardChunk2, i, [color=#CC6600]bitRead[/color](bitHolder2, i));
}
}
[color=#CC6600]break[/color];
[color=#CC6600]case[/color] 35:
[color=#CC6600]for[/color]([color=#CC6600]int[/color] i = 19; i >= 0; i--) {
[color=#CC6600]if[/color](i == 13 || i == 11){
[color=#CC6600]bitWrite[/color](cardChunk1, i, 1);
}
[color=#CC6600]else[/color] [color=#CC6600]if[/color](i > 11) {
[color=#CC6600]bitWrite[/color](cardChunk1, i, 0);
}
[color=#CC6600]else[/color] {
[color=#CC6600]bitWrite[/color](cardChunk1, i, [color=#CC6600]bitRead[/color](bitHolder1, i + 11));
}
[color=#CC6600]if[/color](i < 11) {
[color=#CC6600]bitWrite[/color](cardChunk2, i + 13, [color=#CC6600]bitRead[/color](bitHolder1, i));
}
[color=#CC6600]if[/color](i < 13) {
[color=#CC6600]bitWrite[/color](cardChunk2, i, [color=#CC6600]bitRead[/color](bitHolder2, i));
}
}
[color=#CC6600]break[/color];
[color=#CC6600]case[/color] 36:
[color=#CC6600]for[/color]([color=#CC6600]int[/color] i = 19; i >= 0; i--) {
[color=#CC6600]if[/color](i == 13 || i == 12){
[color=#CC6600]bitWrite[/color](cardChunk1, i, 1);
}
[color=#CC6600]else[/color] [color=#CC6600]if[/color](i > 12) {
[color=#CC6600]bitWrite[/color](cardChunk1, i, 0);
}
[color=#CC6600]else[/color] {
[color=#CC6600]bitWrite[/color](cardChunk1, i, [color=#CC6600]bitRead[/color](bitHolder1, i + 10));
}
[color=#CC6600]if[/color](i < 10) {
[color=#CC6600]bitWrite[/color](cardChunk2, i + 14, [color=#CC6600]bitRead[/color](bitHolder1, i));
}
[color=#CC6600]if[/color](i < 14) {
[color=#CC6600]bitWrite[/color](cardChunk2, i, [color=#CC6600]bitRead[/color](bitHolder2, i));
}
}
[color=#CC6600]break[/color];
[color=#CC6600]case[/color] 37:
[color=#CC6600]for[/color]([color=#CC6600]int[/color] i = 19; i >= 0; i--) {
[color=#CC6600]if[/color](i == 13){
[color=#CC6600]bitWrite[/color](cardChunk1, i, 0);
}
[color=#CC6600]else[/color] {
[color=#CC6600]bitWrite[/color](cardChunk1, i, [color=#CC6600]bitRead[/color](bitHolder1, i + 9));
}
[color=#CC6600]if[/color](i < 9) {
[color=#CC6600]bitWrite[/color](cardChunk2, i + 15, [color=#CC6600]bitRead[/color](bitHolder1, i));
}
[color=#CC6600]if[/color](i < 15) {
[color=#CC6600]bitWrite[/color](cardChunk2, i, [color=#CC6600]bitRead[/color](bitHolder2, i));
}
}
[color=#CC6600]break[/color];
}
return;
}
//////////////////////////////////////
// Begin code for SD card
void writeSD() {
[color=#7E7E7E]// open the file. note that only one file can be open at a time,[/color]
[color=#7E7E7E]// so you have to close this one before opening another.[/color]
ofstream file(dataFile, ios::out | ios::app);
[color=#7E7E7E]// if the file is available, write to it:[/color]
[color=#CC6600]if[/color] (file) {
file << bitCount;
[color=#7E7E7E]//file << dec << bitCount;[/color]
file << [color=#006699]" bit card: "[/color];
file << hex << cardChunk1;
file << hex << cardChunk2;
file << [color=#006699]", FC = "[/color];
[color=#7E7E7E]//file << facilityCode;[/color]
file << dec << facilityCode;
file << [color=#006699]", CC = "[/color];
[color=#7E7E7E]//file << cardCode;[/color]
file << dec << cardCode;
file << [color=#006699]", BIN: "[/color];
[color=#CC6600]for[/color] ([color=#CC6600]int[/color] i = 19; i >= 0; i--) {
file << [color=#CC6600]bitRead[/color](cardChunk1, i);
}
[color=#CC6600]for[/color] ([color=#CC6600]int[/color] i = 23; i >= 0; i--) {
file << [color=#CC6600]bitRead[/color](cardChunk2, i);
}
file << endl;
[color=#7E7E7E]// print to the serial port too[/color]
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color]([color=#006699]"Wrote data to SD card"[/color]);
}
[color=#CC6600]else[/color] {
clearLCD();
LCD.[color=#CC6600]print[/color]([color=#006699]"Error writing to file"[/color]);
}
}
// End code for SD card