(USA)
Offline
Full Member
Karma: 0
Posts: 244
|
 |
« on: December 22, 2012, 11:41:04 am » |
Hello, I'm trying to get a motor to stop when my light sensor reads a black line. I'm also trying to have a screen display the value of the light sensor in real time. I'm using a dfrobot motor controller, SFE light sensor, and a Grove LCD. I have tested all the parts by themselves, and they work fine so I know I'm doing my program wrong. The program, no matter the value of the light sensor, always choses loop #2. I have no idea why. Any help would be appreciated. #include <SerialLCD.h> #if ARDUINO < 100 #include <NewSoftSerial.h> //this is a must #else #include <SoftwareSerial.h> #endif
SerialLCD slcd(11,12); int E2 = 5; int M2 = 4; int sensorPin = A1; int long sensorValue = 0; int value = 250; int value2 = 0;
void setup() {
pinMode(M2, OUTPUT); slcd.begin(); }
void loop() { sensorValue = analogRead(sensorPin);
while (sensorValue > 1050) { // #1 sensorValue = analogRead(sensorPin); slcd.setCursor(0, 1); slcd.print(sensorValue, DEC); digitalWrite(M2,HIGH); analogWrite(E2, value); } while (sensorValue < 1050) { // #2 sensorValue = analogRead(sensorPin); slcd.setCursor(0, 1); slcd.print(sensorValue, DEC); digitalWrite(M2,HIGH); analogWrite(E2, value2); //PWM Speed Control }}
|
|
|
|
|
Logged
|
|
|
|
|
Massachusetts, USA
Offline
Tesla Member
Karma: 108
Posts: 6611
|
 |
« Reply #1 on: December 22, 2012, 11:45:32 am » |
The maximum value from analogRead() is 1023 so it will ALWAYS be less than 1050.
|
|
|
|
|
Logged
|
|
|
|
|
Johannesburg UTC+2
Offline
Edison Member
Karma: 34
Posts: 1705
|
 |
« Reply #2 on: December 22, 2012, 11:53:36 am » |
Good example of when it's useful to use Serial.print to send the value to the monitor for debugging....
|
|
|
|
|
Logged
|
IT Crowd: Roy... "Have you tried turning it off and on again?" Moss.. "Have you tried forcing an unexpected reboot?"
|
|
|
|
Seattle, WA USA
Offline
Brattain Member
Karma: 336
Posts: 36476
Seattle, WA USA
|
 |
« Reply #3 on: December 22, 2012, 12:09:22 pm » |
Good example of when it's useful to use Serial.print to send the value to the monitor for debugging.... And/or read the documentation for the functions being used.
|
|
|
|
|
Logged
|
|
|
|
|
(USA)
Offline
Full Member
Karma: 0
Posts: 244
|
 |
« Reply #4 on: December 22, 2012, 12:13:00 pm » |
Are you sure about the value?
When the program starts up the light sensor reads 950, but once you move the sensor over black (or any other color than what it started on) the LCD displays bright as 9,500-9,900 and dark as 1011.
Any ideas?
Thanks, Drew
|
|
|
|
|
Logged
|
|
|
|
|
(USA)
Offline
Full Member
Karma: 0
Posts: 244
|
 |
« Reply #5 on: December 22, 2012, 12:14:09 pm » |
Also I'm not using Serial.print as the lcd is telling me the value.
|
|
|
|
|
Logged
|
|
|
|
|
Global Moderator
UK
Offline
Brattain Member
Karma: 143
Posts: 19380
I don't think you connected the grounds, Dave.
|
 |
« Reply #6 on: December 22, 2012, 12:15:50 pm » |
the LCD displays bright as 9,500-9,900 I'd suggest it reads "95", with a couple of leftover zeroes. Yes, we're really sure about the analogRead. Also I'm not using Serial.print as the lcd is telling me the value. Which is why you should use debugged, well-understood methods to do your debug.
|
|
|
|
|
Logged
|
Pete, it's a fool looks for logic in the chambers of the human heart.
|
|
|
|
Seattle, WA USA
Offline
Brattain Member
Karma: 336
Posts: 36476
Seattle, WA USA
|
 |
« Reply #7 on: December 22, 2012, 12:16:13 pm » |
the LCD displays bright as 9,500-9,900 and dark as 1011. I'm pretty sure that if you printed the value correctly on the LCD, it would show 950 to 990. But, without seeing your code...
|
|
|
|
|
Logged
|
|
|
|
|
Pakistan
Offline
Sr. Member
Karma: 5
Posts: 318
Arduino rocks
|
 |
« Reply #8 on: December 22, 2012, 12:20:04 pm » |
int long sensorValue = 0; is it int or long or both? Arduino will be mad... 
|
|
|
|
|
Logged
|
|
|
|
|
Global Moderator
UK
Offline
Brattain Member
Karma: 143
Posts: 19380
I don't think you connected the grounds, Dave.
|
 |
« Reply #9 on: December 22, 2012, 12:24:06 pm » |
Arduino will be mad... You sure about that? Don't knock it until you've tried it 
|
|
|
|
|
Logged
|
Pete, it's a fool looks for logic in the chambers of the human heart.
|
|
|
|
Pakistan
Offline
Sr. Member
Karma: 5
Posts: 318
Arduino rocks
|
 |
« Reply #10 on: December 22, 2012, 12:30:06 pm » |
Hi, I think he must clear his LCD... I dont know whether his sketch may include Lcd.clear() sort of function just next to the both of while loop or before printing any value.. 1050 is strange... the first while loop will never work.. 
|
|
|
|
|
Logged
|
|
|
|
|
(USA)
Offline
Full Member
Karma: 0
Posts: 244
|
 |
« Reply #11 on: December 22, 2012, 12:35:32 pm » |
Thanks for all of your help. I should have tried the Serial.print from the beginning. The problem was that the lcd left the 0 from 1000 so it made it seem like the light sensor was reading 9900 when it was really 990. I was able to adjust the values and it works now. Thanks, Drew #include <SerialLCD.h> #if ARDUINO < 100 #include <NewSoftSerial.h> //this is a must #else #include <SoftwareSerial.h> #endif
SerialLCD slcd(11,12); int E2 = 5; int M2 = 4; int sensorPin = A1; int long sensorValue = 0; int value = 250; int value2 = 0;
void setup() {
pinMode(M2, OUTPUT); slcd.begin(); }
void loop() { sensorValue = analogRead(sensorPin); while (sensorValue < 1000) { // #1 sensorValue = analogRead(sensorPin); slcd.setCursor(0, 1); slcd.print(sensorValue, DEC); digitalWrite(M2,LOW); analogWrite(E2, value); } while (sensorValue > 1000) { // #2 sensorValue = analogRead(sensorPin); slcd.setCursor(0, 1); slcd.print(sensorValue, DEC); digitalWrite(M2,HIGH); analogWrite(E2, value2); //PWM Speed Control }}
|
|
|
|
|
Logged
|
|
|
|
|
Pakistan
Offline
Sr. Member
Karma: 5
Posts: 318
Arduino rocks
|
 |
« Reply #12 on: December 22, 2012, 12:39:22 pm » |
I bit, this guy will comeback again.. He is like a pigeon, when the  come near the pigeon ,he closes his eyes.. You solve the problem not hide it...  Okay, just try: #include <SerialLCD.h> #if ARDUINO < 100 #include <NewSoftSerial.h> //this is a must #else #include <SoftwareSerial.h> #endif
SerialLCD slcd(11,12); int E2 = 5; int M2 = 4; int sensorPin = A1; int sensorValue = 0; int value = 250; int value2 = 0;
void setup() {
pinMode(M2, OUTPUT); slcd.begin(); }
void loop() { sensorValue = analogRead(sensorPin); while (sensorValue < 1023) { // #1 sensorValue = analogRead(sensorPin); slcd.clear(); slcd.setCursor(0, 1); slcd.print(sensorValue, DEC); digitalWrite(M2,LOW); analogWrite(E2, value); } while (sensorValue > 1023) { // #2 sensorValue = analogRead(sensorPin); slcd.clear(); slcd.setCursor(0, 1); slcd.print(sensorValue, DEC); digitalWrite(M2,HIGH); analogWrite(E2, value2); //PWM Speed Control }}
|
|
|
|
« Last Edit: December 22, 2012, 12:41:58 pm by Khalid »
|
Logged
|
|
|
|
|
|