• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Nie odczytuje temp. z kilku Ds18b20
#1
Witajcie,
Potrzebuje pomocy w dopisaniu kilku linijek kodu. 
Mam Plytkę NodeMcu v3 z esp8266. Tworzę termometr na 3DS z wyświetlaniem na LCD oraz wysyłaniem do Blynk. 
Mam już ogarnięte praktycznie wyszystko, tylko kod odczytuje mi 1 czujnik, na pozostalych jest -127. Spowodowane jest to że pewnie nie wyszukuje reszty czujników. 
Prosiłbym o pomoc w dopisaniu tego kawałka kodu aby odczytywać temp. z 3 czujników. 
poniżej kod który mam do tej pory
Kod:
#define BLYNK_PRINT Serial
#include <DallasTemperature.h>
#include <OneWire.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <Wire.h>
#include <TimeLib.h>
#include <WidgetRTC.h>

WidgetRTC rtc;

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);


#define ONE_WIRE_BUS 2 // D4
#define TEMPERATURE_PRECISION 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

BlynkTimer timer;


float temp1=0;
float temp2=0;
float temp3=0;




char auth[] = "";// kod blynk
char ssid[] = "";// nazwa sieci
char pass[] = "";// hasło


BLYNK_CONNECTED()
{
Blynk.syncAll();
}
//*********************************************************

void temp()
{


temp1 = sensors.getTempCByIndex(1);
temp2 = sensors.getTempCByIndex(2);
temp3 = sensors.getTempCByIndex(3);
sensors.requestTemperatures();

Blynk.virtualWrite(1,temp1);
Blynk.virtualWrite(2,temp2);
Blynk.virtualWrite(3,temp3);

lcd.setCursor(0, 0);
lcd.print("temp1 ");
lcd.print(temp1);
lcd.setCursor(0, 1);
lcd.print("temp2 ");
lcd.print(temp2);
lcd.setCursor(0, 2);
lcd.print("temp3 ");
lcd.print(temp3);
lcd.setCursor(0, 3);

}
void setup()
{
Serial.begin(9600);
//Blynk.begin(auth, ssid, pass);
// You can also specify server:
Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 80);
//Blynk.begin(auth, ssid, pass, IPAddress(192,148,1,147), 8080);


timer.setInterval(1000L, temp);
}
void loop()
{
Blynk.run();
timer.run();

}
 
Odpowiedź
#2
Zapoznaj się z tym https://forbot.pl/blog/kurs-arduino-ii-t...20-id18414
Tam jest przykład z dwoma czujnikami. Można łatwo go rozbudować do 3. Zauważ, że indeksuje się od 0. Ponadto najpierw pobiera się temperatury z czujników a potem odczytuje. Ty masz odwrotnie. Stwórz sobie podprogram do odczytu temperatur, a odczytaną temperaturę zapisuj do zmiennych globalnych, aby był dostęp do nich w każdym miejscu programu.
Najpierw potrenuj z wyświetleniem temperatur na konsoli.
 
Odpowiedź
#3
A ja dodam o siebie, żeby jednak ograniczać używanie zmiennych globalnych. Lepiej żeby funkcja zwracała odczytaną temperaturę i usuwała zmienne. Nawet wewnątrz funkcji możesz klamerkami ustawiać zasięgi dla skracania ich żywota.
A jak już jesteśmy przy oszczędzaniu miejsca, to wiesz że można odczytywać dane z DS bez używania float?
//********************************
Zmienne globalne to zło.
Float to jeszcze większe zło.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#4
Oczywiście jak mamy dużo zmiennych to trzeba umiejętnie z nich korzystać. W tym przypadku i dodatkowo dla nauki pisania podprogramów można stosować te kilka zmiennych nawet float jako globalne. Tak na początek.
Zapewne nie trzeba nawet zapisywać wartości temperatur do zmiennych bo są one w strukturze, którą tworzy biblioteka do czujników. Tego jednak nie analizowałem bo nie miałem potrzeby a i jestem cienki w te klocki.
 
Odpowiedź
#5
ja jestem całkiem zielony z programowania w innym języku niż podstawy HTML na poziomie szkoły podstawowej.
Powyższy kod skleiłem z kilku z tutoriali w internecie, trochę podpowiedział kolega.

Przy pomocy kursu podesłanego przez kolegę agregacika napisałem taki kod 
Kod:
#include <LiquidCrystal_I2C.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#define BLYNK_PRINT Serial
#define ONE_WIRE_BUS D4
#define TEMPERATURE_PRECISION 11
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki
LiquidCrystal_I2C lcd(0x27, 20, 4);

// adresy czujników
DeviceAddress keg = { 0x10, 0x7A, 0x31, 0x99, 0x1, 0x8, 0x0, 0x4A };
DeviceAddress glowica = { 0x11, 0x7A, 0x31, 0x99, 0x1, 0x8, 0x0, 0x4A };
DeviceAddress polka = { 0x12, 0x7A, 0x31, 0x99, 0x1, 0x8, 0x0, 0x4A };

BlynkTimer timer;

char auth[] = "";// kod blynk
char ssid[] = "";// nazwa sieci
char pass[] = "";// hasło
BLYNK_CONNECTED()
{
Blynk.syncAll();
}


