TEMPERATURE CONTROLLED SERVO MOTOR (Possibly -w- LCD screen)

Hello everyone,

I am fairly new to programming and such, but I was wondering if someone could point me in the right direction towards how I can control a servo motor based off of a temperature reading. I would also like to use a temperature sensor that reads in C or F (rather than one that reads in voltage). If anyone knows any tutorials that have a material used section, that would be great.

Thanks-
rybredd

You’re basically asking for help with four things.

  1. read the temperature, and display on the serial monitor
  2. display that value on an LCD
  3. control a servo, based on that value
  4. combine it all in a single sketch

Tackle one problem at the time.
Why don’t you start with the first one.
A (waterproof) DS18B20 is a good/easy/accurate sensor, and you can directly read it in degrees C.
Plenty of examples on this forum.
Use the seach field on top of this page.
Leo…

Will do, and when coding the servo the commands will be in C° if I use the DS18B20? Cause I know if I were to use a thermistor the temperature will be read as voltages.

rybredd:
…and when coding the servo the commands will be in C° if I use the DS18B20? Cause I know if I were to use a thermistor the temperature will be read as voltages.

Temp in °C from the DS18B20, or an analogue value from the Arduino A/D from a thermistor, can be converted to anything you like.
First get that temp going on the serial monitor, and then on the LCD.
Here is a simple DS18B20 serial monitor sketch.
Leo…

#include <DallasTemperature.h>
#include <OneWire.h>

OneWire oneWire(6); // pin D6
DallasTemperature sensors(&oneWire);
float temp;

void setup() {
  Serial.begin(115200);
  Serial.println("DS18B20 thermometer");
  sensors.begin();
}

void loop() {
  sensors.requestTemperatures();
  temp = sensors.getTempCByIndex(0);
  Serial.print("Temp is ");
  Serial.print(temp, 4); // four decimal places
  Serial.println(" C");
}

Hi again,

So I bought the DS18B20 temp sensor and a I2C 16X2 LCD. After I upload my sketch the LCD just stays lit with no numbers displaying on the screen. Here is my code and if you would be to assist and further that would greatly be appreciated.

<#include <OneWire.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// Addr, En, Rw, Rs, d4, d5, d6, d7, backlighpin, polarity

OneWire  ds(2);  // on pin 2 (a 4.7K resistor is necessary)

void setup() {
lcd.begin(16, 2);
lcd.backlight();
lcd.clear();
lcd.print("Temperature.....");
delay(3000);
lcd.clear();
lcd.print("Starting.....");
delay(3000);
}

void loop() {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;

if ( !ds.search(addr)) {
ds.reset_search();
delay(250);
return;
}
for ( i = 0; i < 8; i++) {
}
if (OneWire::crc8(addr, 7) != addr[7]) {
return;
}
// the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
type_s = 1;
break;
case 0x28:
type_s = 0;
break;
case 0x22:
type_s = 0;
break;
default:
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1);        // start conversion, with parasite power on at the end
delay(1000);     // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE);         // Read Scratchpad
for ( i = 0; i < 9; i++) {           // we need 9 bytes
data[i] = ds.read();
}
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
lcd.clear();
delay(500);
lcd.setCursor(0, 0);
lcd.print("ELEC-CAFE.COM");
lcd.setCursor(0, 1);
lcd.print(celsius);
lcd.print(" C");
lcd.setCursor(9, 1);
lcd.print(fahrenheit);
lcd.print(" F");
delay(10000);
}

Code is too long. Remove anything that is not LCD related for now. Post a link to the LCD you bought. There are many different I2C LCDs on the market. They have different commands to initialize.

Hi everyone,
I got the temp to read in F and C :slight_smile: and the LCD is working. So my next question is how can I control a micro servo. I'm trying to have the servo at 30-45° when the temperature is at 75°F and above, 90° when the temperature is between 71-74°F, and 135-150° when the temperature is 70°F and below.
(How can I incorporate the servo into my code above?)

Thanks

Post the working code you now have (in </> code tags) and we can start from there. I can’t read code full of italics and smiley faces.

Moving servos is easy, see the IDE examples. A set of if statements checking the temperature you’ve already calculated to see if the servo needs to be somewhere else should also be simple enough.

Steve

Hi,
Welcome to the forum.

Please read the first post in any forum entitled how to use this forum.
http://forum.arduino.cc/index.php/topic,148850.0.html then look down to item #7 about how to post your code.
It will be formatted in a scrolling window that makes it easier to read.

Thanks... Tom.. :slight_smile: ,