Stap 21: Volledige Code voor ATMEGA 328P Chip
MASTER Zie verbonden tekstbestand voor volledige details. < br > #include #include lange startMS; Dit zal houden de begintijd in milliseconden int windCounterStatus = laag; int rainCounterStatus = hoog; int resetStatus = laag; int val = 0; int val1 = 0; int val2 = 0; int ratten = 0; aantal ratten ontdekt int muizen = 0; aantal muizen ontdekte niet-ondertekende lange regen = 0; unsigned long previousRain = 0; int windSpeedInputPin = 2; int rainInputPin = 3; int resetWatcherPin = 4; Ontvangt een puls van pin 5 op de slaaf. int powerToWindDirPin = 7; int sleepModePin = 8; int resetFonaPin = 9; Const int ledPin = 13; unsigned long rainPulses = 0; unsigned long windPulseRate = 0; unsigned long maxWindPulseRate = 0; unsigned long avWindPulseRate = 0; unsigned long addingWindPulseRate = 0; int resetEverything = 0; int moisturePin = a1 worden verkregen; int moisturePowerPin = 10; unsigned long moistureValue = 0; unsigned long futureRainDebounceValue = 0; int n = 0; int r = 0; int i = 0; int ledState = laag; int sleepMode = laag; unsigned long previousLongMillis = 0; unsigned long previousShortMillis = 0; unsigned long previousMillis = 0; Const lange veryShortInterval = 50; Const lange shortInterval = 5000; Const lange longInterval = 600000; 60000 = 1 minuut const lange rainDebounceValue = 10000; int windrichting = 0; int windDirection2 = 0; int windDirection3 = 0; int een = 0; int twee = 0; int drie = 0; int vier = 0; int vijf = 0; int zes = 0; int zeven = 0; int acht = 0; int antwoord = 0; void setup {Wire.begin(); pinMode (ledPin, OUTPUT); pinMode (sleepModePin, OUTPUT); pinMode (powerToWindDirPin, OUTPUT); pinMode (resetFonaPin, OUTPUT); pinMode (windSpeedInputPin, INPUT_PULLUP); pinMode (rainInputPin, INPUT_PULLUP); pinMode (resetWatcherPin, INPUT_PULLUP); pinMode (moisturePowerPin, OUTPUT); digitalWrite(sleepModePin,HIGH); digitalWrite(powerToWindDirPin,LOW); delay(2000); tone(6,500,1000); digitalWrite(resetFonaPin,HIGH); delay(100); digitalWrite(resetFonaPin,LOW); Serial.begin(115200); Serial.println ("starten van wind en regen opname...");} void loop {< p > unsigned long currentMillis = millis(); / / Millis gaat terug naar nul na 50 dagen windCounter(); / / Wind pols tellen functie-rainCounter(); resetCounter(); sleepModeFunction(); resetFonaFunction(); windDirectionCalc(); als (currentMillis - previousLongMillis < = longInterval) / / opmerking dat we nooit de functie 'vertraging' tijdens deze instructie 'als' gebruiken. {/ / / Als (currentMillis - previousShortMillis < = veryShortInterval) / / / dit een puls 5V naar windsensor richting voor een zeer korte interval stuurt. {digitalWrite(powerToWindDirPin,HIGH); windDirection3 = analogRead(0); tone(6,(windDirection3+300));} else {digitalWrite(powerToWindDirPin,LOW); noTone(6);} / / / als (currentMillis - previousShortMillis > = shortInterval) {/ / / / / als ((n>10) & & (n < 120)){tone(6,((answer*15)+400));} else {noTone(6);} / / gebruikt voor het debuggen van de wind richting sensor. / / / windPulseRate = 100 * rats/(shortInterval/1000); addingWindPulseRate = addingWindPulseRate + windPulseRate; n = n + 1; myMode(); / / berekent de windrichting modus
. Serial.println(""); Serial.Print ("vocht waarde is:"); Serial.Print(moistureValue); Serial.println ("%"); Serial.Print ("Millis ="); Serial.println(currentMillis); Serial.Print ("Wind polsslag per micro seconde ="); Serial.println(windPulseRate); Serial.Print ("gemiddelde wind polsslag per micro seconde ="); Serial.println(avWindPulseRate); Serial.Print ("n ="); Serial.println(n); Serial.Print ("r ="); Serial.println(r); Serial.Print ("Maximum wind polsslag per micro seconde ="); Serial.println(maxWindPulseRate); Serial.Print ("regen val ="); Serial.println(Rain); Serial.Print ("resetEverything ="); Serial.println(resetEverything); Serial.Print ("Wind richting ="); Serial.println(windDirection2); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// previousShortMillis = currentMillis; Ik = 0; ratten = 0; } Als (windPulseRate > maxWindPulseRate) {maxWindPulseRate = windPulseRate; Serial.Print ("Maximum wind polsslag per micro seconde ="); Serial.println(maxWindPulseRate); } Als (regen > previousRain) {previousRain = regen;}} else {avWindPulseRate = addingWindPulseRate/n; windrichting = antwoord; Serial.Print ("mediaan windrichting voor draad ="); Serial.println(windDirection); Wire.beginTransmission(9); verzenden naar apparaat #9 / / ervoor zorgen dat de volgorde is hetzelfde in master en slave. digitalWrite (moisturePowerPin, hoge); delay(10); Wire.write(maxWindPulseRate/10); Waarden moeten niet groter is dan 255 (1 byte). delay(10); Wire.write(windDirection); Een mediane getal tussen 1 en 8 inclusief. delay(10); Wire.write(Rain); moistureValue = analogRead (moisturePin) * 0.102; De sensor is gekalibreerd door te vermenigvuldigen met 0.102. delay(10); Wire.write(avWindPulseRate/10); delay(10); Wire.write(moistureValue); delay(10); digitalWrite (moisturePowerPin, laag); Wire.endTransmission(); stoppen met het verzenden van resetMyMode(); Voor deze functie Foutopsporing mag niet in resetEverything als verklaring. previousLongMillis = currentMillis; addingWindPulseRate = 0; avWindPulseRate = 0; n = 0; r = r + 1; graven tot een bepaalde periode waartegen fona wordt teruggesteld in veelvouden van de wat lange interval is ingesteld op. } if(resetEverything > 0) / / Dit is de aanroep terug naar het zeggen van succesvolle datatransmissie naar HTTP. {tone(6,((answer*15)+400),1000); maxWindPulseRate = 0; regen = 0; previousRain = 0; resetEverything = 0;} } / / / / / / void windCounter() {val = digitalRead(windSpeedInputPin); / / Lees invoerwaarde als (val == HIGH) {/ / controleren als de ingang hoog is als (windCounterStatus == LOW) {/ / we zojuist hebt ingeschakeld windCounterStatus = HIGH; digitalWrite(ledPin,HIGH); / / Serial.print ("pulsen ="); Serial.println(Rats); ratten = ratten + 1; {}} else {als (windCounterStatus == HIGH) {windCounterStatus = laag; digitalWrite(ledPin,LOW);}}} / / / void resetCounter() {val1 = digitalRead(resetWatcherPin); / / Lees invoerwaarde als (val1 == HIGH) {/ / controleren als de ingang hoog is als (resetStatus == LOW) {/ / we zojuist hebt ingeschakeld resetStatus = hoog; / / digitalWrite(ledPin,HIGH); / / Serial.print ("resetEverything ="); Serial.println(resetEverything); resetEverything = 1; {}} else {als (resetStatus == HIGH) {resetStatus = laag; / / digitalWrite(ledPin,LOW);}}} VOID rainCounter () {val2 = digitalRead(rainInputPin); / / Lees invoerwaarde als (val2 == HIGH) {/ / controleren als de ingang hoog is als (rainCounterStatus == LOW) {/ / wij zojuist rainCounterStatus hebt ingeschakeld = HIGH; digitalWrite(ledPin,HIGH); muizen = muizen + 1;}} anders {als (rainCounterStatus == HIGH) {rainCounterStatus = laag; digitalWrite(ledPin,LOW);}} / / Debounce (we vermoeden dat de muizen te hoog is): unsigned long currentMillis = millis(); als ((mice > 0) & & ((currentMillis - previousShortMillis) > (shortInterval - 10))) {regen = regen + 1; muizen = 0;}} / / / void windDirectionCalc () {als ((windDirection3 > -1) & & (windDirection3 < 20)) {windDirection2 = 1;} als ((windDirection3 > 20) & & (windDirection3 < 60)) {windDirection2 = 2;} als ((windDirection3 > 60) & & (windDirection3 < 120)) {windDirection2 = 3;} als ((windDirection3 > 200) & & (windDirection3 < 250)) {windDirection2 = 4;} als ((windDirection3 > 345) & & (windDirection3 < 400)) {windDirection2 = 5;} als ((windDirection3 > 310) & & (windDirection3 < 345)) {windDirection2 = 6;} als ((windDirection3 > 250) & & (windDirection3 < 310)) {windDirection2 = 7;} als ((windDirection3 > 120) & & (windDirection3 < 200)) {windDirection2 = 8;}} /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void sleepModeFunction () { if ( (n > 110)|| (n<10)) {digitalWrite(sleepModePin,HIGH);} else {digitalWrite(sleepModePin,LOW);}} VOID resetFonaFunction () {als (r > 143) / / reset fona één keer per 24 uur. Dit moet veranderen terug naar r > 143. {digitalWrite(resetFonaPin,HIGH); delay(100); digitalWrite(resetFonaPin,LOW); r = 0;} } / / / / / / void myMode() / / berekent de windrichting modus (de waarde bevatten meestal). {Als (windDirection2 == 1) {één = + 1;} als (windDirection2 == 2) {twee = 2 + 1;} als (windDirection2 == 3) {drie = drie + 1;} als (windDirection2 == 4) {vier = vier + 1;} als (windDirection2 == 5) {vijf = vijf + 1;} als (windDirection2 == 6) {zes = zes + 1;} als (windDirection2 == 7) {zeven = zeven + 1;} als (windDirection2 == 8) {acht = 8 + 1;} als ((één > twee) & &(one>three) & &(one>four) & &(one>five) & &(one>six) & &(one>seven) & & (één > 8)) {antwoord = 1;} als ((twee > één) & &(two>three) & &(two>four) & &(two>five) & &(two>six) & &(two>seven) & &(two>eight)) {antwoord = 2;} als ((drie > één) & &(three>two) & &(three>four) & &(three>five) & &(three>six) & &(three>seven) & &(three>eight)) {antwoord = 3;} als ((vier > één) & &(four>two) & &(four>three) & &(four>five) & &(four>six) & &(four>seven) & &(four>eight)) {antwoord = 4;} als ((vijf > één) & &(five>two) & &(five>three) & &(five>four) & &(five>six) & &(five>seven) & &(five>eight)) {antwoord = 5;} als ((zes > één) & &(six>two) & & (zes > drie) & &(six>four) & &(six>five) & &(six>seven) & &(six>eight)) {antwoord = 6;} als ((zeven > één) & &(seven>two) & &(seven>three) & &(seven>four) & &(seven>five) & &(seven>six) & &(seven>eight)) {antwoord = 7;} als ((acht > één) & &(eight>two) & &(eight>three) & &(eight>four) & &(Eight>Five) & &(eight>six) & &(eight>seven)) {antwoord = 8;} Serial.Print ("mijn modus waarde is:"); Serial.println(answer); } ongeldig resetMyMode() {één = 0; twee = 0; drie = 0; vier = 0; vijf = 0; zes = 0; zeven = 0; acht = 0; antwoord = 0;} < /p >