AverageGuy
Well-known member
I've been trying things for a while and finally have to break down and ask for help. I have the latest Raspberry Pi running the latest raspbian OS. I have an LC connected to a USB port via the micro USB cable used to program it. I am running a python test serial program on the Pi and the LC is reading temps from an 18b20 temp sensor using one wire library.
The test program receives the data and prints it out but only the first few lines, less than 10. It then proceeds to hang and a keyboard interrupt will not kill it.
The same exact code running on a Pro Micro, which is a Chinese knockoff of something works as expected. I have other things I'd like the processor to do and would prefer to run on the LC. The test program on the Pi is just to demonstrate the problem that I encountered when trying to get my actual (much larger) project running. Code on the LC is the same as the project.
It has something to do with the Pi and LC interaction since the test program and the LC run fine on my Linux desktop. I do have the udev rules in place on the Pi. Once the program hangs, I can't communicate again with the LC until I reboot. The LED continues to flash, so the LC isn't hanging, it's on the Pi end. I'm guessing it's an incompatability with the serial chip on the LC and the Pi driver.
Here's the LC code
Here's the Python code on the Pi
The test program receives the data and prints it out but only the first few lines, less than 10. It then proceeds to hang and a keyboard interrupt will not kill it.
The same exact code running on a Pro Micro, which is a Chinese knockoff of something works as expected. I have other things I'd like the processor to do and would prefer to run on the LC. The test program on the Pi is just to demonstrate the problem that I encountered when trying to get my actual (much larger) project running. Code on the LC is the same as the project.
It has something to do with the Pi and LC interaction since the test program and the LC run fine on my Linux desktop. I do have the udev rules in place on the Pi. Once the program hangs, I can't communicate again with the LC until I reboot. The LED continues to flash, so the LC isn't hanging, it's on the Pi end. I'm guessing it's an incompatability with the serial chip on the LC and the Pi driver.
Here's the LC code
Code:
#include <OneWire.h>
const int ledPin = 13;
// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// https://github.com/milesburton/Arduino-Temperature-Control-Library
OneWire ds(2); // on pin 10 (a 4.7K resistor is necessary)
void setup(void) {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop(void) {
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]) {
Serial.println("CRC is not valid!");
Serial.println();
return;
}
// the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
//Serial.println(" Chip = DS18S20"); // or old DS1820
type_s = 1;
break;
case 0x28:
//Serial.println(" Chip = DS18B20");
type_s = 0;
break;
case 0x22:
//Serial.println(" Chip = DS1822");
type_s = 0;
break;
default:
//Serial.println("Device is not a DS18x20 family device.");
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();
//Serial.print(data[i], HEX);
}
// 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] == 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;
/*
Serial.print(" Temperature = ");
Serial.print(celsius);
Serial.print(" Celsius, ");
Serial.print(fahrenheit);
Serial.println(" Fahrenheit");
*/
fahrenheit -=4.2;
Serial.print(fahrenheit);
Serial.println("");
digitalWrite(ledPin, HIGH); // set the LED on
delay(500);
digitalWrite(ledPin, LOW); // set the LED on
delay(500);
}
Here's the Python code on the Pi
Code:
import sys, serial
def main():
s = serial.Serial('/dev/ttyACM0', 9600)
s.parity = serial.PARITY_ODD # work around pyserial issue #30
s.parity = serial.PARITY_NONE
try:
while True:
d = s.read()
sys.stdout.write("%s" % d.decode('ascii'))
sys.stdout.flush()
except KeyboardInterrupt as ke:
pass
s.close()
main()