I am having a difficult time programming what i assumed to be an easy task. I am using a strain gauge with a conditioner that is relaying voltage values to one of the analog inputs on the arduino. That is not the problem though i have the arduino programmed to trigger a relay and blinking LED when the weight limit/ voltage value has been met. I have integrated a button switch that when pressed a single time should cause the LED to stop blinking and remain ON. I am have a hard time getting my program to do this. Right now when the weight limit is reached the LED will blink however i have to hold the button switch down in order for the LED to stop blinking and remain solid. I need the LED to remain solid after a single push so i do not have to hold the button switch down. Any suggestions would be great.
Thanks,
Here is my code:
const int Conditioner = A0; // pin that the conditioner is attached to
const int ledPin = 13; // pin that the arduino LED is attached to
const int external_red = 9; // pin that the external_red LED is attached to
const int relay_1 = 10; // pin that the one channel relay is attached to
const int spec_weight = 125; // an arbitrary value that's in the range of the analog input
const int blue_button_switch = 2; // pin that the blue_button_switch is attached to
int blue_buttonState = 0; // variable for reading the blue_button_switch status
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the relay pin as an output:
pinMode(relay_1, OUTPUT);
// initialize the external_red pin as an output:
pinMode(external_red, OUTPUT);
// initialize the blue_button_switch pin as an input:
pinMode(blue_button_switch, INPUT);
// initialize serial communications:
Serial.begin(9600);
}
void loop() {
// read the value of the conditioner:
int analogValue = analogRead(Conditioner);
// if the analog value is high enough, turn on the LED and trigger the relay:
if (analogValue >= spec_weight) {
digitalWrite(ledPin, HIGH); // sets the arduino LED on
digitalWrite(relay_1, HIGH); // triggers the channel one relay
}/* else {
digitalWrite(ledPin, LOW);
digitalWrite(relay_1, LOW);
}*/
// when the analog value is high enough, cause the external_red led to blink until blue_button_switch is pressed:
while (analogValue >= spec_weight) {
blue_buttonState = digitalRead(blue_button_switch);
// if the blue_button_switch is pressed, cause external_led to turn on:
if (blue_buttonState == LOW){
digitalWrite(external_red, HIGH); // sets the external_red LED on
}
//if the blue_button_switch is NOT pressed, cause external_led to blink:
else{
digitalWrite(external_red, HIGH); // sets the external_red LED on
delay(500); // waits for a second
digitalWrite(external_red, LOW); // sets the external_red LED off
delay(500); // waits for a second
}
}
// print the analog value:
Serial.println(analogValue);
delay(1); // delay in between reads for stability
}
Go and read the instructions, then go back and modify your post (use the "More --> Modify" option to the bottom right of the post) to mark up the code as such so we can examine it conveniently and accurately.
Go and read the instructions, then go back and modify your post (use the "More --> Modify" option to the bottom right of the post) to mark up the code as such so we can examine it conveniently and accurately.
You happy Paul_B? Haha
However it is good to know so thank you for that.
Thank you for the reply jimbo however i am using a button switch that is not attached to a breadboard it has a ground, signal, and a VCC. Therefor i am unable to wire it the same. As for the code i need it to blink before i press the button and stop blinking when i do. When i have tried similar code it wouldn't blink before i pressed it because it would run into the next command. I was able to make the led turn off and on by a single press but that is not what i want.
Paul__B:
Sounds like a "Keyes" module. You will therefore need to cite the Web link to that module in order for us to be able to advise on how to use it.
I have been unable to find any information on this button switch. It has YW-001 written on it and that is all i know about it.
Look through this, I am sure you can pull out what you need and add it to your sketch:
//Blink without Delay skeleton
//4 examples demonstrated
//LarryD
//LED wiring options
//=============================================
//#define PlusEqualsON //uncomment to invert
#ifdef PlusEqualsON
//wired so +5V turns LED ON
#define ledON HIGH
#define ledOFF LOW
//=========================
#else
//wired so +5V turns LED OFF
#define ledON LOW
#define ledOFF HIGH
#endif
//=============================================
unsigned long currentMillis;
unsigned long pin13Millis;
unsigned long pin12Millis;
unsigned long pin11Millis;
unsigned long SwitchMillis;
//if these are not changed in the sketch, they can be const
unsigned long debounceMillis = 100UL; //100ms
unsigned long ledOnTime = 5*1000UL; //5 seconds
byte laststartSwitchState = HIGH;
byte buttonState = HIGH;
byte counter = 0;
//the following are enable/disable flags
//some of these might not be used in this sketch
boolean flag13 = true;
boolean flag12 = true;
boolean flag11 = true;
boolean flag10 = true;
const byte startSwitch = 2; //pushed = LOW
const byte testSwitch = 3; //pushed = LOW
//**********************************************************************
void setup()
{
Serial.begin(9600);
digitalWrite(13,ledOFF);
pinMode(13, OUTPUT);
digitalWrite(12,ledOFF);
pinMode(12, OUTPUT);
digitalWrite(11,ledOFF);
pinMode(11, OUTPUT);
digitalWrite(10,ledOFF);
pinMode(10, OUTPUT);
pinMode(startSwitch, INPUT_PULLUP); //pushed = LOW
pinMode(testSwitch, INPUT_PULLUP); //pushed = LOW
} // >>>>>>>>>>>>>> E N D O F s e t u p ( ) <<<<<<<<<<<<<<<<<
void loop()
{
//save the current time
currentMillis = millis();
//************************************* E x a m p l e 1
//toggle pin 13 every 200mS
//has 200ms or more gone by?
if (currentMillis - pin13Millis >= 200UL)
{
//code here runs every 200ms
//get ready for next iteration
pin13Millis = pin13Millis + 200UL;
//toggle pin 13
digitalWrite(13,!digitalRead(13));
}
//************************************* E x a m p l e 2
//at power up, pin 12 LED goes ON, after 3 seconds goes OFF and stays OFF
//could be used as a powerup reset signal
if (flag12 == true && currentMillis - pin12Millis <= 3000UL)
{
//code here runs for 3 seconds after power up, then stops
digitalWrite(12,ledON);
}
else
{
digitalWrite(12,ledOFF);
//disable further pin 12 control
flag12 = false;
}
//************************************* E x a m p l e 3
//if testSwitch is pushed and released
//pin 11 LED goes ON for 5 seconds, then goes OFF
buttonState = digitalRead(testSwitch);
//are we allowed to check the switch and is it pressed?
if(flag11 == true && buttonState == LOW)
{
//enable timing of LED on pin 11
flag11 = false; //false --> timing is enabled
//turn LED ON
digitalWrite(11,ledON);
//record the time LED turned ON
pin11Millis = currentMillis;
}
//are we allowed and is it time to control pin 11
if (flag11 == false && currentMillis - pin11Millis >= ledOnTime)
{
//if enabled, code here runs after ledOnTime ms goes by
digitalWrite(11,ledOFF);
//allow switch press detection again
flag11 = true; //true --> switch monitoring is enabled
}
//************************************* E x a m p l e 4
//is it time to check the switches?
//in particular, pushing startSwitch will turn ON/OFF (toggle) an output pin 10
//is it time to check the switches
if (currentMillis - SwitchMillis >= debounceMillis)
{
//code here runs every debounceMillis ms
//get ready for the next iteration
SwitchMillis += debounceMillis;
//go and check the switches
checkSwitches();
}
//*********************************
//put other non-blocking stuff here
//*********************************
} // >>>>>>>>>>>>>> E N D O F l o o p ( ) <<<<<<<<<<<<<<<<<
//======================================================================
// F U N C T I O N S
//======================================================================
//****************** c h e c k S w i t c h e s ( ) *********************
//switches are checked every debounceValue milli seconds
//no minimum switch press time is validated with this code (i.e. No glitch filter)
void checkSwitches()
{
//re-usable for all the switches
boolean thisState;
//************************************* E x a m p l e Push ON push OFF (toggle)
//check if this switch has changed state
thisState = digitalRead(startSwitch);
if (thisState != laststartSwitchState)
{
//update the switch state
laststartSwitchState = thisState;
//this switch position has changed so do some stuff
//"HIGH condition code"
//switch went from LOW to HIGH
if(thisState == HIGH)
{
//Do some HIGH switch stuff here
}
//"LOW condition code"
//switch went from HIGH to LOW
else
{
//Do some LOW switch stuff here
digitalWrite(10, !digitalRead(10));
//print number of pushes
counter++;
Serial.println(counter);
}
} //END of startSwitch code
//*****************************************
//similar code for other switches goes here
//*****************************************
} //END of checkSwitches()
//**********************************************************************
//======================================================================
// E N D O F C O D E
//======================================================================
LarryD:
Look through this, I am sure you can pull out what you need and add it to your sketch:
Thank you Larry I was able to achieve what I wanted using some of your example 2.
For anyone else here is the updated code:
const int Conditioner = A0; // pin that the conditioner is attached to
const int ledPin = 13; // pin that the arduino LED is attached to
const int external_red = 9; // pin that the external_red LED is attached to
const int relay_1 = 10; // pin that the one channel relay is attached to
const int spec_weight = 125; // an arbitrary value that's in the range of the analog input
const int blue_button_switch = 2; // pin that the blue_button_switch is attached to
int blue_buttonState = 0; // variable for reading the blue_button_switch status
boolean flag9 = true; // enable/disable flag
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the relay pin as an output:
pinMode(relay_1, OUTPUT);
// initialize the external_red pin as an output:
pinMode(external_red, OUTPUT);
// initialize the blue_button_switch pin as an input:
pinMode(blue_button_switch, INPUT);
// initialize serial communications:
Serial.begin(9600);
}
void loop() {
// read the value of the conditioner:
int analogValue = analogRead(Conditioner);
// if the analog value is high enough, turn on the arduino LED and trigger the relay:
if (analogValue >= spec_weight) {
digitalWrite(ledPin, HIGH); // sets the arduino LED on
digitalWrite(relay_1, HIGH); // triggers the channel one relay
}/* else {
digitalWrite(ledPin, LOW);
digitalWrite(relay_1, LOW);
}*/
// when the analog value is high enough, cause the external_red led to blink until blue_button_switch is pressed:
while (analogValue >= spec_weight) {
blue_buttonState = digitalRead(blue_button_switch);
// if the blue_button_switch has not been pressed, cause external_led to blink:
if (flag9 == true && blue_buttonState == HIGH){
digitalWrite(external_red, HIGH); // sets the external_red LED on
delay(50); // waits for a second
digitalWrite(external_red, LOW); // sets the external_red LED off
delay(50); // waits for a second
}
//if the blue_button_switch is pressed, cause external_led to stop blinking and remain on:
else{
digitalWrite(external_red, HIGH); // sets the external_red LED on
flag9 = false; // disables further pin 9 control
}delay(500);
}
// print the analog value:
Serial.println(analogValue);
delay(1); // delay in between reads for stability
}