Paso 21: Código completo para ATMEGA 328p Chip
AMO ver adjunto archivo de texto para detalles completo. < br > #include #include startMS largo; Esto mantendrá la hora de salida en milisegundos int windCounterStatus = bajo; int rainCounterStatus = alto; resetStatus int = bajo; int val = 0; int val1 = 0; int val2 = 0; ratas de int = 0; número de ratas detectado ratones int = 0; número de ratones detecta lluvia larga sin signo = 0; previousRain largo sin signo = 0; int windSpeedInputPin = 2; int rainInputPin = 3; int resetWatcherPin = 4; Recibe un pulso del pin 5 en el esclavo. int powerToWindDirPin = 7; int sleepModePin = 8; int resetFonaPin = 9; const int ledPin = 13; unsigned rainPulses largo = 0; windPulseRate largo sin signo = 0; maxWindPulseRate largo sin signo = 0; avWindPulseRate largo sin signo = 0; addingWindPulseRate largo sin signo = 0; int resetEverything = 0; int moisturePin = A1; int moisturePowerPin = 10; moistureValue largo sin signo = 0; futureRainDebounceValue largo sin signo = 0; int n = 0; int r = 0; int i = 0; int ledState = bajo; sleepMode int = bajo; unsigned previousLongMillis largo = 0; unsigned previousShortMillis largo = 0; unsigned previousMillis largo = 0; const veryShortInterval largo = 50; const shortInterval largo = 5000; const longInterval largo = 600000; 60000 = 1 minuto const rainDebounceValue largo = 10000; int windDirection = 0; int windDirection2 = 0; int windDirection3 = 0; int uno = 0; int dos = 0; int tres = 0; int 4 = 0; int 5 = 0; int 6 = 0; int siete = 0; int 8 = 0; int respuesta = 0; void setup() {Wire.begin(); pinMode (ledPin, salida); pinMode (sleepModePin, salida); pinMode (powerToWindDirPin, salida); pinMode (resetFonaPin, salida); pinMode (windSpeedInputPin, INPUT_PULLUP); pinMode (rainInputPin, INPUT_PULLUP); pinMode (resetWatcherPin, INPUT_PULLUP); pinMode (moisturePowerPin, salida); 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 ("a partir de viento y lluvia grabación...");} void loop() {< p > sin firmar largo currentMillis = millis(); / / Millis vuelve a cero después de 50 días windCounter(); / / viento pulso contando función rainCounter(); resetCounter(); sleepModeFunction(); resetFonaFunction(); windDirectionCalc(); si (currentMillis - previousLongMillis < = longInterval) / / Observe que nunca utilizamos la función de 'delay' durante esta instrucción 'if'. {/ / Si (currentMillis - previousShortMillis < = veryShortInterval) / / envía un pulso de 5V a sensor de dirección del viento para un intervalo muy corto. {digitalWrite(powerToWindDirPin,HIGH); windDirection3 = analogRead(0); tone(6,(windDirection3+300));} Else {digitalWrite(powerToWindDirPin,LOW); noTone(6);} / / si (currentMillis - previousShortMillis > = shortInterval) {/ / / / / si ((n>10) & & (n < 120)){tone(6,((answer*15)+400));} else {noTone(6);} / / uso de depuración viento dirección sensor. / / windPulseRate = 100 * rats/(shortInterval/1000); addingWindPulseRate = addingWindPulseRate + windPulseRate; n = n + 1; myMode(); / / calcula la dirección del viento de modo
. Serial.println(""); Serial.Print ("valor de humedad es:"); Serial.Print(moistureValue); Serial.println ("%"); Serial.Print ("Millis ="); Serial.println(currentMillis); Serial.Print ("pulso de viento por micro segundo ="); Serial.println(windPulseRate); Serial.Print ("pulso de viento promedio por segundo micro ="); Serial.println(avWindPulseRate); Serial.Print ("n ="); Serial.println(n); Serial.Print ("r ="); Serial.println(r); Serial.Print ("pulso de viento máximo por segundo micro ="); Serial.println(maxWindPulseRate); Serial.Print ("caída de lluvia ="); Serial.println(RAIN); Serial.Print ("resetEverything ="); Serial.println(resetEverything); Serial.Print ("dirección del viento ="); Serial.println(windDirection2); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// previousShortMillis = currentMillis; i = 0; ratas = 0; } Si (windPulseRate > maxWindPulseRate) {maxWindPulseRate = windPulseRate; Serial.Print ("pulso de viento máximo por segundo micro ="); Serial.println(maxWindPulseRate); } Si (lluvia > previousRain) {previousRain = lluvia;}} Else {avWindPulseRate = addingWindPulseRate/n; windDirection = respuesta; Serial.Print ("vientos de mediana para alambre ="); Serial.println(windDirection); Wire.beginTransmission(9); transmitir al dispositivo #9 / / asegurarse de que el orden es el mismo en maestro y esclavo. digitalWrite (moisturePowerPin, HIGH); Delay(10); Wire.Write(maxWindPulseRate/10); Valores no deben ser mayores que 255 (1 byte). Delay(10); Wire.Write(windDirection); Un número promedio entre 1 y 8 inclusive. Delay(10); Wire.Write(RAIN); moistureValue = analogRead (moisturePin) * 0.102; El sensor está calibrado multiplique por 0.102. Delay(10); Wire.Write(avWindPulseRate/10); Delay(10); Wire.Write(moistureValue); Delay(10); digitalWrite (moisturePowerPin, bajo); Wire.endTransmission(); interrumpir la transmisión a resetMyMode(); Para depurar esta función no debe estar en resetEverything si declaración. previousLongMillis = currentMillis; addingWindPulseRate = 0; avWindPulseRate = 0; n = 0; r = r + 1; cuenta hasta un período de tiempo en el cual se restablece fona en múltiplos de cualquier intervalo de tiempo se establece en. } if(resetEverything > 0) / / esta es la llamada a decir transmisión de datos exitosa para HTTP. {tone(6,((answer*15)+400),1000); maxWindPulseRate = 0; lluvia = 0; previousRain = 0; resetEverything = 0;} } / / / / / / void windCounter() {val = digitalRead(windSpeedInputPin); / leer valor de entrada si (val == HIGH) {/ / comprobar si la entrada es alto si (windCounterStatus == LOW) {/ / sólo hemos convertido en windCounterStatus = alto; digitalWrite(ledPin,HIGH); / / Serial.print ("pulsos ="); Serial.println(Rats); ratas = ratas + 1; {}} else {si (windCounterStatus == HIGH) {windCounterStatus = bajo; digitalWrite(ledPin,LOW);}}} / / void resetCounter() {val1 = digitalRead(resetWatcherPin); / leer valor de entrada si (val1 == HIGH) {/ / comprobar si la entrada es alto si (resetStatus == LOW) {/ / sólo hemos convertido en resetStatus = alta; / / digitalWrite(ledPin,HIGH); / / Serial.print ("resetEverything ="); Serial.println(resetEverything); resetEverything = 1; {}} else {si (resetStatus == HIGH) {resetStatus = bajo; / / digitalWrite(ledPin,LOW);}}} void rainCounter () {val2 = digitalRead(rainInputPin); / leer valor de entrada si (val2 == HIGH) {/ / comprobar si la entrada es alto si (rainCounterStatus == baja) {/ / sólo hemos convertido en rainCounterStatus = alto; digitalWrite(ledPin,HIGH); ratones = ratones + 1;}} más {si (rainCounterStatus == HIGH) {rainCounterStatus = bajo; digitalWrite(ledPin,LOW);}} / / Debounce (sospechamos que ratones es demasiado alto): sin firmar largo currentMillis = millis(); si ((mice > 0) & & ((currentMillis - previousShortMillis) > (shortInterval - 10))) {lluvia = lluvia + 1; ratones = 0;}} / / void windDirectionCalc () {si ((windDirection3 > -1) & & (windDirection3 < 20)) {windDirection2 = 1;} si ((windDirection3 > 20) & & (windDirection3 < 60)) {windDirection2 = 2;} Si ((windDirection3 > 60) & & (windDirection3 < 120)) {windDirection2 = 3;} si ((windDirection3 > 200) & & (windDirection3 < 250)) {windDirection2 = 4;} Si ((windDirection3 > 345) & & (windDirection3 < 400)) {windDirection2 = 5;} si ((windDirection3 > 310) & & (windDirection3 < 345)) {windDirection2 = 6;} Si ((windDirection3 > 250) & & (windDirection3 < 310)) {windDirection2 = 7;} si ((windDirection3 > 120) y & (windDirection3 < 200)) {windDirection2 = 8;}} /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void sleepModeFunction () { if ( (n > 110)|| (n<10)) {digitalWrite(sleepModePin,HIGH);} Else {digitalWrite(sleepModePin,LOW);}} void resetFonaFunction () {si (r > 143) / / restablece fona una vez cada 24 horas. Esto debe ser cambiado a r > 143. {digitalWrite(resetFonaPin,HIGH); delay(100); digitalWrite(resetFonaPin,LOW); r = 0;} } / / / / / / void myMode() / / calcula la dirección del viento de modo (el valor que ocurre más a menudo). {Si (windDirection2 == 1) {uno = uno + 1;} si (windDirection2 == 2) {dos = dos + 1;} si (windDirection2 == 3) {tres = tres + 1;} si (windDirection2 == 4) {cuatro = cuatro + 1;} si (windDirection2 == 5) {cinco = 5 + 1;} si (windDirection2 == 6) {seis = 6 + 1;} si (windDirection2 == 7) {siete = siete + 1;} si (windDirection2 == 8) {ocho = 8 + 1;} si ((un > dos) & &(one>three) & &(one>four) & &(one>five) & &(one>six) & &(one>seven) & & (uno > ocho)) {respuesta = 1;} si ((dos > uno) & &(two>three) & &(two>four) & &(two>five) & &(two>six) & &(two>seven) & &(two>eight)) {respuesta = 2;} Si ((tres > uno) & &(three>two) & &(three>four) & &(three>five) & &(three>six) & &(three>seven) & &(three>eight)) {respuesta = 3;} si ((cuatro > uno) & &(four>two) & &(four>three) & &(four>five) & &(four>six) & &(four>seven) & &(four>eight)) {respuesta = 4;} Si ((cinco > uno) & &(five>two) & &(five>three) & &(five>four) & &(five>six) & &(five>seven) & &(five>eight)) {respuesta = 5;} si ((seis > uno) & &(six>two) & & (seis > tres) & &(six>four) & &(six>five) & &(six>seven) & &(six>eight)) {respuesta = 6;} Si ((siete > uno) & &(seven>two) & &(seven>three) & &(seven>four) & &(seven>five) & &(seven>six) & &(seven>eight)) {respuesta = 7;} si ((ocho > uno) & &(eight>two) & &(eight>three) & &(eight>four) & &(eight>Five) & &(eight>six) & &(eight>seven)) {respuesta = 8;} Serial.Print ("mi modo valor es:"); Serial.println(Answer); } void resetMyMode() {uno = 0; dos = 0; tres = 0; cuatro = 0; cinco = 0; 6 = 0; siete = 0; 8 = 0; respuesta = 0;} < /p >