Mynta-stora framgång mätaren (sluta röka!) med Arduino (3 / 8 steg)
Steg 3: Arduino kod
Tid
Adafruit_GFX
Adafruit_PCD8544
Koden var starkt inspirerad av Maker Faire Bay Area countdown tidtagare av MaceTech, genom vilka du kan också få de senaste ChronoDot. Den .ino filen är bifogad (Arduino 1,0 krävs) och rå koden är nedan.
I det här exemplet är avsluta April 1, 2012. Avsluta datum är 14 April 2012 i verkligheten, men det är i framtiden. Det bästa sättet att testa detta är att koppla upp allt, men testa de enskilda komponenterna (ChronoDot, LCD) med deras exempelkod innan du försöker sätta ihop det hela.
/*
Rökfri framgång timer
Med hjälp av en ChronoDot och en Nokia 5110 LCD.
Tid biblioteket, Adafruit PCD bibliotek, RTC och tråd krävs.
Syftet med denna skiss är att visa en ny icke-rökare
Hur länge de har varit utan cigaretter i dagar och
timmar och ett ständigt växande antal mängden
pengar som kan sparas genom att inte röka.
Mycket av koden var inspirerad av Maker Faire Bay
Område nedräkningsklockan postat på
http://macetech.com/blog/Node/115
April 2012, Daniel Gentleman, thoughtfix.com
*/
#include < Wire.h >
#include < Time.h >
#include < DS1307RTC.h > / / DS3231/ChronoDot fungerar som DS1307
LCD grejer:
#include < Adafruit_GFX.h >
#include < Adafruit_PCD8544.h >
Adafruit_PCD8544 display = Adafruit_PCD8544 (7, 6, 5, 4, 3);
stift 7 - seriell klocka ut (SCLK)
stift 6 - seriell data ut (DIN)
stift 5 - Data/kommandot Välj (D/C)
stift 4 - LCD chip Välj (CS)
stift 3 - LCD reset (RST)
Ställa in variabler:
tid avsluta; Dag och tid för senaste röken
tid difftime; skillnaden mellan nuvarande och sluta tid
int diff_seconds;
int diff_minutes;
int diff_hours;
int diff_days;
flyta PackCost = 6,50; Kostnad per pack. US $6,50
flyta PackDay = 1,5; Rökning frekvens. 1.5 förpackningar/dag
float MinutesQuit;
float CostPerHour;
float CashSaved;
Initiera RTC och LCD
void setup() {
Serial.BEGIN(9600); Ange baud till 9600
display.BEGIN();
display.setContrast(40);
display.clearDisplay();
display.display();
setSyncProvider(RTC.get); ställa in synkronisering till att använda ChronoDot
setSyncInterval(10); Synkronisera var 10 sekunder om möjligt
Kontrollera om sync arbetat
IF(timeStatus()! = tidInställning)
Serial.println ("kan inte synkronisera med RTC");
annat
Serial.println ("RTC har angett systemtiden");
tmElements_t quit_elements; element array till datum för att sluta röka.
Midnatt den 1 April, 2012
quit_elements. För det andra = 0;
quit_elements. Minut = 0;
quit_elements. Timme = 0;
quit_elements. WDAY = 7.
quit_elements. Dag = 1;
quit_elements. Månad = 4;
quit_elements. År = 2012-1970;
avsluta = makeTime(quit_elements); Unix-tidsstämpel avsluta datum/tid
Delay(1000);
}
tid systime; innehar aktuell tid för diff beräkning
void loop() {
om (systime! = now()) {/ / vänta på nya andra att göra något
systime = now();
difftime = systime - avsluta; subtrahera avsluta tid från aktuell tid
diff_seconds = difftime % 60. få sekunder
difftime = 60. konvertera till minuter
diff_minutes = difftime % 60. få minuter
difftime = 60. konvertera till timmar
diff_hours = difftime % 24. få timmar
difftime = 24. konvertera till dagar
diff_days = difftime; få dagar
}
DisplayTime();
Delay(1000);
display.clearDisplay();
}
modifierade rutin från Time Library exempel
void DisplayTime() {
MinutesQuit = ((systime-quit)/60);
CashSaved = ((PackCost * PackDay * MinutesQuit) / 1440);
Första, LCD
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.Print(diff_days);
display.Print ("d");
display.Print(diff_hours);
display.Print(":");
IF(diff_minutes < 10)
display.Print('0');
display.Print(diff_minutes);
display.Print(":");
IF(diff_seconds < 10)
display.Print('0');
display.Print(diff_seconds);
display.setCursor(0,10);
display.println ("rök fri!");
display.setCursor(0,30);
display.Print("$");
display.Print(CashSaved);
display.println ("sparade");
display.display();
Valfritt: seriell
Serial.Print(diff_days);
Serial.Print ("d");
Serial.Print(diff_hours);
Serial.Print(":");
IF(diff_minutes < 10)
Serial.Print('0');
Serial.Print(diff_minutes);
Serial.Print(":");
IF(diff_seconds < 10)
Serial.Print('0');
Serial.Print(diff_seconds);
Serial.println ("rök fri!");
}