Stap 3: Arduino zendermodule
We zullen beginnen met de zenders. Ze zijn allemaal gebouwd en gecodeerd op dezelfde manier, het enige verschil is het identificatienummer dat we in de code toevoegen zullen. Laten we beginnen met bedrading het omhoog.
Ik gebruikte pin 2 op de Arduino voor de ontvangergegevens pin en pin 3 voor de zendervan gegevens pin. De ontvanger heeft 2 identieke gegevens pinnen, hoeft u alleen te gebruiken. De fotocel is op A0 pin op de Arduino aangesloten. Echter, u wilt gebruiken een weerstand die is aangesloten op een van de de fotocel pinnen. De meeste van de tijd, een 10 k Ω weerstand is genoeg, maar als u van plan bent om het te gebruiken in een lichte kamer, moet u wellicht te vervangen door een weerstand van 1 k Ω, zoals het waarschijnlijk zal verzadigen.
Nu laten we overgaan tot de code. We zullen het gebruiken van een bibliotheek genoemd RadioHead voor het verzenden en ontvangen bericht met de RF transmitters/ontvangers. De die u nodig hebt is genoemd RH_ASK, wat staat voor RadioHead Amplitude S"hift K" aandacht op. U vindt het op deze website. U moet ook de SPI (Serial Peripheral Interface) bibliotheek die wordt gebruikt voor communicatie tussen twee microcontrollers. Het is niet in de code gebruikt maar die nodig zijn om het te compileren.
#include < RH_ASK.h > / / Radiohead bibliotheek voor RF modules#include <SPI.h > / / niet daadwerkelijk gebruikt, maar nodig om te compileren
De volgende stap is het creëren van het RH_ASK-object dat we bestuurderzal noemen. Als u geen parameters opgeeft, wordt deze gemaakt met de standaardinstellingen die:
- Snelheid = 2000bps
- RX pin = 11 (R-eceive)
- TX pin = 12 (T-ransmit)
- PTT-pin = 10 (Push to talk)
Als ik ben met behulp van pin 2 en 3, zal ik deze parameters opgeven. Het soort RF modules gebruiken we hoeft de Ptt functie, dus u kunt negeren, tenzij u iets verbinden met pin 10, in welk geval u wilt instellen van de Ptt aan spelden een ongebruikte pin (of -1) zoals het zal verstoren sommige anders.
RH_ASK stuurprogramma (2000, 2, 3); RX pin (ontvanger) naar 2 en TX pin (zender) instelt op 3Hier zijn de globale variabelen gebruikt in de code:
De kamer -variabele is het identificatienummer van de Arduino. U wilt het verhogen voor elke zender Arduino u gebruiken.
De startRequest variabele bestaat uit de letter "a" gevolgd door het identificatienummer. De zender Arduino zal het verzoek dat het ontvangt van de "moeder" Arduino naar deze string vergelijken. Als deze overeenkomen, dan stuurt deze terug de gegevens lezen van de sensor.
De photocellPin -variabele is de pin waarop de fotocel is aangesloten.
De photocellReading variabele slaat de waarde van de fotocel leest.
StartRequest koord = "a"String(room); Verzoek tekenreeks die wordt verzonden door de "moeder" Arduino
constint photocellPin = A0; Fotocel pin
int photocellReading; Variabele voor het opslaan van de fotocel lezing
Het deel van de installatie is vrij ongecompliceerd. U moet de fotocel pincode aan ingangsmodus instellen en, als je wilt, beginnen de seriële communicatie voor foutopsporing.
voidsetup(){
pinMode (photocellPin, INPUT);
Seriële.begin(9600); Voor foutopsporing
Als (! driver.init()) / / als de RF modules niet initialiseren
Seriële.println ("init mislukt");
}
In de lus -deel zullen we het schrijven van de code waarmee de ontvangst van aanvragen en de toezending van de gegevens verwerkt. We beginnen met het maken van een lange 2 byte buffer die zal ontvangen verzoek op te slaan. De uint8_t indeling is hetzelfde als een byteen niet-ondertekende integer van lengte 8 bitsbetekent. We moeten ook de lengte opgeven in de buflen -variabele.
voidloop(){
uint8_t buf [2]; Buffer die wordt gebruikt voor het opslaan van ontvangen verzoek, de grootte is ingesteld op 2 bytes omdat het verzoek: "a" + String(room) (bijv. a0)
uint8_t buflen = sizeof(buf);
Zodra de RF-ontvanger een bericht van grootte buflenontvangt, wordt het in de bufopgeslagen. Als de indeling van het bericht een matrix met bytes is, die we willen opslaan in een string-variabele om te vergelijken met de verwachte verzoek. Dit wordt gedaan door het toewijzen van de buf variabele, voorafgegaan door (char *). Merk op dat de * betekent dat de tekens gemaakt verwijzingen naar de bytes zullen, die doet elke extra opslagruimte niet gebruikt.
Toen ik dit getest, ontving ik soms het verzoek gevolgd door sommige rare tekens die de vergelijking onmogelijk maakte. Ik zal daarom alleen de eerste twee tekens van het bericht met behulp van de functie string subtekenreekshouden.
Als (driver.recv (buf, & buflen)) / / na ontvangst van een verzoek{
Tekenreeks verzoek = (char *) buf; De aanvraag opslaan in een tekenreeks voor de vergelijking
verzoek = request.substring (0, 2); Bericht ontvangen wordt soms gevolgd door rare tekens, houden van alleen de eerste twee
Seriële.print ("Got verzoek:"); Afdrukken van de ontvangen verzoek voor foutopsporing
Seriële.println(request);
Nu dat we ons verzoek opgeslagen in een string-variabele hebben, kunnen we vergelijken het met het verzoek die we verwacht hadden, die is startRequest die we in het begin hebt gemaakt.
Als (verzoek == startRequest) / / als de aanvraag overeenkomt met het deze Arduino start verzoek, gegevens meten en stuur het{
Seriële.println ("Start-aanvraag ontvangen");
Seriële.println("");
delay(150);
Als de ontvangen aanvraag overeenkomt met het startRequest, moet de Arduino sommige gegevens terug te sturen. Dus we beginnen met het lezen van deze gegevens, in dit geval van de fotocel met behulp van de functie analogRead en opslaan in de photocellReading -variabele. Dit geeft ons een waarde tussen 0 en 1023, maar dit is niet praktisch om te worden geparseerd als de lengte van de waarde varieert. Wij zullen daarom de functie kaart de waarde toewijzen aan een getal tussen 100 en 999, zodat er altijd 3 cijfers bestaan.
Gegevens verzendenSeriële.println ("verzenden gegevens");
Seriële.println("");
photocellReading = analogRead(photocellPin); Meten van helderheid
Seriële.print ("fotocel lezing:");
Seriële.println(photocellReading); Voor foutopsporing
De gegevens wilt toewijzen aan een getal tussen 100 en 999 zodat er altijd 3 cijfers lang, waardoor het makkelijker te parseren door de moeder Arduino
int mapPhotocellReading = kaart (photocellReading, 0, 1023, 100, 999);
Zodra we onze gegevens correct toegewezen hebben, hebben we te sturen naar de "moeder" Arduino. Om ervoor te zorgen dat het niet up van de gegevens mengen, zullen wij het identificatienummer van de kamer naar het begin van de boodschap die wij zullen toevoegen. Na dat we een char-array (1 byte langer is dan de lengte van het bericht) maken en kopiëren van onze boodschap om gebruik te maken van de functie string toCharArray.
Koord str = kamer + String(mapPhotocellReading); Maken van een tekenreeks met kamernummer en lezen zodat de "moeder" Arduino weet waar het vandaan komtchar gegevens [5]; Char matrix voor reactie, op te slaan moet 1 byte langer dat de lengte van de tekenreeks
str.toCharArray (gegevens, 5); Tekenreeks naar char matrix kopiëren
Nu alles wat overblijft om te doen is om het bericht te verzenden. Dit wordt gedaan met behulp van de methode send van het object van de bestuurder op een bericht in de indeling uint8_t . De waitPacketSent -methode wordt gebruikt om ervoor te zorgen dat de gegevens volledig worden verzonden voordat de rest van de code wordt uitgevoerd
driver.send ((uint8_t *) gegevens, strlen(data)); Reactie verzendendriver.waitPacketSent(); Wachten totdat antwoordpakket wordt volledig verzonden
Seriële.print ("gegevens die worden verzonden:"); Voor foutopsporing
Seriële.println(data);
Seriële.println("");
}
}
}