Ansluta Arduino Uno till Android via Bluetooth (3 / 6 steg)

Steg 3: Arduino kod - Detaljer

Kommandot och meddelande struktur som beskrivs i föregående steg

Seriella parametrar: COM11 9600 8 N 1
\r eller \n att avsluta kommandoraden
Bluetooth är på stift 0 & 1 @ 9600 hastighet

Kommandot struktur / / CMD RED| GREEN| GUL = ON| UTANFÖR
CMD TMAX| SEKUNDER = värde
CMD sekunder = värde
CMD STATUS

Status meddelandestruktur
STATUS RED| GREEN| YELLOW| TMIN| TMAX| SECONDS| TEMP| LÅR = värde

Initiering av variabler som behövs för temperaturkontroll

flyta maxTemp = 30,0; slå på ledde när temp > maxTemp
int maxTempSensor (int) = ((maxTemp/100 +.5) * 204,8);
flyta temperatur = 0,0;

maxTemp kan senare ändras, men programmet behöver ett standardvärde till att börja med. maxTempSensor är omvandlingen av maxTemp till 0-1023 utbud som tillhandahålls av Arduino ADC omvandlare; temperaturen jämförelse kommer att utföras av ett avbrott rutin som vi vill så fort som möjligt: det är effektivare att direkt jämföra heltalet Pin produktionen värde i stället för float temperaturen. Vi vill fortfarande att rapportera temperaturen och programmet lagrar det i variabeln med samma namn.
Om du inte är bekant med konverteringsformeln temperatur, kan du ta en titt här.

maxSeconds kan också ändras med ett kommando men behöver vi en standard

int maxSeconds = 10; Skicka statusmeddelande varje maxSeconds

Förklaringar av Pin konstanter

CONST int ledPin = 13. temperatur som ledde

CONST int tempPin = A0; T36 temperatur sensor analoga ingångsstift

CONST int led1Pin = 3; Gul
CONST int led2Pin = 4; Grön
CONST int led3Pin = 5; Röd

Variabler används i rutinen avbrott och tillgängliga från utsidan av det

flyktiga int tempVal;
flyktiga int sekunder = 0;
flyktiga boolean tempHigh = false;
flyktiga boolean statusReport = false;

Volatile är ett speciella nyckelord som hindrar att kompilatorn utför vissa optimeringar: alla variabler som ändras inom ett avbrott rutin och är också nås utanför det måste deklareras som volatile att signalera att deras värde kan ändra när som helst och för att se Senast, korrekt, värdet avläses minne när det behövs.

Kommandot strängvariabler (de kommer att förklaras senare)

String inputString = "";
String kommando = "";

String value = "";
booleska stringComplete = false;

Funktionen setup()

