Created
April 14, 2020 18:52
-
-
Save bjoern-r/63c5fbd2770d281e3e432547f765e787 to your computer and use it in GitHub Desktop.
Simple Arduino sketch to control a relais to switch a relais if the voltage read from the adc is below a certain level
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Battery Guard | |
Use an arduino nano and connect the input voltage with an voltage divider to A0 | |
I used 9kOhm and 1kOhm to get a /10 divider to be able to measure up to 50V | |
Switch points are for a 12v AGM battery. | |
The relais is controlled via D7. | |
*/ | |
#define NUM_READINGS 10 | |
#define RELAIS_PIN 7 | |
#define ADC_REF 5.0 | |
#define CUTOFF_VALUE ((9*1023)/(ADC_REF*10)) | |
#define OFF_VALUE ((10.5*1023)/(ADC_REF*10)) | |
//#define ON_VALUE ((12.5*1023)/(ADC_REF*10)) | |
#define ON_VALUE ((11.5*1023)/(ADC_REF*10)) | |
int readings[NUM_READINGS]; // the readings from the analog input | |
const int inputPin = A0; | |
void handleOutput(int value){ | |
static int aboveCount = 0; | |
static int belowCount = 0; | |
if (value>ON_VALUE){ | |
aboveCount++; | |
belowCount=0; | |
//Serial.print("+"); | |
} | |
if (value<OFF_VALUE){ | |
belowCount++; | |
aboveCount = 0; | |
//Serial.print("-"); | |
} | |
if(value<CUTOFF_VALUE) { | |
digitalWrite(LED_BUILTIN, LOW); | |
digitalWrite(RELAIS_PIN, LOW); | |
}else if (belowCount> 100){ | |
digitalWrite(LED_BUILTIN, LOW); | |
digitalWrite(RELAIS_PIN, LOW); | |
}else if (aboveCount > 100){ | |
digitalWrite(LED_BUILTIN, HIGH); | |
digitalWrite(RELAIS_PIN, HIGH); | |
} | |
} | |
// the setup routine runs once when you press reset: | |
void setup() { | |
pinMode(LED_BUILTIN, OUTPUT); | |
pinMode(RELAIS_PIN, OUTPUT); | |
digitalWrite(LED_BUILTIN, LOW); | |
digitalWrite(RELAIS_PIN, LOW); | |
// initialize serial communication at 9600 bits per second: | |
Serial.begin(9600); | |
//analogReference(INTERNAL2V56); | |
for (int thisReading = 0; thisReading < NUM_READINGS; thisReading++) { | |
readings[thisReading] = 0; | |
} | |
Serial.print("LOW: "); | |
Serial.println(CUTOFF_VALUE); | |
Serial.print("High: "); | |
Serial.println(ON_VALUE); | |
} | |
// the loop routine runs over and over again forever: | |
void loop() { | |
static int total = 0; | |
static int readIndex = 0; | |
// subtract the last reading: | |
total = total - readings[readIndex]; | |
// read from the sensor: | |
readings[readIndex] = analogRead(inputPin); | |
// add the reading to the total: | |
total = total + readings[readIndex]; | |
// advance to the next position in the array: | |
readIndex = (++readIndex)%NUM_READINGS; | |
// calculate the average: | |
int average = total / NUM_READINGS; | |
float voltage = average * (ADC_REF / 1023.0)*10; | |
// print out the value you read: | |
Serial.print(voltage); | |
Serial.print(" V\t"); | |
// send it to the computer as ASCII digits | |
Serial.println(average); | |
handleOutput(average); | |
delay(60); // delay in between reads for stability | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment