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


Ocena wątku:
  • 1 głosów - średnia: 4
  • 1
  • 2
  • 3
  • 4
  • 5
ESP32 czy potrzebny egzorcysta?
#1
Question 
Witam,

Zrobiłem układ OneWire na Mega2560 z którego składał się 6x DS18B20. Wszystko pięknie działało, miałem dodać tylko WiFi w niedalekiej przyszłości. Lecz przyszłość przyszła szybciej, bo burza uszkodziła zasilacz oraz wszystkie czujniki.

Więc już chcąc zrobić na gotowo projekt, kupiłem ESP32 zrobiłem specjalną płytkę, przez którą mam wszystkie podłączenia przewodowe i niby wszystko jest ok, ale na wyświetlaczach nie odświeża temperatury tylko pokazuje pierwszą odczytaną po starcie.

Schemat podłączenia wygląda mniej więcej tak jak w załączniku.

Dodam tylko, że jak zasilam ESP z USB laptopa, a całą płytkę z zasilacza to normalnie odświeża, takie cyrki dzieją się gdy zasilam go z zasilacza sieciowego. Podmieniałem już chyba 3 zasilacze i nic to nie dało.

Jeżeli ktoś ma jakiś pomysł jakie siły nieczyste tutaj panują proszę o podzielenie się opinią a może akurat pomoże Wink

Pozdrawiam, Patryk.

A i zapomniałbym. Kod:
Cytat:#include <Arduino.h>
#include <WiFi.h>
#include <TM1637Display.h>
#include <OneWire.h>
#include <DS18B20.h>

#define CLK_1 14
#define CLK_2 16
#define CLK_3 17
#define CLK_4 18
#define CLK_5 19
#define CLK_6 21

#define DIO_1 16
#define DIO_2 17
#define DIO_3 18
#define DIO_4 19
#define DIO_5 21
#define DIO_6 14

const char* ssid    = "";
const char* password = "";
//WiFiServer server(80);

TM1637Display d1(CLK_1, DIO_1);
TM1637Display d2(CLK_2, DIO_2);
TM1637Display d3(CLK_3, DIO_3);
TM1637Display d4(CLK_4, DIO_4);
TM1637Display d5(CLK_5, DIO_5);
TM1637Display d6(CLK_6, DIO_6);

OneWire ds(27);
DS18B20 sensors(&ds);
uint8_t clearMe[]={
  0,0,0,0
};
uint8_t dodajC[]{
  0,0,SEG_D,0
};

#define SENSORS_NUM 6
const byte adress[SENSORS_NUM][8] PROGMEM ={
  0x28, 0x18, 0xE, 0xB, 0xD, 0x0, 0x0, 0xC2,
  0x28, 0x9, 0x60, 0xA, 0xD, 0x0, 0x0, 0x92,
  0x28, 0xEA, 0x39, 0xC, 0xD, 0x0, 0x0, 0x8D,
  0x28, 0x4D, 0x67, 0xA, 0xD, 0x0, 0x0, 0x6A,
  0x28, 0xF6, 0x56, 0xA, 0xD, 0x0, 0x0, 0xDC,
  0x28, 0x7E, 0x15, 0xB, 0xD, 0x0, 0x0, 0xBF
};

int getTempCalkowita(float temp){
  int i = temp;
  return i;}
int getTempDziesiate(float temp){
  String s = String(temp);
  int kropka = s.indexOf('.');
  return (s.substring(kropka+1)).substring(0,1).toInt();}