void setup() {
Starta seriell anslutning
Serial.BEGIN(9600);
Serial.Print (Max T:");
Serial.Print(maxTemp);
Serial.Print ("Sensor:");
Serial.println(maxTempSensor);

inputString.reserve(50);
Command.Reserve(50);
Value.Reserve(50);

pinMode (ledPin, produktionen);
digitalWrite (ledPin, låg);

pinMode (led1Pin, produktionen);
pinMode (led2Pin, produktionen);
pinMode (led3Pin, produktionen);
digitalWrite (led1Pin, låg);
digitalWrite (led2Pin, låg);
digitalWrite (led3Pin, låg);

Metoden reserv i en sträng allokerar antalet byte som anges som argument.

Följande kod behövs för att initiera på timer avbryta och ställa in den att skjuta varje sekund, den långsammaste den Arduinoen kan göra; för detaljerad information se här.

CLI(); Inaktivera globala avbryter

initiera Timer1 för avbrott @ 1000 MSEK
TCCR1A = 0; satt hela TCCR1A register till 0
TCCR1B = 0; samma för TCCR1B

Set jämför match register till önskad timer räkning:
OCR1A = 15624; slå på CTC-läge:
TCCR1B | = (1 << WGM12);
Anger CS10 och CS12 bitar för 1024 prescaler:
TCCR1B | = (1 << CS10);
TCCR1B | = (1 << CS12);
Aktivera timern jämför avbrott:
TIMSK1 | = (1 << OCIE1A);

SEI(); Aktivera global avbryter

}

Timer-avbrott rutin: vi kan inte byta namn, men innehållet är helt anpassningsbara.

ISR(TIMER1_COMPA_vect)
{
tempVal = analogRead(tempPin);

om (tempVal > maxTempSensor) {
digitalWrite (ledPin, hög);
tempHigh = sant;
}
annat {
digitalWrite (ledPin, låg);
tempHigh = false;
}

Temperaturvärde - eller, som diskuterats ovan sin 0-1023 heltal representation - läses från sensorn och jämförs med den tröskelvärdet: när ovanför inbyggd LED lyser och tempHigh är inställt på true, annars LED är avstängd andtempHigh sätts till false.

om (sekunder ++ > = maxSeconds) {
statusReport = sant;
sekunder = 0;
}

}

Kom ihåg att avbrottet avfyras varje sekund, men vi vill rapportera systemets status mindre ofta: sekunder variabeln ökas efter varje iteration tills den når värden när rapporten är oberättigat. Detta kommer att ske senare i de viktigaste loopen genom att kontrollera statusReport flagga. Som regel aldrig aldrig utföra något så sakta skriva uppgifterna vidare till följetong från inom en avbrott rutin.

Funktionen loop() tolkar och kör kommandon när emot, det rapporterar sedan status om flaggan tas upp av timer-avbrott. För att läsa en sträng från seriella bufferten, loop() förlitar sig på den serialEvent() funktion som kommer att definieras i slutet: denna rutin körs mellan varje gång loop() körs. Det är inte väldokumenterat och det förmodligen gäller inte för alla Arduino modeller; i vilket fall är det inte svårt att kapsla dess innehåll inom viktigaste kretsar (se slutet av thi steg).

void loop() {
int intValue = 0;

om (stringComplete) {
Serial.println(inputString);
booleska stringOK = false;
om (inputString.startsWith ("CMD")) {
inputString = inputString.substring(4);

Vi kontrollera först om den mottagna strängen börjar med "CMD": om så vi kan ignorera de första fyra tecknen, annars vi ska senare höja ett fel.

int pos = inputString.indexOf('=');
om (pos > -1) {
kommandot = inputString.substring (0, pos);
värde = inputString.substring (pos + 1, inputString.length()-1); extrahera kommandot upp till \n studerandena

Det finns två typer av kommandon: ställa in ett värde, där hittar vi "=" separera variabel + värdeparet, och de där kommandot är ett enda direktiv (STATUS). Om "=" vid pos, är strängen uppdelade i kommandot (vänstra delen) och värde (högra delen), släppa både den "=" i mellan och end-of-line karaktär i slutet.

om (command.equals("RED")) {/ / röd = ON| UTANFÖR
Value.equals("on")? digitalWrite (led3Pin, hög): digitalWrite (led3Pin, låg);
stringOK = sant;
}
annat if (command.equals("GREEN")) {/ / grön = ON| UTANFÖR
Value.equals("on")? digitalWrite (led2Pin, hög): digitalWrite (led2Pin, låg);
stringOK = sant;
}
annat if (command.equals("YELLOW")) {/ / gul = ON| UTANFÖR
Value.equals("on")? digitalWrite (led1Pin, hög): digitalWrite (led1Pin, låg);
stringOK = sant;
}

Vi undersöker och LED kommandon; Observera att koden endast kontrollerar att värdet på: om du skriver grön = ASD det kommer att tolkas som grön = OFF. Det är inte perfekt, men den håller saker mycket enklare. stringOK = true anges varje gång ett kommando är erkänt och utförs så att fel kommandon kommer att flaggas senare.

annat if (command.equals("TMAX")) {/ / TMAX = värde
intValue = value.toInt();
om (intValue > 0) {
maxTemp = (float) intValue;
maxTempSensor = (int) ((maxTemp/100 +.5) * 204,8);
stringOK = true;
}
}
annat if (command.equals("SECONDS")) {/ / sekunder = värde
intValue = value.toInt();
om (intValue > 0) {
maxSeconds = intValue;
stringOK = true;
}
}

När värdet bör vara ett nummer, måste vi konvertera samt test det är verkligen ett nummer. När det gäller MaxTemp beräkna vi också värdet sensor som förklaras i avsnittet variabel definition

} / / pos > -1
annat if (inputString.startsWith("STATUS")) {
Serial.print ("STATUS röd =");
Serial.println(digitalRead(led3Pin));
Serial.print ("STATUS grön =");
Serial.println(digitalRead(led2Pin));
Serial.print ("STATUS gul =");
Serial.println(digitalRead(led1Pin));
Serial.print ("STATUS TMAX =");
Serial.println(maxTemp);
Serial.print ("STATUS sekunder =");
Serial.println(maxSeconds);
Serial.print ("STATUS TEMP =");
Serial.println(temperature);
Serial.print ("STATUS lår =");
Serial.println(tempHigh);
stringOK = true;
} / / inputString.startsWith("STATUS")

Om kommandot är STATUS, utgångar programmet helt enkelt all information till följetong.

} / / inputString.startsWith ("CMD")
stringOK? Serial.println ("kommandot körs"): Serial.println ("Ogiltigt kommando"),

Signal om ett giltigt eller ogiltigt kommando har mottagits.

Rensa strängen för nästa iteration
inputString = "";
stringComplete = false;
} / / stringComplete

Variabel hushållning för nästa kommando iteration.

om (statusReport) {
temperatur = (tempVal * 0.0048828125 -.5) * 100;
Serial.print ("STATUS TEMP =");
Serial.println(temperature);
Serial.print ("STATUS lår =");
Serial.println(tempHigh);
statusReport = false;
}

}

Om rutinen avbrott har höjt flaggan statusReport, viss information skrivs ut på följetong och flaggan är avmarkerad.
Observera att nuvarande temperatur värdet beräknas på denna punkt: därför, om du utfärda en STATUS mellan statusReport intervallet, får du det gamla temperatur värdet.

Som redan nämnts, serialEvent() inträffar när en nya data kommer i hårdvara seriell RX. Denna rutin är köra mellan varje gång loop() körs, så använder dröjsmål inuti loop kan fördröja svar. Finns kanske flera byte data.

void serialEvent() {
samtidigt (Serial.available()) {
få den nya byten:
char inChar = (char)Serial.read();
Lägg till det inputString:
inputString += inChar;
om den inkommande karaktären är en ny rad eller en vagnretur, ange en flagga
så den viktigaste loopen kan göra något åt det:
om (inChar == '\n' || inChar == '\r') {
stringComplete = sant;
}
}
}

Varje byte läses från serial och lagt till ingång strängen tills "\n" eller "\r" påträffas för att beteckna sträng slutet: i detta fall den stringComplete flaggan, som kontrolleras av loop(), ligger. Använder både vagnretur \r och newline, \n, garanterar koden kan upptäcka sträng utgången från en mängd olika ingångar inbegripet andra seriella terminaler än Arduino IDE Serial Monitor.

Anteckning om Bluetooth och följetong

I många exempel, inklusive en från JY-MCU säljare, kan du hitta Bluetooth-modulen ansluten på olika Arduino digital stift (t.ex. 10 och 11) och nås via SoftwareSerial biblioteket. Baserat på resultaten av mina tester, fungerar SoftwareSerial perfekt när modulen används för att skicka information bara, men den Arduino Uno är inte fort nog när tar emot kommandon. Jag inte försökte att minska hastigheten på SoftwareSerial-anslutning (i exemplen det anges ofta till 2400bps) eftersom MIT AppInventor app inte verkar stödja Bluetooth anslutningshastigheten.
Med SoftwareSerial, serialEvent() fungerar inte: man måste byta namn på den (t.ex. mySerialEvent()) och kallar det uttryckligen i början av loop().

Se Steg
Relaterade Ämnen

Ansluta Arduino Uno till Crystalfontz 16 x 2 OLED med bara 4 trådar!

Dessa moduler är ganska trevligt. De är i samma storlek som våra CFAH1602C serien 16 x 2 tecken LCD-moduler, och tunnare som en bonus. Den OLED kontrasten är fantastiska, och de har en skarp blick som är svårslagen. En annan trevlig sak är att de har...

Hur: Anslut din Wiimote till datorn via Bluetooth

Visste du den Wiimotes kapacitet nå långt utanför de användningsområden Nintendo är att begränsa det till? Det är sant, och i denna tutorial kommer jag visa dig hur du ansluter din Wiimote till datorn och öppna upp ett obegränsat utbud av möjligheter...

Med hjälp av Arduino Uno till program ATTINY84-20PU

Med hjälp av Arduino Uno till program ATTINY84-20PU (Newark punkt # 68T3783). Detta Instructable visar hur du använder Arduino plattform för att arbeta med fysiskt mindre processorer, som ATtiny84 (84/44/24), ATtiny85 (85/45/25), och ATtiny2313. Dett...

Arduino - kontroll likströmsmotor via Bluetooth

Hi guys,I detta projekt kommer vi att kontrollera en DC-motor med en smartphone via bluetooth. Detta projekt är bra att lära sig mer om:-DC-motor-Gränssnitt Arduino med din smartphone-Bluetooth-modul-L293DDu kan besöka min hemsida för mer elektronisk...

Programmera en Arduino trådlöst via Bluetooth

En Arduino Uno är en riktigt cool maskinvarudel att komma igång med elektronik, men en nackdel med Arduino är den måste anslutas till datorn med en följetong till USB-kabel varje gång du vill ladda upp koden. I vissa projekt skulle det verkligen prak...

₹1000 PPG signal baserade Heart rate kalkylator och temperatur display med hjälp av arduino uno och android OS

projektet är i grunden en bärbara puls och kroppstemperatur övervakningssystem. Det har styrelsen lcd uppvisning och också stöd för att visa parametrarna på en android-enhet i realtid. Arduino är hjärnan i systemet.Steg 1: Komponenter som krävs* Ardu...

Arduino från Android över Bluetooth

Som min första instructable, jag skulle vilja visa hur du ansluter till en arduino för I/O från en android-enhet snabbt och enkelt.För följande steg behöver vi:En arduino-kompatibel enhetEn HC-05, HC-06 eller liknande bluetooth seriell modul. Vara sä...

Förvandla din Arduino Uno till en USB-HID-Mididevice

medan bygga en Arduino Uno baserat Midi-Controller för Ableton Live, jag kom över HIDUINO projektet (http://code.google.com/p/hiduino/). Det kan du vända din Arduino Uno (eller någon annan enhet med en AVR-USB-chipset som 8u2) i en förarlös HID/MIDI-...

Hur man programmerar en Arduino Uno till Blink

I detta instructable, jag kommer att lära dig hur man programmerar och Arduino Uno blinka. Detta projekt är inte mycket avancerade och är bra för nybörjare.Steg 1: komponenter-Arduino Uno-Lysdioden lyser (valfritt)-Motstånd (behöver inte vara samma s...

Styra arduino med visual studio via bluetooth

Hej alla,Här kommer att vi kontrollera en ledde via bluetooth med din dator av en progam wirtten med visual studiovad du behöver är:1) Arduino (en)2) Bluetooth-modul (hc05 eller hc 06)3) ledde4) 2 motstånd (10ko och 15ko)och du kan göra det ;)alla ko...

