Hi!
I'm a new in here but i'm dealing with Arduino's over a months and now i'm stucked one of my projects.
So my problem is with serial communication between Arduino and Raspberry PI. Arduino sends every 10 seconds interval DS1820, DHT11, photoresistor data to RPI over serial. PHP catch this data and prints out. But after Arduino is running a while then some weird characters appears in serial communications or some data is lost (please see pastebin log example line: 2967, 3023, 3033) and after that Arduino just dies and does not send anything out. Does someone know why this happening just in random times?
Hardware:
Raspberry PI
Atmega328p
DS1820
DHT11
Photoresistor
Arduino code:
#include <EEPROM.h>
#include <SimpleTimer.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <dht11.h>
SimpleTimer t;
OneWire oneWire(3);
DallasTemperature sensors(&oneWire);
DeviceAddress tempDeviceAddress;
dht11 DHT11;
int call_time = EEPROM.read(100) * 1000;
int pin_count = 17;
int led_pin = 13;
int led_duration = 200;
/*
ATMEGA328P DIP 18pin
EEPROM(100) - CALL_TIME in seconds
EEPROM(1-17) - PIN nr
EEPROM values:
1 - Digital read
2 - Analog read
10 - 1wire temperature
11 - DHT11/22
*/
void setup(void)
{
Serial.begin(9600);
pinMode(led_pin, OUTPUT);
out("START", true);
if(call_time <= 0)
{
call_time = 5000;
write_rom(100, 5);
}
t.setInterval(call_time, getData);
}
void loop(void)
{
t.run();
}
/* Serial output */
void out(String o, boolean ln)
{
o.toUpperCase();
if(ln)
{
Serial.println(o);
}
else
{
Serial.print(o);
}
led();
}
void write_rom(int pos, int val)
{
EEPROM.write(pos, val);
out("ROM["+String(pos)+"="+String(val)+"]", true);
}
void led()
{
digitalWrite(led_pin, HIGH);
for(int i=0; i<=led_duration; i++)
{
if(i == led_duration)
{
digitalWrite(led_pin, LOW);
break;
}
}
}
void getData()
{
long st = millis();
out("BEGIN", true);
read1wire(3);
readDHT(4);
readA(0);
long et = millis() - st;
out("-"+String(et), true);
out("END", true);
}
void readA(int pin)
{
int v = analogRead(pin);
out("["+String(pin)+":"+String(v)+"]", false);
}
void read1wire(int pin)
{
sensors.begin();
sensors.requestTemperatures();
// 1wire devices count
int devices_count = sensors.getDeviceCount();
out("["+String(pin)+":", false);
if(devices_count)
{
// Get each device value
for(int d=1; d<=devices_count; d++)
{
if( sensors.getAddress(tempDeviceAddress, d-1) )
{
for (uint8_t i = 0; i < 8; i++)
{
if (tempDeviceAddress[i] < 16)
{
out("0", false);
}
out(String(tempDeviceAddress[i], HEX), false);
}
int c = sensors.getTempC(tempDeviceAddress) * 1000;
out("="+String(c), false);
if(d < devices_count) out(",", false);
}
}
}
out("]", false);
}
// Read DHT sensor
void readDHT(int pin)
{
out("["+String(pin)+":", false);
int chk = DHT11.read(pin);
if(chk == DHTLIB_OK)
{
int tempC = (float)DHT11.temperature * 100;
int humC = (float)DHT11.humidity * 100;
out(String(tempC)+","+String(humC), false);
}
else
{
out(String(chk), false);
}
out("]", false);
}
PHP code:
#include <EEPROM.h>
#include <SimpleTimer.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <dht11.h>
SimpleTimer t;
OneWire oneWire(3);
DallasTemperature sensors(&oneWire);
DeviceAddress tempDeviceAddress;
dht11 DHT11;
int call_time = EEPROM.read(100) * 1000;
int pin_count = 17;
int led_pin = 13;
int led_duration = 200;
/*
ATMEGA328P DIP 18pin
EEPROM(100) - CALL_TIME in seconds
EEPROM(1-17) - PIN nr
EEPROM values:
1 - Digital read
2 - Analog read
10 - 1wire temperature
11 - DHT11/22
*/
void setup(void)
{
Serial.begin(9600);
pinMode(led_pin, OUTPUT);
out("START", true);
if(call_time <= 0)
{
call_time = 5000;
write_rom(100, 5);
}
t.setInterval(call_time, getData);
}
void loop(void)
{
t.run();
}
/* Serial output */
void out(String o, boolean ln)
{
o.toUpperCase();
if(ln)
{
Serial.println(o);
}
else
{
Serial.print(o);
}
led();
}
void write_rom(int pos, int val)
{
EEPROM.write(pos, val);
out("ROM["+String(pos)+"="+String(val)+"]", true);
}
void led()
{
digitalWrite(led_pin, HIGH);
for(int i=0; i<=led_duration; i++)
{
if(i == led_duration)
{
digitalWrite(led_pin, LOW);
break;
}
}
}
void getData()
{
long st = millis();
out("BEGIN", true);
read1wire(3);
readDHT(4);
readA(0);
long et = millis() - st;
out("-"+String(et), true);
out("END", true);
}
void readA(int pin)
{
int v = analogRead(pin);
out("["+String(pin)+":"+String(v)+"]", false);
}
void read1wire(int pin)
{
sensors.begin();
sensors.requestTemperatures();
// 1wire devices count
int devices_count = sensors.getDeviceCount();
out("["+String(pin)+":", false);
if(devices_count)
{
// Get each device value
for(int d=1; d<=devices_count; d++)
{
if( sensors.getAddress(tempDeviceAddress, d-1) )
{
for (uint8_t i = 0; i < 8; i++)
{
if (tempDeviceAddress[i] < 16)
{
out("0", false);
}
out(String(tempDeviceAddress[i], HEX), false);
}
int c = sensors.getTempC(tempDeviceAddress) * 1000;
out("="+String(c), false);
if(d < devices_count) out(",", false);
}
}
}
out("]", false);
}
// Read DHT sensor
void readDHT(int pin)
{
out("["+String(pin)+":", false);
int chk = DHT11.read(pin);
if(chk == DHTLIB_OK)
{
int tempC = (float)DHT11.temperature * 100;
int humC = (float)DHT11.humidity * 100;
out(String(tempC)+","+String(humC), false);
}
else
{
out(String(chk), false);
}
out("]", false);
}
Here is Arduino and RPI communication log:
Many thanks,
Marko