I'm starting on a robot, and the first things I wanted to get out of the way are making it able to record distance from a object via a ultrasonic sensor and if the distance suddenly drops to or below 0 inches or Centimeters, it throws an error. Secondly, I want to be able to record the temperature inside the robot chassis continuously to make sure everything will run smoothly.
Edit: I forgot that these forums used bbcode, so I added in the code tag.
#define THERMISTORPIN A0
#define THERMISTORNOMINAL 10000
#define TEMPERATURENOMINAL 25
#define NUMSAMPLES 5
#define BCOEFFICIENT 3950
#define SERIESRESISTOR 10000
int samples[NUMSAMPLES];
//LED Pin
int LedPin1 = 7;
int LedPin2 = 8;
//Ultrasonic Sensor Pins
int trigPin = 11; //Trig Pin
int echoPin = 12; //Echo Pin
long duration, cm, inches;
void setup(void)
{
Serial.begin(9600);
analogReference(EXTERNAL);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
analogReference(EXTERNAL);
}
void loop(void)
{
uint8_t i;
float average;
for (i = 0; i < NUMSAMPLES; i++)
{
samples[i] = analogRead(THERMISTORPIN);
delay(10);
}
average = 0;
for (i = 0; i < NUMSAMPLES; i++)
{
average += samples[i];
}
average /= NUMSAMPLES;
/*Serial.print("Avg analog reading ");
Serial.println(average);*/
average = 1023 / average - 1;
average = SERIESRESISTOR / average;
float steinhart;
steinhart = average / THERMISTORNOMINAL; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)
steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15; // convert to C
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
cm = (duration / 2) / 29.1;
inches = (duration / 2) / 74;
Serial.print("Thermistor resistance ");
Serial.println(average);
Serial.print("Temperature: ");
Serial.print('\n');
Serial.print(steinhart);
Serial.println(" degrees C");
//convert to Fahrenheit
float steinhart1 = (steinhart * 9.0 / 5.0) + 32.0;
Serial.print(steinhart1);
Serial.println(" degrees F");
Serial.print("Distance in inches: ");
Serial.print(inches);
Serial.print(" Distance in cm: ");
Serial.print(cm);
Serial.println();
if (inches <= 0);
{
digitalWrite(LedPin1, HIGH);
digitalWrite(LedPin2, LOW);
}
if (inches >= 1);
{
digitalWrite(LedPin1, LOW);
digitalWrite(LedPin2, HIGH);
}
delay(2000);
}
It's doing temp readings, as it's going into a robot that is most likely going to be prone to overheating, and I want to protect the delicate hardware going into it.
What can I do to improve though?
Please read the "how to use the forum" and "Read this before posting a programming question" stickies.
I see a couple things at first look. How many pins does your Arduino have? More than 255? If not more than 255, why use int for pin numbers? Use byte and save some SRAM. Will the pin numbers change at runtime? if not, make them const byte and save more SRAM by putting them in flash. Efficient programs do not use delay() except where necessary. DelayMicroseconds is OK where it is used, but I would replace the delay(2000) with the blink without delay method. That 2 seconds might be needed when your code grows. Your robot is effectively dead to the world during the 2 seconds.
groundfungus:
Please read the "how to use the forum" and "Read this before posting a programming question" stickies.
I see a couple things at first look. How many pins does your Arduino have? More than 255? If not more than 255, why use int for pin numbers? Use byte and save some SRAM. Will the pin numbers change at runtime? if not, make them const byte and save more SRAM by putting them in flash. Efficient programs do not use delay() except where necessary. DelayMicroseconds is OK where it is used, but I would replace the delay(2000) with the blink without delay method. That 2 seconds might be needed when your code grows. Your robot is effectively dead to the world during the 2 seconds.
The pin numbers will most likely change, depending on which motor driver I will be using, as most require 3 or more pins. How would I put them in flash? I've never done anything like that before, and I'll look into the blink without delay method, as you're right, the robot is effectively dead to the world during those 2 seconds.
Never modify a post after it it has been replied to! Removing your code from your first post is NOT the same as posting it in code tags, if you want people here to read your code NEVER post it on shitbin or the like!
Checking the internal temp is stupid the parts are not delicate but they will burn out long before that temp sensor sees a problem.
Cut the most stupid thing is
distance from a object via a ultrasonic sensor and if the distance suddenly drops to or below 0 inches or Centimeters
If the distance to an object is 0 you have hit it!
Yes, and it works nicely.
Although, I wish I knew how to simply update the values in serial monitor, instead of printing repeatedly.
I know it involves newvalue != oldvalue, or something like that.
The first thing I see is the use of defines for items that should really be constant variables. Defines will generally work but may result in type conflicts while constants are clearly typed. Your pin variable assignments should also be constants.
Jimmy60:
The first thing I see is the use of defines for items that should really be constant variables. Defines will generally work but may result in type conflicts while constants are clearly typed. Your pin variable assignments should also be constants.
Yea, sorry.
I forgot the site used bbcode for the forums.
Also, I am re-writing this script from scratch bases of your thread, and it should be TONS more effecient.
It's a really nice guide.
Also, is there a better method for Arduino Multi-tasking then this that'd possibly be easier, or improve effeciency? https://www.arduino.cc/en/Tutorial/MultipleBlinks