Arduino+ 2xDallas 18b20

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
Lukaszja
Majsterkowicz
Posty: 55
Rejestracja: 28 maja 2013, 18:58

Arduino+ 2xDallas 18b20

Post autor: Lukaszja » 23 lip 2014, 18:40

witam dostałem propozycje zrobienie termometra do busa, którym będą przewożone warzywa . Ten termometr ma pokazywać temperature w kabinie i na"pace" . Kupiłem juz 2 czujniki takie jak w temacie, troche rezystorów ,wyswietlacz 16x2 . Dodatkowo w domy posiadam atmega 8 oraz attiny2313 . Czy mógłbym mi ktoś "pomóc" napisać program który by to mógł obsługiwać. Na wyswietlaczu ma byc coś takiego
" Temp kabina 20
Temp paka 20"

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


kazzik87
Starszy majsterkowicz
Posty: 440
Rejestracja: 14 lip 2014, 21:54
Lokalizacja: Lublin

Re: Arduino+ 2xDallas 18b20

Post autor: kazzik87 » 23 lip 2014, 19:02

Lukaszja pisze:Czy mógłbym mi ktoś "pomóc" napisać program który by to mógł obsługiwać.
Zakładam że nikt za Ciebie tego nie napisze :-) Możemy pomóc w rozwiązaniu zaistniałych problemów.

Proponuje zacząć od schematu:
1) Może taki na początek
2) Potem możesz się zacząć bawić tym

Tu masz przykład napisany w C dla Atmegi - link


Na jakim poziomie jesteś w programowaniu uC? Powiedzmy skala 0 -10, gdzie: 0 - laik; 5 - korzystanie z bibliotek, pisanie swoich funkcji; 10 - struktury, callbacki itp.

P.S.
Gotowych programów oraz opisów jak to zrobić jest na necie :-)
---
Jeżeli pomogłem to kliknij "Pomógł".
kuba0.0
Młodszy majsterkowicz
Posty: 32
Rejestracja: 30 lis 2013, 13:54

Re: Arduino+ 2xDallas 18b20

Post autor: kuba0.0 » 23 lip 2014, 21:51

to jest troszeczkę zmodyfikowany przeze mnie kod który cipomoże
btw w internecie jest PEŁNo takich projektów..

Wielkość binarna szkicu: 8 092 bajtów/ raczej nie wejdzie na atmege 8

Kod: Zaznacz cały

// This Arduino sketch reads DS18B20 "1-Wire" digital
// temperature sensors.
// Tutorial:
// http://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

// Connections:
// rs (LCD pin 4) to Arduino pin 12
// rw (LCD pin 5) to Arduino pin 11
// enable (LCD pin 6) to Arduino pin 10
// LCD pin 15 to Arduino pin 13
// LCD pins d4, d5, d6, d7 to Arduino pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int buttonPin  = 10;
int ledPin = 8; // pin 13 will control the backlight
int ledState = HIGH;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin

// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long lastDebounceTime = 0;  // the last time the output pin was toggled
long debounceDelay = 20;
#define ONE_WIRE_BUS 9

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// Assign the addresses of your 1-Wire temp sensors.
// See the tutorial on how to obtain these addresses:
// http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html

DeviceAddress insideThermometer = {0x28, 0x2B, 0x13, 0x2E, 0x05, 0x00, 0x00, 0x32 };
DeviceAddress outsideThermometer = {0x28, 0xC2, 0xB8, 0x2D, 0x05, 0x00, 0x00, 0x46 };

void setup(void)
{
  
// Start up the library
sensors.begin();
// set the resolution to 10 bit (good enough?)
sensors.setResolution(insideThermometer, 10);
sensors.setResolution(outsideThermometer, 10);

  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

  // set initial LED state
  digitalWrite(ledPin, ledState);
 // turn backlight on. Replace 'HIGH' with 'LOW' to turn it off.
lcd.begin(16,2); // columns, rows. use 16,2 for a 16x2 LCD, etc.
lcd.clear(); // start with a blank screen
}

void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
lcd.print("ERROR");
} else {
lcd.print(tempC);

}
}

void loop(void){
int reading = digitalRead(buttonPin);

  // check to see if you just pressed the button 
  // (i.e. the input went from LOW to HIGH),  and you've waited 
  // long enough since the last press to ignore any noise:  

  // If the switch changed, due to noise or pressing:
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  } 
  
  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != buttonState) {
      buttonState = reading;

      // only toggle the LED if the new button state is HIGH
      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }
  
  // set the LED:
  digitalWrite(ledPin, ledState);

  // save the reading.  Next time through the loop,
  // it'll be the lastButtonState:
  lastButtonState = reading;
