Arduino GPRS väderstation - del 1 (14 / 23 steg)
Steg 14: Master och Slave (I²C)
Det finns tre skäl till varför jag har inrättat registeransvariga som master och slave:
- Att skapa ett "viloläge" så att energi sparas.
- Se till att vind och regn data aldrig avbryts av långsammare kommunikationen med en GPRS-modul. Ställa in GPRS verkar ta ca 20 sekunder.
- Tillförlitlighet: Kraschar ibland Mega 2560.
Huvudprincipen för detta meddelande kallas I²C, (Inter-Integrated krets), uttalas I-fyrkant-C, vilket är väl dokumenterat här:
https://www.Arduino.cc/en/tutorial/MasterWriter
I min kod tillbringar 328 P 10 minuter samla in data i 5 sekunders intervall, i slutet som den skickar data via I²C till Arduino Mega 2560 styrelsen för efterföljande leverans till internet via GPRS etc. Koden för att göra detta är ganska enkelt så länge heltalen är varje mindre än 255. Detta innebär absolut inga decimaler och vi kan inte skicka ett värde till exempel 270 för vindriktningen. Inget av detta är ett problem som vi förändrar alla vind vinklar till enkla siffror t.ex. 4 == 180 grader.
Här är en kodutdrag för tråd överföring:
annat {
avWindPulseRate = addingWindPulseRate/n;
windDirection = svar;
Serial.Print ("Median vindriktning för tråd ="); Serial.println(windDirection);
Wire.beginTransmission(9); överföra till enhet #9 / / kontrollera att beställningen är densamma i master och slav.
digitalWrite (moisturePowerPin, hög);
Delay(10);
Wire.write(maxWindPulseRate/10); Värden får inte vara större än 255 (1 byte).
Delay(10);
Wire.write(windDirection); En median siffra mellan 1 och 8 inclusive.
Delay(10);
Wire.write(Rain);
moistureValue = analogRead (moisturePin) * 0.102; Sensorn kalibreras genom att multiplicera med 0.102.
Delay(10);
Wire.write(avWindPulseRate/10);
Delay(10);
Wire.write(moistureValue);
Delay(10);
digitalWrite (moisturePowerPin, låg);
Wire.endTransmission(); stoppa överföring
resetMyMode(); För felsökning av denna funktion inte bör vara i resetEverything om uttalande.
previousLongMillis = currentMillis;
addingWindPulseRate = 0;
avWindPulseRate = 0;
n = 0;
r = r + 1. räknas upp till en tidsperiod som fona återställs i multiplar av vad långa intervall är inställd.
}
Här är en kodutdrag för att ta emot data på Mega 2560:
void receiveEvent (int byte) {/ / kontrollera att beställningen är densamma i master och slav. delay(10);
maxWindPulseRate = Wire.read();
Delay(10);
windDirection = Wire.read();
Delay(10);
regn = Wire.read();
Delay(10);
avWindPulseRate = Wire.read();
Delay(10);
moistureValue = Wire.read();
Delay(10);
z = 1;
fukt = moistureValue;
}