Textmeddelande i en flaska (4 / 5 steg)
Steg 4: Skriv Program
VIKTIGT: LiquidCrystal bibliotek
Vid tiden för skriver detta kommer LinkIt en IDE med version 1.6.5 av Arduino IDE, som råkar vara en där LiquidCrystal biblioteket som vi använder är bruten. Titta på detta Instructable på hur man ersätta de LiquidCrystal filerna med arbetar de.
Intro
Jag antar att du redan har ställt in din Arduino IDE att arbeta med LinkIt One, om inte, ta en titt på "komma igång" guide över här.
Jag har kopplat min slutliga kod till detta steg, bör du läsa igenom det och dess kommentarer att få en ganska bra uppfattning om hur det fungerar. Jag ska beskriva de viktiga segment här.
Importera bibliotek
Det första steget är att med olika bibliotek som kommer att användas.
#include < LGSM.h >
#include < LiquidCrystal.h >
#include < LBattery.h >
Definiera variabler
Nästa vi definierar olika globala variabler som används i programmet. Du kommer att se att ett antal av dem definieras som "char namn [x]" vilket innebär att de är en matris med x-tecken, som är använda för att lagra saker som textmeddelande eller ett meddelande.
dessa variabler är för sms
char smsContent [160];
int smsLength = 0;
char smsSender [20].
booleska newMessage = låg;
variabler för batteristatus
char statusMessage [16].
initiera LCD-biblioteket med numrerar av gränssnittet stiften
LCD (RS, aktivera, DataBus4, DataBus5, DataBus6, DataBus7)
LiquidCrystal lcd (13, 12, 11, 10, 9, 8);
int scrollInterval = 500.
osignerade långa SenasteUppdatering = 0;
int msgStartChar = 0;
int lcdStartChar = 0;
Setup() funktion
Den här funktionen körs en gång när styrelsen stövlar.
void setup() {
LCD.BEGIN (16, 2); Ange den LCD antal kolumner och rader:
waitForSim(); vänta för simkort vara aktiv
Serial.BEGIN(9600); starta den seriella porten
}
waitForSim() funktion
Resten av programmet fungerar inte om SIM-kortet inte är påbörjas, så denna funktion just håller enheten i en loop, väntar på SIM-kortet vara redo (och skriva ut små prickar på den seriella gränssnittet, så att du vet att det inte har dött).
void waitForSim() {
Serial.Print ("väntar sim");
tag (!. LSMS.ready())
{
Delay(250);
Serial.Print('.');
}
Serial.println ("SIM-Ready");
}
receiveSMS() funktion
Denna funktion kommer att kontrollera om det finns ett nytt SMS. Om det finns en, de läsa i, ett tecken i taget, och förvaras i smsContent buffert (en karaktär array), sedan returnerar funktionen hög (true/1). Om det finns inga nya SMS returnerar funktionen låg (falskt/0). Detta gör att vi kan kalla det så ofta som vi i stora slingan men bara göra något om det finns ett nytt meddelande.
"newMessage" boolean har också angetts till TRUE när ett nytt meddelande tas emot.
När SMS-meddelandet har blivit läst tas bort med kommandot flush().
booleska receiveSMS() {
denna funktion kommer att lagra en ny sms i buffertar
eller returnera false om det finns inga nya sms
int v.
om (LSMS.ready() & & LSMS.available()) / / kolla om det finns nya SMS
{
Serial.println ("det finns nya meddelande.");
newMessage = hög;
LSMS.remoteNumber (smsSender, 20); Spara avsändaren i buffert
smsLength = 0; lagra ett nytt sms
medan (sant)
{
v = LSMS.read();
om (v < 0)
bryta;
smsContent [smsLength] = v;
smsLength ++;
}
smsContent [smsLength] = '\0';
smsLength ++;
LSMS.flush(); ta bort meddelande
returnera hög;
}
annat {
returnera låg;
}
}
chargeStatus() funktion
Denna funktion skapar en 16 tecken textrad om laddningsstatus.
Lbattery.isCharging() returnerar en 1 om batteriet laddas och 0 om det inte är.
Lbattery.level() returnerar 0,33,66 eller 100 beroende på batteriets nuvarande laddningsnivå.
Vi använder funktionen "sprintf" för att formatera utdata från de tidigare två funktionerna i en fin rad med text, som vi lagrar i matrisen statusMessage karaktär för användning i updateDisplay()-funktion.
void chargeStatus() {
IF(LBattery.isCharging()) {
sprintf (statusMessage, "% 3d %% laddning", LBattery.level());
}
annat {
sprintf (statusMessage, "% 3d %% debiteras", LBattery.level());
}
}
updateDisplay() funktion
Det är där alla tidigare skapade innehållet skickas till LCD-skärmen visas. Det kommer att göra det bästa bemärkelse att läsa igenom och titta på de infogade kommentarerna.
Det första att notera är att använda en räknare, som noterar när skärmen uppdaterades senast (i millisekunder, som tillhandahålls av funktionen Arduino millis()), och bara uppdaterar det igen om tillräcklig tid (scrollInterval) har förflutit.
Rullning av meddelandet på den 2: a raden uppnås genom att lagra två variabler:
msgStartChar
Denna variabel lagrar vilken karaktär av SMS innehåll vi skriver ut först (eftersom vi inte kan passa hela 160 tecken sms på en 16 tecken)
lcdStartChar
Denna variabel lagrar var på LCD-skärmen meddelandet börjar, eftersom vi vill att meddelandet att bläddra i från höger, det går inte alltid bara att starta efter det första tecknet.
Varje gång som skärmen uppdateras vi börjar från höger (position 15) och minska lcdStartChar tills meddelandet börjar efter det första tecknet (position 0), detta rullar effektivt meddelandet kvar.
En gång i början av meddelandet är längst till vänster, måste rulla bort-skärm, så vi öka msgStartChar på varje uppdatering.
void updateDisplay() {
denna funktion kommer att rulla meddelandet på en rad och Visa batteristatus å andra
osignerade långa currentMillis = millis();
om (currentMillis - SenasteUppdatering > scrollInterval) {
SenasteUppdatering = currentMillis;
få batteristatus
chargeStatus();
LCD.Clear(); först rensa vi hela lcd
lcd.setCursor (0, 0); ställa markören till första raden
LCD.Print(statusMessage);
skriva ut sms på 2: a raden
om (newMessage == hög) {
msgStartChar = 0; gå till första raden i nya meddelande
lcdStartChar = 15.
newMessage = låg; meddelande behandlas
}
lcdStartChar = max (0, lcdStartChar - 1); flytta en char på meddelandet (för rullning)
lcd.setCursor (0, 1); Ställ in markören till nedersta raden
för (int j = 0; j < = 15; j ++) {
om (j < lcdStartChar) {
LCD.Print("");
}
annars om ((msgStartChar+(j-lcdStartChar)) < (smsLength-1)) {
LCD.Print(smsContent[msgStartChar+(j-lcdStartChar)]);
}
annat {
LCD.Print("");
}
}
om (lcdStartChar < = 0) {
msgStartChar ++; flytta meddelande till vänster
}
om (msgStartChar > = smsLength) {
Serial.println ("slutet av meddelandet");
Vi har kommit till slutet av meddelandet, gå tillbaka till början
lcdStartChar = 15.
msgStartChar = 0;
}
}
}