sensors.requestTemperatures();
lcd.setCursor(0,0);
lcd.print("In:  ");
printTemperature(insideThermometer);
lcd.print(" ");
lcd.write(0xDF);
  lcd.print("C   " );  
lcd.setCursor(0,1);
lcd.print("Out: ");
printTemperature(outsideThermometer);
lcd.print(" ");
lcd.write(0xDF);
lcd.print("C   ") ; 
}
Lukaszja
Majsterkowicz
Posty: 55
Rejestracja: 28 maja 2013, 18:58

Re: Arduino+ 2xDallas 18b20

Post autor: Lukaszja » 24 lip 2014, 12:06

kazzik87 pisze:
Lukaszja pisze:Czy mógłbym mi ktoś "pomóc" napisać program który by to mógł obsługiwać.
Zakładam że nikt za Ciebie tego nie napisze :-) Możemy pomóc w rozwiązaniu zaistniałych problemów.

Proponuje zacząć od schematu:
1) Może taki na początek
2) Potem możesz się zacząć bawić tym

Tu masz przykład napisany w C dla Atmegi - link


Na jakim poziomie jesteś w programowaniu uC? Powiedzmy skala 0 -10, gdzie: 0 - laik; 5 - korzystanie z bibliotek, pisanie swoich funkcji; 10 - struktury, callbacki itp.

P.S.
Gotowych programów oraz opisów jak to zrobić jest na necie :-)

nie nie liczyłem ze ktos to zrobi za mnie tylko myslałem ze ten czujnik jest tak popularny ze ktos robił jakis termometr i mógłby się podzielic kodem:)
Lukaszja
Majsterkowicz
Posty: 55
Rejestracja: 28 maja 2013, 18:58

Re: Arduino+ 2xDallas 18b20

Post autor: Lukaszja » 24 lip 2014, 12:10

przy załadowaniu tego programu przez arduino ide wyskoczył mi taki error:
sketch_jul24a.ino:7:31: warning: DallasTemperature.h: No such file or directory
sketch_jul24a:18: error: variable or field 'printTemperature' declared void
sketch_jul24a:18: error: 'DeviceAddress' was not declared in this scope
sketch_jul24a:34: error: 'DallasTemperature' does not name a type
sketch_jul24a:40: error: 'DeviceAddress' does not name a type
sketch_jul24a:41: error: 'DeviceAddress' does not name a type
sketch_jul24a.ino: In function 'void setup()':
sketch_jul24a:47: error: 'sensors' was not declared in this scope
sketch_jul24a:49: error: 'insideThermometer' was not declared in this scope
sketch_jul24a:50: error: 'outsideThermometer' was not declared in this scope
sketch_jul24a.ino: At global scope:
sketch_jul24a:62: error: variable or field 'printTemperature' declared void
sketch_jul24a:62: error: 'DeviceAddress' was not declared in this scope
Lukaszja
Majsterkowicz
Posty: 55
Rejestracja: 28 maja 2013, 18:58

Re: Arduino+ 2xDallas 18b20

Post autor: Lukaszja » 24 lip 2014, 12:11

przy załadowaniu tego programu przez arduino ide wyskoczył mi taki error:
sketch_jul24a.ino:7:31: warning: DallasTemperature.h: No such file or directory
sketch_jul24a:18: error: variable or field 'printTemperature' declared void
sketch_jul24a:18: error: 'DeviceAddress' was not declared in this scope
sketch_jul24a:34: error: 'DallasTemperature' does not name a type
sketch_jul24a:40: error: 'DeviceAddress' does not name a type
sketch_jul24a:41: error: 'DeviceAddress' does not name a type
sketch_jul24a.ino: In function 'void setup()':
sketch_jul24a:47: error: 'sensors' was not declared in this scope
sketch_jul24a:49: error: 'insideThermometer' was not declared in this scope
sketch_jul24a:50: error: 'outsideThermometer' was not declared in this scope
sketch_jul24a.ino: At global scope:
sketch_jul24a:62: error: variable or field 'printTemperature' declared void
sketch_jul24a:62: error: 'DeviceAddress' was not declared in this scope
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Arduino+ 2xDallas 18b20

Post autor: stiven » 24 lip 2014, 12:56

Chyba nie masz biblioteki do obsługi tego termometru.
Lukaszja
Majsterkowicz
Posty: 55
Rejestracja: 28 maja 2013, 18:58

Re: Arduino+ 2xDallas 18b20

Post autor: Lukaszja » 24 lip 2014, 15:31

własnie chodzi o to, ze mam wrzucone te biblioteki do tego folderu co potrzeba. A jak chcem wrzucic jakiś przykład np z dallas temperature to wyskakuje błąd kompilacji(w arduino mam obecnie włozoną atmege328 wiec miejsce mam na 100%)
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Arduino+ 2xDallas 18b20