//------------------------------------------------------SETUP
void setup() {
  // put your setup code here, to run once:
  while(!Serial);
  Serial.begin(115200);
  //randomSeed(analogRead(0));
  sensors.begin();
  sensors.request();
  d1.setBrightness(2);
  d2.setBrightness(2);
  d3.setBrightness(2);
  d4.setBrightness(2);
  d5.setBrightness(2);
  d6.setBrightness(2);
  delay(10);
  // We start by connecting to a WiFi network
  Serial.print("Connecting to ");
  Serial.println(ssid);
/* WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  server.begin();*/
}
//------------------------------------------------------LOOP
int value = 0;
void loop() {
 
  // put your main code here, to run repeatedly:
  if(sensors.available()){
    float temperature[6];
    for(byte i=0;i<SENSORS_NUM;i++){
      temperature[i] = sensors.readTemperature(FA(adress[i]));
      //Serial.println(String(i)+": "+String(temperature[i]));
    }
    //for(byte i=0;i<6;i++){
    //  float t = random(20,32) + random(10)/10.0;
    //  Serial.println(String(i)+": "+String(t));
    //  temperature[i] = t;
    //}
    d1.setSegments(dodajC);
    d1.showNumberDec(getTempCalkowita(temperature[0]),false,2,0);
    d1.showNumberDec(getTempDziesiate(temperature[0]),false,1,3);
    d2.setSegments(dodajC);
    d2.showNumberDec(getTempCalkowita(temperature[1]),false,2,0);
    d2.showNumberDec(getTempDziesiate(temperature[1]),false,1,3);
    d3.setSegments(dodajC);
    d3.showNumberDec(getTempCalkowita(temperature[2]),false,2,0);
    d3.showNumberDec(getTempDziesiate(temperature[2]),false,1,3);
    d4.setSegments(dodajC);
    d4.showNumberDec(getTempCalkowita(temperature[3]),false,2,0);
    d4.showNumberDec(getTempDziesiate(temperature[3]),false,1,3);
    d5.setSegments(dodajC);
    d5.showNumberDec(getTempCalkowita(temperature[4]),false,2,0);
    d5.showNumberDec(getTempDziesiate(temperature[4]),false,1,3);
    d6.setSegments(dodajC);
    d6.showNumberDec(getTempCalkowita(temperature[5]),false,2,0);
    d6.showNumberDec(getTempDziesiate(temperature[5]),false,1,3);
    delay(5000);
    d1.setSegments(clearMe);
    d2.setSegments(clearMe);
    d3.setSegments(clearMe);
    d4.setSegments(clearMe);
    d5.setSegments(clearMe);
    d6.setSegments(clearMe);
    delay(500);
  /* WiFiClient client = server.available();
    if(client){
      Serial.println("New Client.");
      String currentLine="";
      while(client.connected()){
        if(client.available()){
          char c = client.read();
          Serial.write©;
          if(c=='\n'){
            if(currentLine.length() ==0){
              client.println("HTTP/1.1 200 OK");
              client.println("Content-type:text/html");
              client.println();
              client.print("<html><head><title>Temperatura</title><style>table, td {border: 2px solid black;}</style></head><body>");
              client.print("<center><b><h1>Temperatura<h2><br><table style=\"width:30%\"><tr><th><left>Pomieszczenie</left></th><th>Odczyt</th></tr>");
              client.print("<tr><td><center>Pierwsze drzwi</td><td><center>"+String(temperature[0])+"</td></tr>");
              client.print("<tr><td><center>Warchlakarnia</td><td><center>"+String(temperature[1])+"</td></tr>");
              client.print("<tr><td><center>Piwnica</td><td><center>"+String(temperature[2])+"</td></tr>");
              client.print("<tr><td><center>Porodowka</td><td><center>"+String(temperature[3])+"</td></tr>");
              client.print("<tr><td><center>Selekcja</td><td><center>"+String(temperature[4])+"</td></tr>");
              client.print("<tr><td><center>Stodola</td><td><center>"+String(temperature[5])+"</td></tr></table>");
              client.print("</b><br><a href=\"\" onClick=\"window.location.reload()\">Refresh</a></center>");
              client.print("</body></html>");
           
              // The HTTP response ends with another blank line:
              client.println();
              // break out of the while loop:
              break;
            } else {    // if you got a newline, then clear currentLine:
            currentLine = "";
          }}
        else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }}}
        client.stop();
        Serial.println("Client Disconnected.");*/
  //    }
    }
  }


