Nu blir det kanske lite mycket kommentarer på rad men stötte på ett problem, jag misstänker att det är kodrelaterat därav bifogar jag koden.
Kod: Markera allt
#include <OneWire.h>
#include <LiquidCrystal.h>
OneWire ds(9); // on pin 9
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup(void) {
Serial.begin(9600);
lcd.begin(20, 4); // set up the LCD's number of columns and rows:
}
void loop(void) {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.0 / 1023.0);
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 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);
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
unsigned int 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);
if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw << 2; // 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.setCursor (0, 0);
lcd.print("Emils specail");
lcd.setCursor(0, 1);
lcd.print(celsius);
lcd.setCursor(6,1);
lcd.print("Celsius");
lcd.setCursor(0, 2);
lcd.print("Switch voltage");
lcd.setCursor(0, 3);
lcd.print(voltage);
}
Från början så var det kopplat på följande vis på A0.
Från A0 till en kopplingspunkt där 2 olika stora motstånd var kopplade (4,7Kohm och 10Kohm)
Efter varje motstånd så kopplade jag en tryckströmbrytare (av den fjädrande typen dvs man måste hålla den intryckt för att få kontakt)
Och sedan dessa till + (5V)
Sen använde jag mig av koden ovan i hopp om att få 2 olika voltstyrkor jag kunde anväda mig av som signal.
Saken är den att jag kan koppla ur A0 helt och får endå en spänning som varierar mellan 5V-0V....
Har provat att byta till A1 utan resultat.
Därav misstänker jag att jag strulat till det lite med koden.
(som ni säkert märker så är grunden till koden lite exempelkod jag byggt vidare på)
Själv misstänker jag att det är något strul med att jag har 2st Float komandon i början med det är bara en ren gissning.
Kan tilläggas att övrig kod fungerar, i allfall så långt att jag kan få ut tempraturen på displayen.
och övrig text
komunikationen över serieporten verkar även den att fungera bra (visar inte mycket då jag städat lite där)
EDIT: Hade ett litet brutalt hjärnsläpp här löste det med hjälp av pulldown motstånd...
(håller dock fortfarande på att leta passande motstånd för att få en bra delning på mina knappar)
Men koden kanske är intressant för andra
Verkar som man kan få det att fungera nästan som jag sa med
Har däremot ändrat mig lite, mäter nu resistans istället (bättre upplösning)