Post autor: stiven » 24 lip 2014, 15:35

Musisz coś robić źle z tą biblioteką. Możesz dodać tą bibliotekę do programu w arduino ide?
kazzik87
Starszy majsterkowicz
Posty: 440
Rejestracja: 14 lip 2014, 21:54
Lokalizacja: Lublin

Re: Arduino+ 2xDallas 18b20

Post autor: kazzik87 » 24 lip 2014, 16:45

Wklej kod programu głównego.
Lukaszja pisze:sketch_jul24a.ino:7:31: warning: DallasTemperature.h: No such file or directory
Błąd ewidentnie świadczy o braku pliku "DallasTemperature.h".

Do folderu projektu dodałeś?
Do kodu zainkludowałeś?
---
Jeżeli pomogłem to kliknij "Pomógł".
panklesk
Majsterkowicz
Posty: 124
Rejestracja: 30 cze 2014, 21:38
Kontakt:

Re: Arduino+ 2xDallas 18b20

Post autor: panklesk » 25 lip 2014, 15:00

kuba0.0 pisze: Wielkość binarna szkicu: 8 092 bajtów/ raczej nie wejdzie na atmege 8

Kod: Zaznacz cały

// This Arduino sketch reads DS18B20 "1-Wire" digital
// temperature sensors.
// Tutorial:
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

// Connections:
// rs (LCD pin 4) to Arduino pin 12
// rw (LCD pin 5) to Arduino pin 11
// enable (LCD pin 6) to Arduino pin 10
// LCD pin 15 to Arduino pin 13
// LCD pins d4, d5, d6, d7 to Arduino pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int buttonPin  = 10;
int ledPin = 8; // pin 13 will control the backlight
int ledState = HIGH;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin

// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long lastDebounceTime = 0;  // the last time the output pin was toggled
long debounceDelay = 20;
#define ONE_WIRE_BUS 9

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);


DeviceAddress insideThermometer = {0x28, 0x2B, 0x13, 0x2E, 0x05, 0x00, 0x00, 0x32 };
DeviceAddress outsideThermometer = {0x28, 0xC2, 0xB8, 0x2D, 0x05, 0x00, 0x00, 0x46 };

void setup(void)
{
  
// Start up the library
sensors.begin();
// set the resolution to 10 bit (good enough?)
sensors.setResolution(insideThermometer, 10);
sensors.setResolution(outsideThermometer, 10);

  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

  // set initial LED state
  digitalWrite(ledPin, ledState);
 // turn backlight on. Replace 'HIGH' with 'LOW' to turn it off.
lcd.begin(16,2); // columns, rows. use 16,2 for a 16x2 LCD, etc.
lcd.clear(); // start with a blank screen
}

void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
lcd.print("ERROR");
} else {
lcd.print(tempC);

}
}

void loop(void){
int reading = digitalRead(buttonPin);

  // check to see if you just pressed the button 
  // (i.e. the input went from LOW to HIGH),  and you've waited 
  // long enough since the last press to ignore any noise:  

  // If the switch changed, due to noise or pressing:
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  } 
  
  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != buttonState) {
      buttonState = reading;

      // only toggle the LED if the new button state is HIGH
      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }
  
  // set the LED:
  digitalWrite(ledPin, ledState);

  // save the reading.  Next time through the loop,
  // it'll be the lastButtonState:
  lastButtonState = reading;
sensors.requestTemperatures();
lcd.setCursor(0,0);
lcd.print("In:  ");
printTemperature(insideThermometer);
lcd.print(" ");
lcd.write(0xDF);
  lcd.print("C   " );  
lcd.setCursor(0,1);
lcd.print("Out: ");
printTemperature(outsideThermometer);
lcd.print(" ");
lcd.write(0xDF);
lcd.print("C   ") ; 
}
Tak się zastanawiam w jakim celu jest wstawiony tam przełącznik, jeśli by go nie było to program pewni by się zmieścił :D
Karaczan
Majsterkowicz
Posty: 81
Rejestracja: 23 lip 2014, 18:26

Re: Arduino+ 2xDallas 18b20

Post autor: Karaczan » 28 lip 2014, 13:11

Wywal SPI, i tak nie jest tu używana, ani nie jest w ogóle potrzebna.
Okrój kod z Ledów i przycisku.
Lukaszja
Majsterkowicz
Posty: 55
Rejestracja: 28 maja 2013, 18:58

Re: Arduino+ 2xDallas 18b20

Post autor: Lukaszja » 26 sie 2014, 15:52

