Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
-
Autor tematu - Posty: 951
- Rejestracja: środa, 30 mar 2016, 18:43
- Podziękował: 9 razy
- Otrzymał podziękowanie: 134 razy
-
Autor tematu - Posty: 951
- Rejestracja: środa, 30 mar 2016, 18:43
- Podziękował: 9 razy
- Otrzymał podziękowanie: 134 razy
-
- Posty: 183
- Rejestracja: sobota, 30 lis 2019, 12:53
- Podziękował: 26 razy
- Otrzymał podziękowanie: 7 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Próbuję przenieść kawałek kodu na esp8266. W sumie to moje pierwsze podejście do samodzielnego pisania kodu na ESP i mam mały problem.
Chciałbym tylko ustawiać moc grzałki, więc biorę kod Task1code, jest on wywoływany przez xTaskCreatePinnedToCore, którego na esp8266 nie ma. Wrzucam go do loop'a - wywalając niepotrzebne rzeczy i co jakieś 3-4 sekundy na konsoli widzę "Soft WDT reset" - czy ten problem nie występuje na esp32? Na ten moment zrobiłem obejście i kończę pętlę for po sekundzie - ale nie wiem czy nie bedzie problemów później jak będę odczytywał temperaturę z czujników itd.
Druga sprawa to włączanie grzałki. W programie moc jest realizowana poprzez wyłączanie/włączanie w przeciągu 1 sekundy - czy to nie wpływa negatywnie na sam ssr/grzałkę? Posiadam regulator Boleckiego i widzę, że ten czas jest tam dwukrotnie większy, tj 2 sekundy na cykl.
Chciałbym tylko ustawiać moc grzałki, więc biorę kod Task1code, jest on wywoływany przez xTaskCreatePinnedToCore, którego na esp8266 nie ma. Wrzucam go do loop'a - wywalając niepotrzebne rzeczy i co jakieś 3-4 sekundy na konsoli widzę "Soft WDT reset" - czy ten problem nie występuje na esp32? Na ten moment zrobiłem obejście i kończę pętlę for po sekundzie - ale nie wiem czy nie bedzie problemów później jak będę odczytywał temperaturę z czujników itd.
Druga sprawa to włączanie grzałki. W programie moc jest realizowana poprzez wyłączanie/włączanie w przeciągu 1 sekundy - czy to nie wpływa negatywnie na sam ssr/grzałkę? Posiadam regulator Boleckiego i widzę, że ten czas jest tam dwukrotnie większy, tj 2 sekundy na cykl.
Kod: Zaznacz cały
#define RelayPin D8
int PercentagePower = 50;
int HeaterTimeFrameInSeconds = 2;
unsigned long loopStartTime=0;
unsigned long timePassed=0;
void setup() {
}
void loop() {
pinMode(RelayPin, OUTPUT);
digitalWrite(RelayPin, LOW);
loopStartTime = millis();
for (;;)
{
timePassed = millis() - loopStartTime;
if (timePassed > (HeaterTimeFrameInSeconds * 1000))
{
break;
}
if ((PercentagePower * 10 * HeaterTimeFrameInSeconds) < timePassed)
{
digitalWrite(RelayPin, LOW);
}
else
{
digitalWrite(RelayPin, HIGH);
}
}
}
Ostatnio zmieniony poniedziałek, 26 paź 2020, 15:19 przez stefunk, łącznie zmieniany 3 razy.
-
- Posty: 105
- Rejestracja: poniedziałek, 17 sie 2020, 11:28
- Podziękował: 1 raz
- Otrzymał podziękowanie: 11 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
stefunk - to jest aktywne czekanie, tak się nie robi. Przecież przed wejściem do tego fora wiesz ile czasu masz być w stanie wysokim a ile w niskim. Chyba tam jest jakiś delay na tym sprzęcie? Z jaką częstotliwością chcesz sterować tym wyjściem?
Kod: Zaznacz cały
#define CYCLE_LENGTH_IN_MS 100
#define POWER_RESOLUTION 100
// UWAGA power musi być [0..POWER_RESOLUTION]
for (;;) { // jak szybko chcesz przełączać? 10Hz, czyli jeden obrót 100ms (100msx10 = 1s)
if (power>0) { // faza wysoka
digitalWrite(pin, HIGH);
delay(power * CYCLE_LENGTH_IN_MS / POWER_RESOLUTION); // najpierw mnożenie później dzielenie - zastanów się dlaczego
}
if (power<100) { // faza niska
digitalWrite(pin, LOW);
delay((POWER_RESOLUTION - power) * CYCLE_LENGTH_IN_MS / POWER_RESOLUTION);
}
}
Ostatnio zmieniony poniedziałek, 26 paź 2020, 18:21 przez jacek.kokot, łącznie zmieniany 1 raz.
-
- Posty: 183
- Rejestracja: sobota, 30 lis 2019, 12:53
- Podziękował: 26 razy
- Otrzymał podziękowanie: 7 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Wziąłem to z przykładu z tego tematu. Twoje podejście wygląda dużo lepiej, udało mi się złożyć wszystko w całość.
Kod: Zaznacz cały
#include <Scheduler.h>
#define RELAY_PIN D8
#define POWER_RESOLUTION 100
#define POWER_PERCENTAGE 50
#define HEATER_TIME_FRAME_IN_SECONDS 2
class HeaterTask : public Task {
public:
HeaterTask(int relayPin, int powerResolution, int percentagePower, int heaterTimeFrameInSeconds) {
_relayPin = relayPin;
UpdateHeaterParameters(powerResolution, percentagePower, heaterTimeFrameInSeconds);
}
void setup() {
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
}
void loop() {
if (_percentagePower > 0 ) {
turnAndWait(_highTimeInMiliseconds, HIGH);
}
if (_percentagePower < 100) {
turnAndWait(_lowTimeInMiliseconds, LOW);
}
}
void UpdateHeaterParameters(int powerResolution, int percentagePower, int heaterTimeFrameInSeconds) {
_powerResolution = powerResolution;
_percentagePower = percentagePower;
_heaterTimeFrameInSeconds = heaterTimeFrameInSeconds;
_highTimeInMiliseconds = _percentagePower * _heaterTimeFrameInSeconds * 1000 / _powerResolution;
_lowTimeInMiliseconds = (_powerResolution - _percentagePower) * _heaterTimeFrameInSeconds * 1000 / _powerResolution;
}
private:
int _relayPin, _powerResolution, _percentagePower, _heaterTimeFrameInSeconds, _highTimeInMiliseconds, _lowTimeInMiliseconds;
void turnAndWait(int timeInMiliseconds, int state) {
digitalWrite(RELAY_PIN, state);
delay(timeInMiliseconds);
}
} heater_task(RELAY_PIN, POWER_RESOLUTION, POWER_PERCENTAGE, HEATER_TIME_FRAME_IN_SECONDS);
void setup() {
//Serial.begin(115200);
//Serial.println("Setup");
Scheduler.start(&heater_task);
Scheduler.begin();
}
void loop() {}
Ostatnio zmieniony poniedziałek, 26 paź 2020, 20:18 przez stefunk, łącznie zmieniany 3 razy.
-
- Posty: 105
- Rejestracja: poniedziałek, 17 sie 2020, 11:28
- Podziękował: 1 raz
- Otrzymał podziękowanie: 11 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Nie widziałem tego przykładu nie będę się wypowiadał na jego temat. To jest tak, że każdy orze jak może. Tylko niektórzy powinni poprzestać na oraniu pola
Skoro już się czepiłem, to parę dodatkowych spraw.
1. Rozdziel deklaracje od definicji.
2. Zmienne PercentagePower i HeaterTimeFrameInSeconds są w tym kodzie prywatne dla klasy HeaterTask. Być może tu nie ma całości kodu i gdzieś tam coś je modyfikuje, ale w takim przypadku tak czy siak przydałaby się jakieś przypisanie ich własności do czegoś i dodanie synchronizacji.
3. RELAY_PIN jest naturalnym kandydatem na parametr konstruktora HeaterTask.
4. Inicjalizacja highTimeInMiliseconds i lowTimeInMiliseconds - tego się tak nie robi. To powinno być w konstruktorze.
5. Zamiast wyliczać na pałę highTimeInMiliseconds i lowTimeInMiliseconds lepiej w ogóle nie mieć takich zmiennych i wyliczać je na bieżąco w środku loop. Wtedy można modyfikować PercentagePower i niczym się nie martwić. Generalnie ogólna zasada jest taka, że im mniej przechowujesz stanu tym lepiej.
6. Jak być chciał być purystą, to zwróć uwagę, że highTimeInMiliseconds + lowTimeInMiliseconds wcale nie musi być 1000 * HeaterTimeFrameInSeconds. Jakbyś chciał to zapewnić trzeba by inicjalizować lowTimeInMiliseconds = 1000 * HeaterTimeFrameInSeconds - highTimeInMiliseconds.
7. Deklaracja heater_task jest bardzo błędogenna. Tego nie widać. Tak się nie robi.
Skoro już się czepiłem, to parę dodatkowych spraw.
1. Rozdziel deklaracje od definicji.
2. Zmienne PercentagePower i HeaterTimeFrameInSeconds są w tym kodzie prywatne dla klasy HeaterTask. Być może tu nie ma całości kodu i gdzieś tam coś je modyfikuje, ale w takim przypadku tak czy siak przydałaby się jakieś przypisanie ich własności do czegoś i dodanie synchronizacji.
3. RELAY_PIN jest naturalnym kandydatem na parametr konstruktora HeaterTask.
4. Inicjalizacja highTimeInMiliseconds i lowTimeInMiliseconds - tego się tak nie robi. To powinno być w konstruktorze.
5. Zamiast wyliczać na pałę highTimeInMiliseconds i lowTimeInMiliseconds lepiej w ogóle nie mieć takich zmiennych i wyliczać je na bieżąco w środku loop. Wtedy można modyfikować PercentagePower i niczym się nie martwić. Generalnie ogólna zasada jest taka, że im mniej przechowujesz stanu tym lepiej.
6. Jak być chciał być purystą, to zwróć uwagę, że highTimeInMiliseconds + lowTimeInMiliseconds wcale nie musi być 1000 * HeaterTimeFrameInSeconds. Jakbyś chciał to zapewnić trzeba by inicjalizować lowTimeInMiliseconds = 1000 * HeaterTimeFrameInSeconds - highTimeInMiliseconds.
7. Deklaracja heater_task jest bardzo błędogenna. Tego nie widać. Tak się nie robi.
-
- Posty: 2383
- Rejestracja: niedziela, 18 paź 2015, 14:00
- Krótko o sobie: Marzyciel
- Ulubiony Alkohol: Własny.
- Lokalizacja: Gorzów Wlkp.
- Podziękował: 268 razy
- Otrzymał podziękowanie: 338 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Napisz o co Ci chodzi, przecież tutaj nikt w mordę nie przyłoży... Nie pykło Ci coś dzisiaj? Chooojowy dzień był? Kurde... Nie rozumiem takich ludzi i zachowania...jacek.kokot pisze:Nie widziałem tego przykładu nie będę się wypowiadał na jego temat. To jest tak, że każdy orze jak może. Tylko niektórzy powinni poprzestać na oraniu pola
Pozdrawiam Gacek.
-
- Posty: 105
- Rejestracja: poniedziałek, 17 sie 2020, 11:28
- Podziękował: 1 raz
- Otrzymał podziękowanie: 11 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Ja nie chcę tu nic sugerować, ale chyba nieco nadinterpretowałeś moją wypowiedź. Chooojowy dzień był?
Ja Cię przepraszam bardzo, ale tak jak napisałem, nie widziałem tego kodu, nie mam pojęcia jaki to jest kod, ani tym bardziej czyj. Napisałem tylko, że czasami jest lepiej jak niektórzy nie zajmują się pewnymi rzeczami, ale to była uwaga ogólna, w oderwaniu od kodu (którego niewidziałem)..Gacek pisze:Napisz o co Ci chodzi, przecież tutaj nikt w mordę nie przyłoży... Nie pykło Ci coś dzisiaj? Chooojowy dzień był? Kurde... Nie rozumiem takich ludzi i zachowania...
Ja nie chcę tu nic sugerować, ale chyba nieco nadinterpretowałeś moją wypowiedź. Chooojowy dzień był?
Ostatnio zmieniony poniedziałek, 26 paź 2020, 21:17 przez jacek.kokot, łącznie zmieniany 1 raz.
-
- Posty: 105
- Rejestracja: poniedziałek, 17 sie 2020, 11:28
- Podziękował: 1 raz
- Otrzymał podziękowanie: 11 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Panowie... Ja nie widziałem tego kodu. Nie dyskutuję tu o żadnym konkretnym kodzie. Napisałem uwagę ogólną, że czasami ktoś opublikuje G**wno i następnie niczego nieświadomi ludzie się na tym wzorują i wychodzi jeszcze większe G******wno. To jest taki truizm, który ma zastosowanie w wielu miejscach i nie jest specyficzny z kodowania. Nie nazywam na G żadnego konkretnego kodu, ponieważ go nie widziałem. Proszę nie odbierać tego ad persona.stefunk pisze:Gacek, po prostu pracując z zawodzie, jak się widzi totalną prowizorkę, to szkoda słów
Ostatnio zmieniony poniedziałek, 26 paź 2020, 21:21 przez jacek.kokot, łącznie zmieniany 1 raz.
-
- Posty: 183
- Rejestracja: sobota, 30 lis 2019, 12:53
- Podziękował: 26 razy
- Otrzymał podziękowanie: 7 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Po co właściwie w tym wypadku rozdzielać deklaracje od definicji?
https://pastebin.com/SRzt9k1H
Kolejna porcja kodu ... nie wiem czy to wina esp'a czy coś źle zrobiłem, ale pokazuje mi złą temperature ... w okolicach 66 stopni, po ogrzaniu czujnika temperatura rośnie...
https://pastebin.com/SRzt9k1H
Kolejna porcja kodu ... nie wiem czy to wina esp'a czy coś źle zrobiłem, ale pokazuje mi złą temperature ... w okolicach 66 stopni, po ogrzaniu czujnika temperatura rośnie...
-
- Posty: 105
- Rejestracja: poniedziałek, 17 sie 2020, 11:28
- Podziękował: 1 raz
- Otrzymał podziękowanie: 11 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
stefunk - dlaczego nie działa, nie ma pojęcia, ale tak właściwie Ty korzystasz tam z klasy DallasTemperature, która z tego co rozumiem, jest z zewnątrz. Widzę co najmniej trzy opcje. Klasa działa źle (jeśli to jest zaufana klasa, używana przez wielu, bardzo mało prawdopodobne), używasz tej klasy źle (obstawiałbym tą opcję, może begin trzeba wołać w loop a może pomiędzy requestTemperatures a get trzeba dać delay - nie wiem) lub masz coś źle podłączone. Nie znam tej klasy. Nie powiem Ci konkretnie.
Drobne (naprawdę pierdoły) sugestie do kodu:
0. W rozdzieleniu deklaracji od definicji chodzi o to, że w kodzie trzeba trzeba tworzyć struktury wyższego rzędu, wydzielać elementy, ukrywać szczegóły implementacyjne. Tu masz tego kodu tyle co kto napłakał, więc pewnie, póki co, to będzie przerost formy nad treścią, ale warto mieć taki paradygmat z tyłu głowy, bo wraz z rozwojem projektu podział stanie się nieunikniony.
1. Sądzę, że '_' powinieneś używać do parametrów, aby inne zmienne nie miały '_'. Np.
2. Ja nie znam tej klasy, ale z tego co rozumiem sensors->getTempCByIndex(0); zwraca wynik dla pierwszego termometru z brzegu. Sądzę, że taki kod może w przyszłości ewaluować do getTempCByIndex(i); a wg mojej wiedzy magistrala 1-Wire nie daje żadnej gwarancji, że czujniki zawsze czytają się w tej samej kolejności. Reasumując uważam, że lepiej czytać DS po serialu. Jest tam taka opcja w ogóle?
3. W Twoim kodzie nie alokujesz dynamicznie żadnej klasy, a wskaźniki w C++ stają się coraz bardziej passe, więc zamiast pisać static SensorTask sensor_task(SENSOR_PIN, &sensors, &lcdService); i dalej SensorTask(int sensorPin, DallasTemperature *sensors, LcdService *lcdService) możesz napisać static SensorTask sensor_task(SENSOR_PIN, sensors, lcdService); i dalej SensorTask(int sensorPin, DallasTemperature& sensors, LcdService& lcdService).
Ale generalnie naprawdę ładny kod. Dałbym za niego studentowi 5.
Drobne (naprawdę pierdoły) sugestie do kodu:
0. W rozdzieleniu deklaracji od definicji chodzi o to, że w kodzie trzeba trzeba tworzyć struktury wyższego rzędu, wydzielać elementy, ukrywać szczegóły implementacyjne. Tu masz tego kodu tyle co kto napłakał, więc pewnie, póki co, to będzie przerost formy nad treścią, ale warto mieć taki paradygmat z tyłu głowy, bo wraz z rozwojem projektu podział stanie się nieunikniony.
1. Sądzę, że '_' powinieneś używać do parametrów, aby inne zmienne nie miały '_'. Np.
Kod: Zaznacz cały
HeaterTask(int _relayPin, int _powerResolution, int _percentagePower, int _heaterTimeFrameInSeconds) {
relayPin = _relayPin;
3. W Twoim kodzie nie alokujesz dynamicznie żadnej klasy, a wskaźniki w C++ stają się coraz bardziej passe, więc zamiast pisać static SensorTask sensor_task(SENSOR_PIN, &sensors, &lcdService); i dalej SensorTask(int sensorPin, DallasTemperature *sensors, LcdService *lcdService) możesz napisać static SensorTask sensor_task(SENSOR_PIN, sensors, lcdService); i dalej SensorTask(int sensorPin, DallasTemperature& sensors, LcdService& lcdService).
Ale generalnie naprawdę ładny kod. Dałbym za niego studentowi 5.
Ostatnio zmieniony wtorek, 27 paź 2020, 08:40 przez jacek.kokot, łącznie zmieniany 2 razy.
-
- Posty: 183
- Rejestracja: sobota, 30 lis 2019, 12:53
- Podziękował: 26 razy
- Otrzymał podziękowanie: 7 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
1. Wolę jak prywatne parametry mają _ w nazwie
2. To jest dopiero nauka biblioteki, będę się starał robić tak, żeby przyporządkować automatycznie jeden termometr w to samo miejsce
3. Programuje w C# i wskaźniki widzę pierwszy raz, nie licząc okresu studiów wiele lat temu
Gdybym nie programował od 13 lat to bym się z tej 5 bardzo ucieszył
Przyznam, że trochę mnie temat wciągnął i postanowiłem zrobić bibliotekę z asnychronicznym pobieraniem danych i powiadomieniami (o ile się da) na stronie, serwowanej przez ESP'a, z możliwością ustawienia mocy grzałki i wskazaniami temperatury.
Wszystko robię na licencji MIT, więc można będzie korzystać też komercyjnie - mam nadzieję, że zachęcę też forumowych producentów do wrzucania kodu, albo przynajmniej pomocy w rozwoju.
https://github.com/stefunkk/openstill
2. To jest dopiero nauka biblioteki, będę się starał robić tak, żeby przyporządkować automatycznie jeden termometr w to samo miejsce
3. Programuje w C# i wskaźniki widzę pierwszy raz, nie licząc okresu studiów wiele lat temu
Gdybym nie programował od 13 lat to bym się z tej 5 bardzo ucieszył
Przyznam, że trochę mnie temat wciągnął i postanowiłem zrobić bibliotekę z asnychronicznym pobieraniem danych i powiadomieniami (o ile się da) na stronie, serwowanej przez ESP'a, z możliwością ustawienia mocy grzałki i wskazaniami temperatury.
Wszystko robię na licencji MIT, więc można będzie korzystać też komercyjnie - mam nadzieję, że zachęcę też forumowych producentów do wrzucania kodu, albo przynajmniej pomocy w rozwoju.
https://github.com/stefunkk/openstill
-
- Posty: 406
- Rejestracja: wtorek, 13 lut 2018, 14:50
- Krótko o sobie: Jestem fajnym człowiekiem:)
- Ulubiony Alkohol: Piwo/ Cydr/ Bimberek
- Status Alkoholowy: Konstruktor
- Podziękował: 8 razy
- Otrzymał podziękowanie: 30 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
"Tutaj możemy się posłużyć programem demo Plik → Przykłady → OneWire → DS18x20, trzeba jednak pamiętać, aby na samym początku zmienić informacje o podłączeniu czujników"
a później w kodzie umieszczasz
Nie wiem, moze Ci to rozjaśni
Źródlo: https://forbot.pl/blog/kurs-arduino-ii- ... 20-id18414
W arduino IDEstefunk pisze: 2. To jest dopiero nauka biblioteki, będę się starał robić tak, żeby przyporządkować automatycznie jeden termometr w to samo miejsce
"Tutaj możemy się posłużyć programem demo Plik → Przykłady → OneWire → DS18x20, trzeba jednak pamiętać, aby na samym początku zmienić informacje o podłączeniu czujników"
a później w kodzie umieszczasz
Kod: Zaznacz cały
DeviceAddress termometrZewnetrzny = { 0x10, 0x7A, 0x31, 0x99, 0x1, 0x8, 0x0, 0x4A };
Źródlo: https://forbot.pl/blog/kurs-arduino-ii- ... 20-id18414
TERMOMETRY WIFI
https://www.facebook.com/TermometryWIFI/
https://www.facebook.com/TermometryWIFI/
-
- Posty: 183
- Rejestracja: sobota, 30 lis 2019, 12:53
- Podziękował: 26 razy
- Otrzymał podziękowanie: 7 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Raczej nie będę podawał ich adresów, wolałbym przy podmianie czujnika nie kompilować ponownie kodu. Może po prostu sortowanie po adresach, żeby zawsze były w tej samej kolejności
edit.
Odpaliłem przykład oneWire i niestety tam też jest zły odczyt.
ROM = 28 FF 48 9E 83 17 4 E
Chip = DS18B20
Data = 1 19 4 4B 46 7F FF C 10 1 CRC=1
Temperature = 65.56 Celsius, 150.01 Fahrenheit
No more addresses.
edit2
Downgrade biblioteki oneWire do 2.3.0 pomógł
edit.
Odpaliłem przykład oneWire i niestety tam też jest zły odczyt.
ROM = 28 FF 48 9E 83 17 4 E
Chip = DS18B20
Data = 1 19 4 4B 46 7F FF C 10 1 CRC=1
Temperature = 65.56 Celsius, 150.01 Fahrenheit
No more addresses.
edit2
Downgrade biblioteki oneWire do 2.3.0 pomógł
Ostatnio zmieniony wtorek, 27 paź 2020, 12:47 przez stefunk, łącznie zmieniany 2 razy.
-
- Posty: 105
- Rejestracja: poniedziałek, 17 sie 2020, 11:28
- Podziękował: 1 raz
- Otrzymał podziękowanie: 11 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Swoją drogą - jak testujesz czy odczyt w ogóle się udał?
Do testowania - jakkolwiek. Natomiast jak już coś będziesz chciał uruchomić - tylko po serialu. Inaczej nigdy nie będziesz miał pewności co czytasz. Zwróć uwagę, że przy kilku czyjnikach na tej samej magistrali możesz mieć tak, że przy kolejnym odczycie np. 2 z 5 czujników się nie przeczytają (nie bo nie i tyle). Wtedy to już w ogóle będzie miał loterię.stefunk pisze:Raczej nie będę podawał ich adresów, wolałbym przy podmianie czujnika nie kompilować ponownie kodu. Może po prostu sortowanie po adresach, żeby zawsze były w tej samej kolejności
Swoją drogą - jak testujesz czy odczyt w ogóle się udał?
-
- Posty: 183
- Rejestracja: sobota, 30 lis 2019, 12:53
- Podziękował: 26 razy
- Otrzymał podziękowanie: 7 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
No i utknąłem, chciałem za namową zrobić po adresach, ale chyba coś mam nie tak z wskaźnikami, bo mi adresy idą jakieś dziwne, chodzi mi o 1000552E204070 i 000000001 mimo zadeklarowania ich prawidłowo:
const std::map<const char*, const DeviceAddress&> SensorList
{
{"10Polka", { 0x28, 0xFF, 0xB4, 0xCE, 0x70, 0x17, 0x03, 0xBB }},
{"Glowica", { 0x28, 0xFF, 0x4C, 0xDE, 0x83, 0x17, 0x04, 0xF1 }},
{"Zbiornik", { 0x28, 0xFF, 0xE7, 0x7A, 0x83, 0x17, 0x04, 0x15 }},
{"Woda", { 0x28, 0xFF, 0xB7, 0x78, 0x90, 0x17, 0x05, 0x77 }}
};
żeby było jeszcze bardziej dziwnie, dwa ostatnie działają prawidłowo, kod tu: https://github.com/stefunkk/openstill
Devices count:
4
10Polka
-127.00
1000552E204070
Glowica
-127.00
000000001
Zbiornik
21.87
28FFE77A83174150
Woda
21.69
28FFB778901757728
const std::map<const char*, const DeviceAddress&> SensorList
{
{"10Polka", { 0x28, 0xFF, 0xB4, 0xCE, 0x70, 0x17, 0x03, 0xBB }},
{"Glowica", { 0x28, 0xFF, 0x4C, 0xDE, 0x83, 0x17, 0x04, 0xF1 }},
{"Zbiornik", { 0x28, 0xFF, 0xE7, 0x7A, 0x83, 0x17, 0x04, 0x15 }},
{"Woda", { 0x28, 0xFF, 0xB7, 0x78, 0x90, 0x17, 0x05, 0x77 }}
};
żeby było jeszcze bardziej dziwnie, dwa ostatnie działają prawidłowo, kod tu: https://github.com/stefunkk/openstill
Devices count:
4
10Polka
-127.00
1000552E204070
Glowica
-127.00
000000001
Zbiornik
21.87
28FFE77A83174150
Woda
21.69
28FFB778901757728
-
- Posty: 105
- Rejestracja: poniedziałek, 17 sie 2020, 11:28
- Podziękował: 1 raz
- Otrzymał podziękowanie: 11 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
DeviceAddress jest typu unit8_t[8]. Czyli teoretycznie od inicjalizacji nikt nie powinien tego modyfikować. Czy mógłbyś zrobić test polegający na wywaleniu czytania w ogóle i zostaw tylko wypisywanie w tym loop element.first i element.second. To że wyniki są z kosmosu - bywa, ale dlaczego wypisując element.second pisze śmieci - dziwne.
Ja bym zrobił zamiast map<char*, Address> => vector< pair<string, Address> >.
Zamień sobie LcdServiceClass* na LcdServiceClass& (i inne analogicznie). Wtedy nigdzie nie bedziesz miał ani * ani ->.
Ja bym zrobił zamiast map<char*, Address> => vector< pair<string, Address> >.
Zamień sobie LcdServiceClass* na LcdServiceClass& (i inne analogicznie). Wtedy nigdzie nie bedziesz miał ani * ani ->.
-
- Posty: 183
- Rejestracja: sobota, 30 lis 2019, 12:53
- Podziękował: 26 razy
- Otrzymał podziękowanie: 7 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Udało mi się to zrobić, po zmianie const chara na stringa, adresy zaczeły być prawidłowe, dlaczego ... nie wiem.
Co do zmiany * na & rozumiem, że chodzi Ci o definicje w nagłówku właściwości klasy?
private:
int _sensorPin;
DallasTemperature& _sensors;
LcdServiceClass& _lcdService; ...
tylko wtedy przy konstruktorze rzuca błędem
SensorTaskClass::SensorTaskClass(int sensorPin, DallasTemperature& sensors, LcdServiceClass& lcdService)
{
_sensors = sensors;
_lcdService = lcdService;
SensorTask.cpp: In constructor SensorTaskClass::SensorTaskClass(int, DallasTemperature&, LcdServiceClass&)
SensorTask.cpp: 3:1: error: uninitialized reference member 'SensorTaskClass::_sensors' [-fpermissive]
SensorTaskClass*: SensorTaskClass(int sensorPin, DallasTemperature& sensors, LcdServiceClass& lcdService)
SensorTask.cpp: 3:1: error: uninitialized reference member 'SensorTaskClass::_lcdService' [-fpermissive]
Error compiling project sources
Debug build failed for project 'OpenStill'
Co do zmiany * na & rozumiem, że chodzi Ci o definicje w nagłówku właściwości klasy?
private:
int _sensorPin;
DallasTemperature& _sensors;
LcdServiceClass& _lcdService; ...
tylko wtedy przy konstruktorze rzuca błędem
SensorTaskClass::SensorTaskClass(int sensorPin, DallasTemperature& sensors, LcdServiceClass& lcdService)
{
_sensors = sensors;
_lcdService = lcdService;
SensorTask.cpp: In constructor SensorTaskClass::SensorTaskClass(int, DallasTemperature&, LcdServiceClass&)
SensorTask.cpp: 3:1: error: uninitialized reference member 'SensorTaskClass::_sensors' [-fpermissive]
SensorTaskClass*: SensorTaskClass(int sensorPin, DallasTemperature& sensors, LcdServiceClass& lcdService)
SensorTask.cpp: 3:1: error: uninitialized reference member 'SensorTaskClass::_lcdService' [-fpermissive]
Error compiling project sources
Debug build failed for project 'OpenStill'
Ostatnio zmieniony wtorek, 27 paź 2020, 22:47 przez stefunk, łącznie zmieniany 1 raz.
-
- Posty: 105
- Rejestracja: poniedziałek, 17 sie 2020, 11:28
- Podziękował: 1 raz
- Otrzymał podziękowanie: 11 razy
-
- Posty: 183
- Rejestracja: sobota, 30 lis 2019, 12:53
- Podziękował: 26 razy
- Otrzymał podziękowanie: 7 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Udało się, dzięki.
Wydaje mi się, że trochę zaśmiecam temat zupełnie innym projektem, więc tworzę nowy.
Wydaje mi się, że trochę zaśmiecam temat zupełnie innym projektem, więc tworzę nowy.
Ostatnio zmieniony czwartek, 29 paź 2020, 11:22 przez stefunk, łącznie zmieniany 6 razy.
-
- Posty: 105
- Rejestracja: poniedziałek, 17 sie 2020, 11:28
- Podziękował: 1 raz
- Otrzymał podziękowanie: 11 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Są różne SSR, które są w stanie obsłużyć różne moce. Przypuszczalnie odpowiedź na to pytanie zależy od mocy, którą jest w stanie obsłużyć Twoje urządzenie. Ja mam SSR, który obsługuje (wg danych producenta) 40A. Przy obciążeniu 16A działał bez radiatora - nie spalił się, chociaż był gorący. Zwróć uwagę, że SSR mocno się grzeje tylko z jednej strony, więc to czy się spali może zależeć też od tego którą stroną i na czym leży.MastaMari pisze:Szybkie pytanie, Jakie maksymalne obciążenie wytrzyma SSR bez radiatora ?
Nie rozumiem pytania.MastaMari pisze:Czy wykorzystanie SSR jako on/off tez obciąża SSR cieplnie ?
-
- Posty: 168
- Rejestracja: poniedziałek, 10 lut 2020, 21:47
- Podziękował: 3 razy
- Otrzymał podziękowanie: 15 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Pewnie będę posiadać SSR 40A jak jest podane w wątku cena prawie ta sama, Grzałka będzie 1,5/2/2,5 KW
Według owego oprogramowania mamy 1 grzałkę z ustawieniem mocy i 2 grzałki tylko ON/OFF i czy wykorzystując SSR tylko do ON/OFF grzałek jest on obciążony tak samo jak przy sterowaniu mocą ?jacek.kokot pisze:Nie rozumiem pytania.MastaMari pisze:Czy wykorzystanie SSR jako on/off tez obciąża SSR cieplnie ?
-
- Posty: 105
- Rejestracja: poniedziałek, 17 sie 2020, 11:28
- Podziękował: 1 raz
- Otrzymał podziękowanie: 11 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Kolego MastaMari - im precyzyjniej nakreślisz problem, tym precyzyjniejszą odpowiedź możesz uzyskać.
Moim zdaniem mówimy tu o urządzeniu, które kosztuje 20-30PLN. Spali się - trudno, kupi się nowe
Jakby nie patrzeć 15A stanowi 37,5% mocy z 40A, więc teoretycznie jakiś margines jest. Tak, prawda jest, że jak się ma trzy grzałki 2kW to wystarczy grupowo sterować jedną, z pozostałymi ON/OFF, aby mieć płynne sterowanie w całym zakresie. Czy takie podejście ma sens - tak, jeśli zasilamy grzałki z różnych faz. Jeśli zasilanie i tak jest z jednej fazy prościej zmostkować wszystko i sterować jednocześnie wszystkim.
Jeśli masz sterowanie ON/OFF lepiej kupić zwykły przekaźnik. Pewnie za 10PLN kupić dwukanałowy do 15A na kanał.
Niezależnie od powyższych rozważań warto zapewnić SSR jakieś lepsze chłodzenie. Przeszukaj stare pudła, może znajdziesz jakiś stary procesor z radiatorem. Jeśli nie, może masz jakieś kawałki profili aluminiowych. Teoretycznie możesz nawiercić nakrętkę od słoika. Przytwierdzić najproście trytytką.
Tylko uważaj, z prądem nie ma żartów. Wyłącz zasilanie przed takimi zabawami.
Moim zdaniem mówimy tu o urządzeniu, które kosztuje 20-30PLN. Spali się - trudno, kupi się nowe
Jakby nie patrzeć 15A stanowi 37,5% mocy z 40A, więc teoretycznie jakiś margines jest. Tak, prawda jest, że jak się ma trzy grzałki 2kW to wystarczy grupowo sterować jedną, z pozostałymi ON/OFF, aby mieć płynne sterowanie w całym zakresie. Czy takie podejście ma sens - tak, jeśli zasilamy grzałki z różnych faz. Jeśli zasilanie i tak jest z jednej fazy prościej zmostkować wszystko i sterować jednocześnie wszystkim.
Jeśli masz sterowanie ON/OFF lepiej kupić zwykły przekaźnik. Pewnie za 10PLN kupić dwukanałowy do 15A na kanał.
Niezależnie od powyższych rozważań warto zapewnić SSR jakieś lepsze chłodzenie. Przeszukaj stare pudła, może znajdziesz jakiś stary procesor z radiatorem. Jeśli nie, może masz jakieś kawałki profili aluminiowych. Teoretycznie możesz nawiercić nakrętkę od słoika. Przytwierdzić najproście trytytką.
Tylko uważaj, z prądem nie ma żartów. Wyłącz zasilanie przed takimi zabawami.
-
- Posty: 66
- Rejestracja: środa, 26 sie 2020, 14:22
- Krótko o sobie: Jestem fajnym człowiekiem:)
- Ulubiony Alkohol: Glengoyne
- Lokalizacja: Scotland / Poland
- Podziękował: 5 razy
- Otrzymał podziękowanie: 6 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Co do przekaźników to znalazłem ostatnio polską firmę która takowe sprzedaje, różne modele nawet trójfazowe wraz z dedykowanym radiatorem:
https://termoregulatory.pl/pl/18-przekazniki-ssr
https://termoregulatory.pl/pl/49-akcesoria
https://termoregulatory.pl/pl/18-przekazniki-ssr
https://termoregulatory.pl/pl/49-akcesoria
-
Autor tematu - Posty: 951
- Rejestracja: środa, 30 mar 2016, 18:43
- Podziękował: 9 razy
- Otrzymał podziękowanie: 134 razy
-
- Posty: 31
- Rejestracja: wtorek, 18 wrz 2018, 12:19
- Podziękował: 13 razy
- Otrzymał podziękowanie: 1 raz
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Witam jestem kompletnie zielony w temacie. Zdecydowałem się zaryzykować i stworzyć takie cudo, zależy mi głównie na termometrach.
Kupiłem płytkę zainstalowałem arduino IDE, sterowniki, biblioteki. Płytka łączy się z blynkiem ale pokazuje -127C. Po wgraniu przykładu DS18X20 i ustawieniu portu 5 pojawia się ,,no more addresses,, Sprawdzałem dwie różne ds1820 - podłączyłem pod g 3v i 5
Nie miałem rezystora czy brak rezystora, może być przyczyną? Co robię źle?
Kupiłem płytkę zainstalowałem arduino IDE, sterowniki, biblioteki. Płytka łączy się z blynkiem ale pokazuje -127C. Po wgraniu przykładu DS18X20 i ustawieniu portu 5 pojawia się ,,no more addresses,, Sprawdzałem dwie różne ds1820 - podłączyłem pod g 3v i 5
Nie miałem rezystora czy brak rezystora, może być przyczyną? Co robię źle?
Ostatnio zmieniony środa, 4 lis 2020, 10:54 przez manowar, łącznie zmieniany 1 raz.
-
- Posty: 31
- Rejestracja: wtorek, 18 wrz 2018, 12:19
- Podziękował: 13 razy
- Otrzymał podziękowanie: 1 raz
-
- Posty: 2603
- Rejestracja: wtorek, 15 sty 2013, 15:29
- Podziękował: 83 razy
- Otrzymał podziękowanie: 301 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Osobne zasilanie +5V dla LCD. Nie wnikam jak to jest zbudowane ale jeżeli jest tam sprzętowe I2C - to piny obsługujące powinny akceptować sygnał 5V. O ile pamiętam teraz zwykle się używa tego typu przejściówki.
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett
- Terry Pratchett
-
- Posty: 1167
- Rejestracja: poniedziałek, 7 sty 2019, 18:55
- Status Alkoholowy: Konstruktor
- Lokalizacja: Sieradz
- Podziękował: 20 razy
- Otrzymał podziękowanie: 101 razy
- Kontakt:
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Część wyświetlaczy działa pod 3.3V a część działa ale słabo wyświetla, takcjak by kontrakt był skręcony. Wtedy wymaga podłączenia pod 5V. Nie mam pojęcia od czego to zależy ale miałem już dziesiątki tych wyświetlaczy i wszystko zależy od producenta /partii(?).
Ostatnio zmieniony czwartek, 5 lis 2020, 15:12 przez aakk, łącznie zmieniany 1 raz.
Destylatory ze stali nierdzewnej.
www.ak-spaw.pl
facebook.com/akspawpl
Zapraszam
www.ak-spaw.pl
facebook.com/akspawpl
Zapraszam
-
- Posty: 31
- Rejestracja: wtorek, 18 wrz 2018, 12:19
- Podziękował: 13 razy
- Otrzymał podziękowanie: 1 raz
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Zdalny odczyt już mi działa.
Chciałbym dołączyć lcd 2x16 z i2C
Może ktoś ma brakujące linijki kodu?
Chciałbym dołączyć lcd 2x16 z i2C
Może ktoś ma brakujące linijki kodu?
Ostatnio zmieniony czwartek, 12 lis 2020, 16:07 przez manowar, łącznie zmieniany 1 raz.
-
- Posty: 406
- Rejestracja: wtorek, 13 lut 2018, 14:50
- Krótko o sobie: Jestem fajnym człowiekiem:)
- Ulubiony Alkohol: Piwo/ Cydr/ Bimberek
- Status Alkoholowy: Konstruktor
- Podziękował: 8 razy
- Otrzymał podziękowanie: 30 razy
Re: Termometr i sterowanie kolumny przez smartfona po WiFi - nowa wersja
Bierz od razu 20x4, koniecznie z przylutowanym konwenterem i2c.
Poszukaj w necie "LCD 20x4 i2c esp8266" i znajdziesz wszystko
Wysłane z mojego EML-L29 przy użyciu Tapatalka
Poszukaj w necie "LCD 20x4 i2c esp8266" i znajdziesz wszystko
Wysłane z mojego EML-L29 przy użyciu Tapatalka
TERMOMETRY WIFI
https://www.facebook.com/TermometryWIFI/
https://www.facebook.com/TermometryWIFI/
-
- Posty: 31
- Rejestracja: wtorek, 18 wrz 2018, 12:19
- Podziękował: 13 razy
- Otrzymał podziękowanie: 1 raz