Załączone pliki Miniatury
       
 
Odpowiedź
#2
DS18B20 działają świetnie zasilane z 3.3V (choć nie testowałem dużych odległości), a ten sam poziom logiczny zapewnia większą skuteczność komunikacji między elementami na płytce. Może dodaj konwertery logiki tam gdzie zasilasz urządzenia jednak z 5V, do DS są wymagane dwukierunkowe.
Można też wszystko zrobić używając jakiegoś AVR i tylko przesłać przez UART dane do ESP32 by ten to udostępniał dalej po WIFI.
Zobacz też, czy gdy nie uruchamiasz WIFI w ESP32 wszystko działa OK, jeśli tak to jednak zasilanie, dodatkowe kondensatory przy VCC mogą pomóc.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
(17-09-2021, 20:03)kaczakat napisał(a): DS18B20 działają świetnie zasilane z 3.3V (choć nie testowałem dużych odległości), a ten sam poziom logiczny zapewnia większą skuteczność komunikacji między elementami na płytce. Może dodaj konwertery logiki tam gdzie zasilasz urządzenia jednak z 5V, do DS są wymagane dwukierunkowe.
Można też wszystko zrobić używając jakiegoś AVR i tylko przesłać przez UART dane do ESP32 by ten to udostępniał dalej po WIFI.
Zobacz też, czy gdy nie uruchamiasz WIFI w ESP32 wszystko działa OK, jeśli tak to jednak zasilanie, dodatkowe kondensatory przy VCC mogą pomóc.
Waga sieci onewire ma blisko 200m.
Nie zależy mi na szybkości odczytów.
W tej chwili z kodu mam wyrzucone wifi (zakomentowane). 
Szczerze o kondensatorze też myślałem lecz nie wiem jakiego użyć. 
Przy mierzeniu napięć zaobserwowałem że z USB daje równe 5.00V a zasilacze jeden 5.5V drugi 5.36 trzeci 5.13V może to też mieć jakiś wpływ?
 
Odpowiedź
#4
Nie ma wpływu, na płytce jest stabilizator LDO 3.3V dopiero potem zasila esp32 bardziej byś napisał ile te zasilacze mają mocy bo to jest ważne..

for(byte i=0;i<SENSORS_NUM;i++){
temperature[i] = sensors.readTemperature(FA(adress[i]));
//Serial.println(String(i)+": "+String(temperature[i]));
delay(0);
}
//for(byte i=0;i<6;i++){
// float t = random(20,32) + random(10)/10.0;
// Serial.println(String(i)+": "+String(t));
// temperature[i] = t;
//}

zobacz czy to delay pomogło bo ten for blokuje rdzeń na około 8s....
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#5
Wszystkie zasilacze mają 2A.
Zaraz zobaczę czy pomoże Smile
 