Witam ponownie w końcu udało mi się odpalić termometr na arduino i teraz chciałbym spróbować wrzucić go na ATtiny 2313 . Czy byłby w stanie mi ktoś pomóc przerobic ten kod na Attiny .
poniżej wrzucam kod:)
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 7
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup(void)
{
Serial.begin(9600);
sensors.begin();
}
void loop(void)
{
sensors.requestTemperatures();
Serial.println("");
delay(500);
Serial.print("kabina: ");
Serial.println(sensors.getTempCByIndex(0));

Serial.print("paka: ");
Serial.println(sensors.getTempCByIndex(1));


}
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Arduino+ 2xDallas 18b20

Post autor: stiven » 26 sie 2014, 16:52

Chyba nic nie trzeba zmieniać, ewentualnie numer pinu. Ale attiny ma mało pamięci na program, te biblioteki do tego termometru są dosyć duże, może być tak, że program nie wejdzie i nic się na to nie poradzi.
giciors
Młodszy majsterkowicz
Posty: 37
Rejestracja: 12 sie 2014, 16:36

Re: Arduino+ 2xDallas 18b20

Post autor: giciors » 26 sie 2014, 20:31

Witam
No to jak uda ci się wrzucić obsługę 1 Wire i jeszcze do tego jakąś obsługę LCD ( i tu zależy jakiego ) to życzę powodzenia w 2kB to Teoretycznie nie jest możliwe chociaż kiedyś widziałem coś takiego na Atiny z obsługą wyświetlacza ale to było mistrzostwo świata z kodem ...postaram się znaleźć to wyślę linka.
giciors
Młodszy majsterkowicz
Posty: 37
Rejestracja: 12 sie 2014, 16:36

Re: Arduino+ 2xDallas 18b20

Post autor: giciors » 26 sie 2014, 20:38

witam
znalazłem ale na LED 7 segment (driver jest dużo prostszy zajmuje mało pamięci , dużo mniej niż LCD - definicja znaków + kod ). i to się zmieści to 2kB, spróbuj tak. Ja kiedyś zrobiłem jeszcze inne cudo temperatura pokazywana była za pomocą LEDów 3 szt za pomocą mignięć dziesiątek i mignięć jednności ale odczyt zajmował dużo czasu bo trzeba było liczyć mignięcia poszczególnych LED.
giciors
Młodszy majsterkowicz
Posty: 37
Rejestracja: 12 sie 2014, 16:36

Re: Arduino+ 2xDallas 18b20

Post autor: giciors » 26 sie 2014, 20:39

giciors
Młodszy majsterkowicz
Posty: 37
Rejestracja: 12 sie 2014, 16:36

Re: Arduino+ 2xDallas 18b20

Post autor: giciors » 26 sie 2014, 21:04

a nie możesz sobie zakupić attiny 45 i jakiś extander portów na i2c i do tego podłączyć LCD i całą resztę , wydaje mi się iż nie da rady teraz przypomniało mi się jak pisałem bibliotekę do QDSP że sama definicja fontów ASCIi zajmuje w formacie 5x7 480 bajtów to zostaje naprawdę mało na cokolwiek.
Lukaszja
Majsterkowicz
Posty: 55
Rejestracja: 28 maja 2013, 18:58

Re: Arduino+ 2xDallas 18b20

Post autor: Lukaszja » 14 wrz 2014, 18:31

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 7
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup(void)
{
Serial.begin(9600);
sensors.begin();
}
void loop(void)
{
sensors.requestTemperatures();
Serial.println("");
delay(500);
Serial.print("kabina: ");
Serial.println(sensors.getTempCByIndex(0));
Serial.print("paka: ");
Serial.println(sensors.getTempCByIndex(1));
}
sorki za pomyłke we wczesniejszym kodze tutaj jest całość:)
czy mógłby mi ktoś tak wytłumaczyć czy w tym kodzie muszę coś zmieniać zeby działało na atmega328
czy tylko wystarczy wrzucić kod na arduino wyjąc atmege podłaczyć wszystko tak jak jest w rozpisce z wyprowadzeniami pinów podłączyc kondensatory filtrujące , zewnętrzny kwarc i reszte elementów?
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Arduino+ 2xDallas 18b20

Post autor: stiven » 14 wrz 2014, 19:09

Nic nie trzeba zmieniać w kodzie. Przed wgraniem programu trzeba jeszcze wgrać bootloader.
Tutaj jest napisane jak przygotować do tego arduino ide i jak wgrać bootloader i program bez wyjmowania atmegi z płytki: http://majsterkowo.pl/przenoszenie-prototypu-na-atmege/
Wybierając bootloader 8MHz dla atmega328p, nie potrzeba podłączać zewnętrznego kwarcu, działa wtedy wewnętrzny kwarc.
ODPOWIEDZ

Strony partnerskie: