Med hjälp av sensorer, 433Mhz RF moduler och Adafruit's BLE Bluefruit chip för att samla uppgifter om Smartphone med Evothings Studio (3 / 6 steg)
Steg 3: Arduino sändarmodul
Vi kommer börja med att göra sändarna. De är alla byggda och kodas på samma sätt, den enda skillnaden är det identifikationsnummer som vi kommer att lägga till i koden. Låt oss börja med att binda den upp.
Jag använde stift 2 på Arduino för mottagarendata pin och pin 3 för sändarendata stift. Mottagaren har 2 identiska data stift, behöver du bara använda en. Fotocellen är ansluten till pin A0 på Arduino. Dock måste du använda en resistor ansluten till en av de fotocell stift. För mesta, en 10 k Ω motstånd är nog, men om du planerar att använda den i ett ljust rum, du kan behöva ersätta den med en 1 k Ω motstånd, eftersom det förmodligen kommer att mätta.
Nu ska vi gå till koden. Vi kommer att använda ett bibliotek kallas RadioHead skicka och fick meddelande med RF-sändare/mottagare. Det du behöver är som kallas RH_ASK, som står för RadioHead Amplitude Shift Keying. Du hittar den på denna webbplats. Du behöver även SPI (Serial Peripheral jagnterface) biblioteket som används för kommunikation mellan två mikrokontroller. Det är inte används i koden som behövs för att kompilera den.
#include < RH_ASK.h > / / Radiohead bibliotek för RF-moduler#include <SPI.h > / / faktiskt inte används men behövs för att sammanställa
Nästa steg är att skapa RH_ASK-objektet att vi kommer namn driver. Om du inte anger några parametrar, kommer det att skapas med standardinställningarna som är:
- Hastighet = 2000bps
- RX stift = 11 (Rpostob)
- TX pin = 12 (Transmit)
- PTT pin = 10 (Push to talk)
Som jag använder stift 2 och 3, kommer jag ange dessa parametrar. Typ av RF-moduler använder vi har inte funktionen Ptt, så du kan ignorera det, om inte du ansluter något till pinne 10, i vilket fall måste du ställa in Ptt nåla fast till en oanvända pin (eller -1) eftersom det kommer att orsaka några störningar annars.
RH_ASK driver (2000, 2, 3); Ställa in RX stift (mottagare) till 2 och TX stift (sändare) till 3Här är de globala variabler som används i koden:
Variabeln rum är den Arduino identifikationsnummer. Behöver du öka det för varje sändare Arduino du använder.
Variabeln startRequest består av bokstaven "a" följt av ID-numret. Sändaren Arduino att jämföra begäran tas emot från "modern" Arduino till denna sträng. Om de matchar sedan skickas tillbaka data läsa från sensorn.
Variabeln photocellPin är PIN-koden som fotocellen är ansluten.
Variabeln photocellReading lagrar värdet läsa från fotocellen.
String startRequest = "a"String(room); Begäran skickas av "modern" Arduino
constint photocellPin = A0; Fotocell pin
int photocellReading; Variabel för att lagra fotocell behandlingen
Det setup är ganska enkelt. Du måste ställa in fotocell PIN-koden till INPUT -läge och om du vill starta den seriell kommunikationen för felsökning.
voidsetup(){
pinMode (photocellPin, ingång);
Seriella.begin(9600); För felsökning
om (! driver.init()) / / om RF-moduler strandat till starta
Seriella.println ("init misslyckades");
}
Vi kommer att skriva koden som hanterar mottagandet av begäran och för överföring av data i loop delen. Vi börjar med att skapa en 2 byte lång buffert som kommer att lagra mottagna begäran. Uint8_t formatet är detsamma som ett byte, och innebär osignerat heltal av längd 8 bitar. Vi måste också ange dess längd i variabeln buflen .
voidloop(){
uint8_t buf [2]. Buffert används för att lagra mottagna begäran, dess storlek är inställd på 2 byte som begäran är: "en" + String(room) (t.ex. a0)
uint8_t buflen = sizeof(buf);
När RF-mottagare får ett meddelande av storleken buflen, lagras det i buf. Eftersom formatet för meddelandet är en matris med byte, måste vi förvara den i en string-variabel för att jämföra det med förväntade begäran. Detta görs genom att tilldela variabeln buf , föregås av (char *). Observera att den * innebär att tecken skapat pekare till byte, som inte används någon ytterligare lagring.
När jag testade detta, fick jag ibland begäran följt av några konstiga tecken vilket gjorde jämförelsen omöjligt. Jag kommer därför hålla bara de två första tecknen i meddelandet med hjälp av sträng funktion delsträng.
om (driver.recv (buf, och buflen)) / / vid mottagandet av en begäran
{
Sträng begäran = (char *) buf; Lagra begäran i en sträng för jämförelse
begäran = request.substring (0, 2); Meddelandet som mottogs följs ibland av konstiga tecken, att hålla bara två första
Seriella.print ("Got begäran:"); Skriva ut mottagna begäran för felsökning
Seriella.println(request);
Nu när vi har vår begäran lagras i en strängvariabel, kan vi jämföra det på begäran som vi förväntat oss, vilket är startRequest som vi skapade i början.
om (begäran == startRequest) / / om begäran matchar denna Arduino startbegäran, mäter data och skicka det{
Seriella.println ("startbegäran fick");
Seriella.println("");
Delay(150);
Om mottagna begäran matchar startRequest, har Arduino att skicka tillbaka några data. Så vi börjar med att läsa denna data, i detta fall från fotocellen med funktionen analogRead och lagrar det i variabeln photocellReading . Detta ger oss ett värde mellan 0 och 1023, men detta är inte praktiska för parsning som värdet längd varierar. Vi kommer därför funktionen karta till karta värdet till ett nummer mellan 100 och 999, så att det är alltid 3-siffrigt.
Skicka dataSeriella.println ("skicka data");
Seriella.println("");
photocellReading = analogRead(photocellPin); Mäta ljusstyrka
Seriella.print ("fotocell behandlingen:");
Seriella.println(photocellReading); För felsökning
Mappa data till ett nummer mellan 100 och 999 så att det är alltid 3 siffror lång, vilket gör det lättare att tolka av modern Arduino
int mapPhotocellReading = karta (photocellReading, 0, 1023, 100, 999);
När vi har våra data korrekt mappade, måste vi skicka det till "modern" Arduino. Se till att det inte blanda ihop data, vi lägger till rummets ID-nummer i början av meddelandet kommer vi att skicka. Efter att vi skapar en char-matris (1 byte längre än meddelande) och kopiera vårt budskap till den med snöre funktion toCharArray.
String str = rum + String(mapPhotocellReading); Att skapa en sträng som innehåller rumsnummer och läsning så att "modern" Arduino vet var den kommer ifrånröding data [5]. Char matris för lagra svar, måste vara 1 byte längre som stränglängden
str.toCharArray (data, 5); Kopiera strängen till char array
Nu allt som är kvar för att göra är att skicka meddelandet. Detta görs med hjälp av Skicka metoden för objektet föraren på ett meddelande i formatet uint8_t . Metoden waitPacketSent används för att se till att data skickas helt innan resten av koden
driver.send ((uint8_t *) data, strlen(data)); Skicka svardriver.waitPacketSent(); Väntar tills svarspaket skickas helt
Seriella.print ("Data som skickas:"); För felsökning
Seriella.println(data);
Seriella.println("");
}
}
}