void setup(void) {
  Serial.begin(9600);
  sensors.begin(); //Inicjalizacja czujnikow
}

void loop(void) {
  sensors.requestTemperatures(); //Pobranie temperatury czujnika
  Serial.print("KEG: ");
  Serial.println(sensors.getTempC(keg));  //Wyswietlenie informacji
    Serial.print("Głowica: ");
  Serial.println(sensors.getTempC(glowica));  //Wyswietlenie informacji
    Serial.print("10 Półka: ");
  Serial.println(sensors.getTempC(polka));  //Wyswietlenie informacji

Blynk.virtualWrite(1,keg);
Blynk.virtualWrite(2,glowica);
Blynk.virtualWrite(3,polka);

lcd.setCursor(0, 0);
lcd.print("KEG ");
lcd.print(keg);
lcd.setCursor(0, 1);
lcd.print("Głowica ");
lcd.print(glowica);
lcd.setCursor(0, 2);
lcd.print("10 Półka ");
lcd.print(polka);
  delay(500);
}
void setup()
{
Serial.begin(9600);
//Blynk.begin(auth, ssid, pass);
// You can also specify server:
Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 80);
//Blynk.begin(auth, ssid, pass, IPAddress(192,148,1,147), 8080);


timer.setInterval(1000L, temp);
}
void loop()
{
Blynk.run();
timer.run();

}
 z błędem w linijce lcd.print(polka);
Cytat:exit status 1

call of overloaded 'print(DeviceAddress)' is ambiguous
 
Odpowiedź
#6
Według mnie ze sklejenia tych kodów wyszło "szwarc mydło i powidło" czyli nic.
Proponuję zapoznać się z podstawami programowania czyli jak zbudować poprawnie program.
Najpierw przez # include dodajemy gotowe biblioteki i możemy zdefiniować np. piny, potem inne magiczne powiązania, które wymagają dołączone biblioteki (proszę się nie śmiać nie jestem specjalistą). definiujemy też zmienne globalne.
Potem mamy:
void setup()
{
Tu pomiędzy klamrami wpisujemy to co ma się wykonać RAZ po uruchomieniu mikroprocesora.

}
Potem mamy:
void loop()
{
Tu pomiędzy "klamrami" piszemy co ma robić procesor w kółko aż do "znudzenia".
No chyba, że napotka z jakiejś przyczyny na problem, z którym sobie nie poradzi a właściwie programista nie przewidział czegoś, to się zatrzyma czyli "zawiesi"

}
To są podstawy, jak pomieszamy i będzie występował kilka razy setup czy loop jak to ma miejsce w Twoim przypadku to będzie kicha, nawet się nie skompiluje.
Twoja "polka" to jest zmienna, której nie zadeklarowałeś przed setupem, zresztą inne też nie zadeklarowałeś.
Naprawdę jak chcesz napisać jaki taki program to musisz się trochę poduczyć i zrozumieć co robisz. Bez tego nie da się rady pomóc.
Może to poczytaj https://plociennik.info/index.php/arduino-wstep
oraz inne części kursu, który podałem wcześniej.
 
Odpowiedź
#7
Kod się kompiluje, łączy i wysyła temperatury do Blynk, jednak nie wyświetla nic na LCD. 
Kod:
#define BLYNK_PRINT Serial
#include <DallasTemperature.h>
#include <OneWire.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <Wire.h>
#include <TimeLib.h>
#include <WidgetRTC.h>

WidgetRTC rtc;

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);


#define ONE_WIRE_BUS 2 // D4
#define TEMPERATURE_PRECISION 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

BlynkTimer timer;


float temp1=0;
float temp2=0;
float temp3=0;




char auth[] = "tRc1UuXAzESN-sEWStB9QPLExWwzCqcY";// kod blynk
char ssid[] = "";// nazwa sieci
char pass[] = "";// hasło


BLYNK_CONNECTED()
{
Blynk.syncAll();
}
//*********************************************************

void temp()
{


temp1 = sensors.getTempCByIndex(0);
temp2 = sensors.getTempCByIndex(1);
temp3 = sensors.getTempCByIndex(2);
sensors.requestTemperatures();

Blynk.virtualWrite(1,temp1);
Blynk.virtualWrite(2,temp2);
Blynk.virtualWrite(3,temp3);

lcd.begin(5,4);
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("temp1 ");
lcd.print(0);
lcd.setCursor(0, 1);
lcd.print("temp2 ");
lcd.print(1);
lcd.setCursor(0, 2);
lcd.print("temp3 ");
lcd.print(2);
lcd.setCursor(0, 3);

}
void setup()
{
Serial.begin(9600);
//Blynk.begin(auth, ssid, pass);
// You can also specify server:
Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 80);
//Blynk.begin(auth, ssid, pass, IPAddress(192,148,1,147), 8080);


timer.setInterval(1000L, temp);
}
void loop()
{
Blynk.run();
timer.run();

}

Podpowiecie w czym problem? Już ostatnia rzecz mi została do zrobienia i nie zawracam głowy Smile

Wrzuciłem na płytkę kod i2c scanner, i powiem Wam że nic nie znajduje... tylko godzina->

//Edit
Wszystko działa-ogarnąłem. Temat do zamknięcia

Dzięki wszystkim za pomoc Smile
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości