// source code by Peter Ek, Wiper control for 2-speed motor from Camaro gen IV steering column int sensorPin = A0; int pulsePin = 6; int washoutPin = 7; int hspeedoutPin = 8; int washinPin = 10; int hspeedinPin = 11; boolean hspeedState = HIGH; boolean washState = HIGH; boolean lastHspeedState = HIGH; boolean lastWashState = HIGH; long lastDebounceWashTime = 0; long lastDebounceHspeedTime = 0; long debounceDelay = 50; long prevMillisStart = 0; long intervalStart = 600; long prevMillisStop = 0; long intervalWash = 4000; long waitClean = 12000; long prevMillisWash=0; long sensorValue = 0; int afterWipe = 0; int afterClean = 0; int afterCleanWait = 0; int resetWipeStart = 1; int resetWipeStop = 0; long mistStart = 0; int serialCount = 0; void setup() { pinMode(2, INPUT); pinMode(pulsePin, OUTPUT); pinMode(washoutPin, OUTPUT); pinMode(hspeedoutPin, OUTPUT); pinMode(washinPin, INPUT); pinMode(hspeedinPin, INPUT); digitalWrite(pulsePin, HIGH); digitalWrite(washoutPin, HIGH); digitalWrite(hspeedoutPin, HIGH); Serial.begin(9600); } void loop() { sensorValue = map(analogRead(sensorPin), 0, 1023, 0, 10000); hspeedState = digitalRead(hspeedinPin); washState = digitalRead(washinPin); if(hspeedState == LOW) { digitalWrite(hspeedoutPin, LOW); } else { digitalWrite(hspeedoutPin, HIGH); } if(washState == LOW) { digitalWrite(washoutPin, LOW); digitalWrite(pulsePin, LOW); afterWipe = 1; afterClean = 1; afterCleanWait = 0; prevMillisWash = millis(); } else { digitalWrite(washoutPin, HIGH); if(afterWipe == 1) { if(millis() - prevMillisWash > intervalWash) { digitalWrite(pulsePin, HIGH); afterWipe = 0; } } if(afterClean == 1) { if(millis() - prevMillisWash > waitClean) { digitalWrite(pulsePin, LOW); afterCleanWait = 1; } if((millis() - prevMillisWash) > (waitClean + 1000)) { digitalWrite(pulsePin, HIGH); afterClean = 0; afterCleanWait = 0; } } } // activate this code for calibration values: Serial.print(sensorValue); Serial.print("\t"); serialCount++; if(serialCount > 30) { Serial.println(""); serialCount = 0; } if(afterWipe == 0 && afterCleanWait == 0) { if((sensorValue < 10 || sensorValue > 9500) && (millis() - mistStart > intervalStart)) { digitalWrite(pulsePin, HIGH); resetWipeStart = 1; resetWipeStop = 0; } else { if(sensorValue > 10 && sensorValue < 1500) { digitalWrite(pulsePin, LOW); resetWipeStart=1; resetWipeStop=0; mistStart = millis(); } else { if(resetWipeStart == 1 && resetWipeStop == 0) { digitalWrite(pulsePin, HIGH); if(millis() - prevMillisStop > sensorValue) { resetWipeStop=1; resetWipeStart=0; prevMillisStart = millis(); } } if(resetWipeStop == 1 && resetWipeStart == 0) { digitalWrite(pulsePin, LOW); if(millis() - prevMillisStart > intervalStart) { resetWipeStart=1; resetWipeStop=0; prevMillisStop = millis(); } } } } } }