Odpowiedź
#6
Z ESP też mam czasem odczucia, że egzorcysta by się przydał. Oczywiście tym większe kłopoty im większe skróty w programie i na sprzęcie. Niedawno wrzuciłem nowe core, miałem 2.5.2 i przy tych powyżej 3 w ogóle się przestało kompilować. Po prostu przeniosłem zmienne do innej zmiennej poza argument funkcji, dałem jej jeden gotowy string do wysłania i zaczęło kompilować. Wcześniej tak się dało, w nowym już nie. Po wgraniu jednak zaczął się sypać po ruszeniu suwakami obsługującymi kod programu z przeglądarki WWW. Przy okazji wgrałem nowszą bibliotekę do websockets i znowu zabawa, bo inne rzeczy nie działają. W końcu wróciłem do poprzedniej wersji i zaczęło działać OK. Teraz przetestowałem najnowszą bibliotekę i jednak działa od paru godzin. Może jeszcze skuszę się na nowy core ESP.
Z DS też różnie bywa, one mogą mocno przekłamywać wyniki. Kilka termometrów podłączyłem do 3.3V i 4.7k, jeden z nich pokazywał ~90oC w pokoju, reszta normalnie. Okazało się, że zaczął działać normalnie albo na 5V z 4.7k, albo z rezystorem 2.2k na 3V, co jest logiczne gdy napięcie jest niższe. Ale teraz mam wątpliwości czy biblioteka w ogóle sprawdza CRC, czy tak wrzuca te odczyty z dupy. Czujniki zasilane z 5V na ESP8266 pokazują temperatury w cały świat, niby działają, ale co jakiś czas sypią poważnymi błędami. Z drugiej strony poważne różnice można wychwycić, jak zaczną oszukiwać o 20% to będzie trudniej zauważyć, że ten rezystor czy napięcie tu nie pasuje.
Kabel USB nawet może mieć znaczenie, te mi padają częściej niż płytki.
Ale do brzegu, przy 200m to proponuję zastosować jakiś sprzętowy driver do ONEWIRE. Albo jak działało jako tako z AVR na 5V to wróć do tego i prześlij pomiary przez UART AVR (NANO w zupełności wystarczy) do ESP.
Pomiary napięć nic nie dają jeśli robisz to multimetrem, może być spadek do 0V długości kilku ms i tego nie zauważy. Kondensatory mogą być dowolne, od 100n ceramiczne aż po elektrolityczne. Miałem taką płytkę ESP32, która w ogóle nie ruszyła bez kondensatora 100u.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
DS iczas Odpowiedzi
Prawie wszyscy zapominają, że DS jest bardzo powolny,
zanim pierwszy zostanie wyczytany, drugi jest czytany = Błąd w PRG. co wiem ze w Libary niema zadnego spowalniacza (dellay()) w przypadku odczytu wielu innych czujnikow
Wtedy zdarza się, że na linii jest korek i wszystko się wali.
Zobacz w Danych od DS na potrzebny czas do odczytu
jestem przeciwko dellay ale tu jest potrzebne ok 50milisekund co najmniej
 
Odpowiedź
#8
Przepraszam, że tak długo nie było ode mnie odzewu.
Miałem inną pracę i powracam do tego projektu.
I mam dla was nowe informacje, dalej nie działa.

W głównym wątku musiałem się pomylić co do odświeżania po zasileniu z laptopa, bo gdy dziś użyłem tego sposobu to w ogóle nie odświeża w dalszym ciągu nawet po zastosowania filtra CR.

Cały układ odświeża temepratury gdy się go zrestartuje (odłączy zasilanie i ponownie się podłączy).
Również robiłem debug w kodzie i cały czas mi pokazuje stary odczyt temperatury, czyli jakby ROM go nie nadpisywal i w sensor.readTemperature() pokazuje caly czas tą samą temperaturę.

Myślę, że problemem mogą być rezystory które umieściłem w połączeniu do każdej z czujników aby one mogły w ogóle komunikować z moim ESP. Nie pamiętam jakie zastosowałem a teraz jest ciemno i nie mam jak sprawdzić ale myślę że jakieś 100-150oHm.

Podmieniłem również całe ESP na nowe lecz to nie przyniosło skutku.
Albo może czas konwersji w pliku onewire jest nie taki?


//Edit.
Wgrałem dla testów kod przykładowy z onewire
I mam nowe odczyty. Więc wychodzi wszystko na to, że biblioteki nie są dostosowane do mojego projektu, a cały system który stworzyłem pracuje znakomicie.
Dziękuję wszystkim za udział w temacie, Pozdrawiam.

Jednak wszystko wina była tego, że nie napisałem jednej linijki
sensors.request();

i tyle zachodu o moją małą głupotę.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości