General Question

XOIIO's avatar

Help with this arduino code.

Asked by XOIIO (18328points) June 22nd, 2013

I have a topic over on the Arduino forums where I am trying to work out how to write an if statement, one person there gave me a rough outline, and it kind of helps but I am stuck in the middle.

If (its been X seconds since the lastTime)
{
set lastTime to Now
set difference to absolute value of thisValue minus lastValue
set derivative equal to difference divided by X
set lastReading to thisReading
check if the deriviative is within a certain threshold and do something based on it
}

I have come up with this so far, however, I don’t know what to do for this line: set derivative equal to difference divided by X

Aside from that I think I have the start out right.

if (currentMillis – previousMillis > interval) {
previousMillis = currentMillis;
delta = celsius – lasttemp;
}

Can anyone lend some advice?

Observing members: 0 Composing members: 0

10 Answers

XOIIO's avatar

Feel free to delete this mods, got it figured out.

_Whitetigress's avatar

Why not share your findings instead of deleting it?

XOIIO's avatar

@_Whitetigress I just figured there weren’t many arduino-interested people here, but here’s the whole code with comments.

#include <OneWire.h>
#include <LiquidCrystal.h>

OneWire ds(10);
LiquidCrystal lcd(6, 7, 5, 4, 3, 2);
float lasttemp; //Variable for last temperature
float delta; //Variable for temperaturechange
long previousMillis = 0;
long interval = 20000; //Check once every 20 seconds

void setup(void) {
pinMode(13, OUTPUT);
Serial.begin(115200);
lcd.begin(8, 2);
lcd.setCursor(0,0);
lcd.print(“STARTING”);
lcd.setCursor(0, 1);
lcd.print(“STARTING”);
delay(1000);
lcd.clear();
}

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

if ( !ds.search(addr)) {
Serial.println(“No more addresses.”);
Serial.println();
ds.reset_search();
delay(250);
return;
}

Serial.print(“ROM =”);
for( i = 0; i < 8; i++) {
Serial.write(’ ’);
Serial.print(addr[i], HEX);
}

if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println(“CRC is not valid!”);
return;
}
Serial.println();

// the first ROM byte indicates which chip
switch (addr[0]) {
case 0×10:
Serial.println(” Chip = DS18S20”); // or old DS1820
type_s = 1;
break;
case 0×28:
Serial.println(” Chip = DS18B20”);
type_s = 0;
break;
case 0×22:
Serial.println(” Chip = DS1822”);
type_s = 0;
break;
default:
Serial.println(“Device is not a DS18×20 family device.”);
return;
}

ds.reset();
ds.select(addr);
ds.write(0×44, 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

Serial.print(” Data = ”);
Serial.print(present, HEX);
Serial.print(” ”);
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
Serial.print(data[i], HEX);
Serial.print(” ”);
}
Serial.print(” CRC=”);
Serial.print(OneWire::crc8(data, 8), HEX);
Serial.println();

// Convert the data to actual temperature
// because the result is a 16 bit signed integer, it should
// be stored to an “int16_t” type, which is always 16 bits
// even when compiled on a 32 bit processor.
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0×10) {
// “count remain” gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 – data[6];
}
}
else {
byte cfg = (data[4] & 0×60);
// at lower res, the low bits are undefined, so let’s zero them
if (cfg == 0×00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0×20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0×40) 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;
Serial.print(” Temperature = ”);
Serial.print(celsius);
Serial.print(” Celsius, ”);
Serial.print(fahrenheit);
Serial.println(” Fahrenheit”);

delta = celsius – lasttemp; //Create value to check how much temperature has changed

if (currentMillis – previousMillis > interval) { //If it has been 20 seconds, check to turn LED on
previousMillis = currentMillis;
if ((delta < 00.05) && (delta > 00.05)) { //If temperature hasn’t changed by +/ .05 turn led on.
digitalWrite(13, HIGH);
}
}
if (delta >= 00.1) { //If temperature has changed by more than .1 turn LED off
digitalWrite(13, LOW);
}
if (delta <= -00.1) {
digitalWrite(13, LOW); // If temperature has changed by more than -.1 turn LED off
}

lcd.setCursor(0, 0);
lcd.print(celsius);
lcd.print(” C ”);
lcd.setCursor(0, 1);
lcd.print(fahrenheit);
lcd.print(” F ”);
lasttemp = celsius;

}

dabbler's avatar

We’re interested, you’re just ahead of the curve.
Are you writing in “C” ? Looks like it…
I’ve read a lot about Arduino but haven’t got my hands on any of that kit yet.

XOIIO's avatar

@dabbler Yeah, arduino is basically C programming, not sure if it differs a whole lot or not, but basically most C tutorials can help you, or so people say.

dabbler's avatar

…or C++ rather. Your solution shows properties and methods of some objects.
I was just discussing Arduino at dinner Thursday with a friend who recently got a starter kit. She has several creative ideas and the Arduino is at just the right level to be powerful enough to be useful, but also very accessible for her as a self-trained, high-aptitude technologist.
Someday I’ll come up with an idea that would be a good Arduino application and I get into it.
I’ve been leaning more toward microcontrollers and working a little ‘closer to the metal’, because even though the Arduino components are not expensive, a microcontroller is really cheap (a buck or two) so designs that call for a lot of ‘em can be affordable.

XOIIO's avatar

I’ll link a video of my project later today if you guys are interested.

Something neat if you want to save cost is programming an attiny 84 or 85, you can program it in arduino code and the part is only a couple bucks, as long as you don’t need many pins.

dabbler's avatar

Exactly! Those Atmel parts are intriguing.

Rarebear's avatar

There was a big arduino exhibit at the Bay Area Maker Fair. Very cool.

dabbler's avatar

@Rarebear Are you astronomers using Arduino for telescope mount and camera control ?

Answer this question

Login

or

Join

to answer.

This question is in the General Section. Responses must be helpful and on-topic.

Your answer will be saved while you login or join.

Have a question? Ask Fluther!

What do you know more about?
or
Knowledge Networking @ Fluther