Hur till hacka Via BlueTooth

Denna handledning kan du skicka meddelanden och få gratis telefonsamtal på en annans bekostnad. Detta gör också att du kan läsa telefonboken och Inkorgen i hackade enheten.Detta är en BlueTooth hacka handledning av MessMaker.Vänligen prenumerera och...

Ansluta till Blynk med ESP8266 som Arduino Uno wifi sköld (endast Mac)

Detta är en handledning för att visa dig hur du ansluter till Blynk med hjälp av en ESP8266 - 01 som en Arduino Uno wifi sköld. Denna handledning är mycket detaljerad att hjälpa de som är väldigt ny på det här.-Maskinvara som behövs:Arduino UnoHane t...

Hur till restaurera den Arduino UNO R3 ATmega16U2 Firmware med Arduino IDE

Om du har en behov till Re-blixt ATmega16U2 chip med stock firmware återställa Arduino UNO tillbaka till det normala, detta sker ofta på kommandoraden med hjälp av avrdude eller dfu-programmer, eller med programmet Windows Flip. Den lättare väg för m...

Arduino Uno DHT11 LCD-väderstation DIY

Detta är DYI om hur man gör din väderstation med Arduino Uno, DHT11 temperatur och luftfuktighet sensor, LCD-DFRobot 2 x 16 skärm med knappsatsen. Vanligtvis kan du köpa Arduino, DHT11 och LCD separat och sedan varje enhet hs är det egna libranry och...

