Hi
I hope this is posted the right place. Otherwise, please let me know!
I am having trouble using the incoming data from a hall sensor on a solenoid valve. Perhaps it is a question of debouncing, I don't know, I haven't been able to debounce it properly. Instead I have now tried to debug and would like your help to analyse and suggest an approach.
I want to know when the solenoid valve is activated. When the solenoid is not activated (not magnetised), the sensor reading is "1". When the solenoid is activated, I was expecting a constant "0" as when holding a magnet to it, but in reality, I am getting a lot of 0 and 1s during the activated time, when using on a real solenoid.
This is not good, as I am using the 1 and 0 to identify, when and how long the solenoid is activated.
My timer in the original sketch is starting as soon as the the reading is 0 and stopping saving the timing when the reading is once again 1. However, the timer is constantly reset, as the stream of readings is "10101001010" or so.
I made a few sketches to debug and find out what was going on. It turns out, that the readings suggest that the solenoid is less activated than not activated during what I thought was a constant activation.
When activated, a simple read and Serial.println results in:
0 = activated. This whole stream of readings should be all 0s. It would be if the hall effect sensor was reading a magnet, but apparently not a solenoid valve.
1
1
0
0
1
1
1
1
1
0
1
1
1
1
1
0
0
1
1
1
1
1
0
1
1
1
1
1
0
When trying to time it by appending mills():
1, 11947
1, 11957
1, 11968
1, 11978
1, 11988
0, 11999
1, 12009
0, 12019
1, 12030
0, 12041
1, 12051
0, 12061
1, 12071
0, 12082
1, 12092
0, 12103
1, 12113
1, 12124
1, 12134
1, 12144
1, 12154
1, 12166
1, 12176
1, 12186
1, 12196
1, 12207
1, 12217
1, 12228
1, 12238
1, 12249
0, 12259
1, 12269
0, 12279
1, 12290
0, 12301
1, 12311
0, 12321
1, 12332
0, 12342
I thought maybe using the debounce script would help:
const int sensorPin = 2; // the number of the pushbutton pin
int lastSensorState = 1; // the previous reading from the input pin
int sensorState; // the current reading from the input pin
long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 50; // the debounce time; increase if the output flickers
void setup() {
// put your setup code here, to run once:
pinMode(sensorPin, INPUT);
Serial.begin(9600);
Serial.println("Sensor value at start:");
Serial.println(digitalRead(sensorPin));
}
void loop() {
// put your main code here, to run repeatedly:
int reading = digitalRead(sensorPin);
// If the switch changed, due to noise or pressing:
if (reading != lastSensorState) {
// reset the debouncing timer
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:
// if the button state has changed:
if (reading != sensorState) {
sensorState = reading;
// only toggle the LED if the new button state is HIGH
if (sensorState == 0) {
Serial.println("MAGNET!!!!");
}
}
}
lastSensorState = reading;
}
But that does not result in anything. The expected outcome was the serial monitor showing "MAGNET!!!" when the solenoid valve was activated, but that never happened.
Does anyone have any idea how to approach the reading "01111100111010111001" as identifying the solenoid as activated?