Styra ledde med Android-telefon via BLE (Bluetooth 4.0), MangoCube App och Arduino UNO

Detta Instructable visar hur att skicka data från Android-enhet att kontrollera lysdioden på Arduino UNO.Du behöver minst av följande komponenter;1. Arduino UNO eller kompatibel styrelse.2. MangoCube BLE styrelsen ( https://www.kickstarter.com/projec...

Anslutning av "saker" via Bluetooth / Android / Arduino

En mycket bra trådlöst lokalt nätverk (och personal) är utan tvekan den Bluetooth (BT). I dag i våra dagliga är vanligt att hitta oss med mobiltelefoner, stereoapparater, kameror, etc., sammankopplade med hjälp av den kända "blå liten ljus".I vä...

Inrätta MangoCube #MangoCube BLE styrelsen (Bluetooth 4.0) med Arduino UNO

Detta enkla Instructable är att visa hur du konfigurerar (set-up) MangoCube BLE styrelse (från Megavizon) med Arduino UNO eller kompatibel styrelsen. Det gör inte kräver några extra komponenter eller 5V till 3.3V logik level shifting.Inget behov av F...

Raspberry Pi Robot kontrollerad via Bluetooth

denna handledning är baserad på en tidigare Instructable -Byggnaden robotar med Raspberry Pi och PythonSyftet är att presentera ett exempel på hur man ställer in en Bluetooth seriell anslutning med Arduino att styra en Raspberry Pi robot. Men kan ta...

DIY öppna GARAGEPORT VIA BLUETOOTH

Hej, alla!Det är är min första instructables och jag presentera min projet öppna dörren med modulen HC-06, servo och en Arduino uno.Jag tycker att det är perfekt när min mamma måste varje dag öppna garageporten när jag kom tillbaka till badminton.Jag...