Skocz do zawartości

szczawiosław

Użytkownicy
  • Zawartość

    195
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    1

szczawiosław wygrał w ostatnim dniu 3 października 2018

szczawiosław ma najbardziej lubianą zawartość!

Reputacja

60 Bardzo dobra

O szczawiosław

  • Ranga
    5/10

Informacje

  • Płeć
    Mężczyzna

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. @lisulisu6 to w końcu zamawiasz czy robisz samodzielnie? Jak zamawiasz to nie widzę powodu aby robić koniecznie jako jednowarstwową, więc możesz wykorzystać gotowy projekt. Co do płytki, tak jak wspomniał RFM warto wylać masę, ustaw grubość ścieżek minimum na 0,5mm dla sygnałowych i nawet 0,8mm dla zasilania (jeżeli planujesz trawić je samodzielnie), w przypadku kiedy chcesz zamawiać, zasilanie ustaw na 0,5mm a sygnałowe na 0,3mm (mogą być i grubsze, ale to powinno zapewnić dosyć łatwe projektowanie i nie zajmą niepotrzebnie miejsca). Unikaj niepotrzebnego skręcania ścieżek i łamania ich pod kątem prostym. W oknie projektowania PCB po prawej stronie masz przycisk MANUFASTURING czasami warto z niego skorzystać aby zobaczyć jak płytka będzie wyglądała w rzeczywistości. Możesz wtedy wychwycić błędy nawet przez porównanie z jakimiś profesjonalnymi projektami, albo obrazkami płytek. Po prostu patrzysz na jedną i drugą, stwierdzasz że "brzydko, tutaj zrobili inaczej to i ja to poprawie". Możesz jeszcze zapoznać się z kursem Cadsoft Eagle, fakt że jest z 2011 roku i sporo opcji się zmieniło, ale nie zasady tworzenia schematów i PCB. I tak jak wspominał Treker wstawiaj pliki graficzne (jpg, png, bmp, itp.), a nie PDF
  2. @Lolsegg23 pokaż jeszcze kod. W przykładach do bibliotek masz program który przeszukuje magistrale, pokazuje znalezione adresy i odczytaną temperaturę, to działa u ciebie bez problemu?
  3. @lisulisu6 zerknąłem na pliki Eagla i tam jest 10 ścieżek na krzyż. Jeżeli chcesz sam wykonać płytkę to i postaraj się sam ją zaprojektować, jest na tyle łatwa że nie powinieneś mieć z tym problemów większych, a będzie okazja do nauki czegoś nowego i proste ćwiczenie.
  4. Jak tak na niego patrze to przypomniała mi się pierwsza Magma Fajna robota, jak się domyślam jesteście uczniami LO PB?
  5. 12V to raczej słaba opcja, 24V albo i 48V to już sensowniejsze wyjście. We wspomnianym sumo często właśnie używa się silników 24V które są w stanie wytrzymać te kilka sekund pracy na 48V. Ewentualnie rozejrzyj się za silnikami trójfazowymi. Dużo tutaj zależy od budżetu (w sumie to przede wszystkim od tego), od materiału z którego mata jest wykonana, od zapelcza technicznego, itp. Jak możesz podeślij jakieś filmy albo zdjęcia z innymi konstrukcjami tego typu.
  6. Zacznijmy od tego że UART podłącza się RX z UNO do TX ESP, a TX z UNO do RX ESP, do tego warto użyć jeszcze Konwertera Poziomów Logicznych w taki sposób aby ESP zawsze dostawało sygnały w logicy 3,3V, a uno 5V. Wyjmij z Arduino ATmegę bo masz tylko jeden UART, a po błędzie widać że ci się po prostu nie łączy z ESP (a przyczyn może być wiele). Piny CH_PD i RESET powinieneś podciągnąć do zasilania poprzez rezystor 10k najlepiej. Sam sposób zasilania jest jeszcze problematyczny, lepiej użyć zewnętrznego źródła 3,3V (nie wiem jak z wydajnością pinu 3,3V w UNO) i złączyć tylko masy układów. Samo ESP w momencie łączenia się do sieci, itp. pobierać może do 300mA. Tutaj masz prawidłowy sposób łączenie ESP z UNO (zamiast konwertera poziomów masz dzielnik zrobiony, no i brakuje rezystorów podciągających): Musisz jeszcze ESP wprowadzić w tryb bootowania, czyli zwierasz GPIO0 i RESET do masy, następnie rozwierasz najpierw RESET, a później GPIO0. Jeżeli jeszcze nie zjarałeś ESP jest szansa że kiedy poprawisz błędy to zadziała, no i jeszcze o ile moduł miałeś dobry wcześniej, bo z ESP-01 mam złe doświadczenia jak 1/2 układów okazywała się uszkodzona już na starcie. Jeszcze jedno pytanie, czemu zwarłeś GPIO2 do masy?
  7. Dawno było i dokładnie nie pamiętam, ale w ESP32 można na pinie zrobić czujnik Halla (są oznaczone jako Touch 1-9), podpinasz pod pin antenę (maksymalnie 10m taśmy miedzianej pod to podłączałem i nadal działało) i na podstawie odczytów modulować uzyskany dźwięk. Czułość chyba regulowało się przez dodanie kondensatora do anteny. Zasada działania całkiem dobrze przedstawiona tutaj: Co do pozostałych dwóch układów to są one dedykowane jako czujnik dotykowy i czujnik gestów więc pewnie dadzą dokładniejsze odczyty i większe możliwości.
  8. @ethanak czujnik Halla to swoją drogą, zainteresuj się tymi dwoma układami. A na czujniku Halla da się zrobić jak masz dwie niezależne anteny (czy jak to tam nazwać), okodzenie tego to już inna bajka bo musisz w jakiś sensowny sposób reagować na zmiany pola. Ale da się wykryć drgania ręki, modulować na podstawie odległości, itp. Tylko jest też duża wrażliwość na zakłócenia, leżąca obok klawiatura potrafi znacznie zmienić odczyty.
  9. W ESP32 masz wbudowany czujnik Halla który możesz do tego wykorzystać (robiłem coś takiego właśnie na ESP32 w połączeniu z buzerem). Ewentualnie zapoznaj się jeszcze z STM8TL52, albo MGC3130. W sumie nada się też wszystko co działa jako czujnik gestów.
  10. Do mojego zastosowania całkiem spoko się sprawdziło. BLYNK jest łatwiejszy w obsłudze, dodatkowo jeżeli postawimy własny serwer mamy praktycznie nieograniczoną wielkość aplikacji, w Viruino niestety ograniczenia nie ominiemy za wyjątkiem wersji płatnej. Sama aplikacja jest dosyć rozbudowana jednak wydaje się trochę toporna. Brakowało mi jakiegoś wigetu który umożliwia zmianę wartości przyciskami + i - (stąd pokrętło, które jest strasznie czułe). Aplikacja na pewno dobra jeżeli chcemy mieć wpływ na każdy możliwy aspekt wyglądu aplikacji. Mamy możliwość obrabiania danych w aplikacji, nie musimy tego implementować w kodzie programu. Sama praca z aplikacją przez mnogość ustawień i mała przejrzystość bywa mocno upierdliwa. Dodatkowo jeżeli chcemy mieć wykres wartości z jakiegoś okresu w przypadku braku serwera musimy przechowywać w pamięci mikrokontrolera.
  11. Skończyłem budować już komorę. Obecnie jestem w trakcie testów wydajności, zabezpieczeń, itp. Zmierzyłem pobór prądu przy maksymalnym obciążeniu i wyszło ~200W. Całość prezentuje się następująco: Pokrywa z układem chłodzenia oraz sterownikiem: Sam sterownik: Kod programu, main.h: #include <OneWire.h> #include <DallasTemperature.h> #include <EEPROM.h> #include <WiFi.h> #include <WiFiClient.h> #include <ArduinoJson.h> #include <Timers.h> #include "Virtuino_ESP_WifiServer.h" void WriteEEPROM(); void ReadEEPROM(); void SendingValues(); void PeltierControl(); void CalcDiffTemp(); void ReadTemp(); void FanControlON(); void FanTimeControlOFF(); void ControlSecurityStatus(); String PrepareHtmlPage(); #define ONE_WIRE_BUS 15 #define EEPROM_SIZE 4 #define CoolingPin 33 #define WarmingPin 32 #define SignalPWM 22 #define EnablePin 25 #define FanHot 26 #define FanCold 27 #define VirtuinoControlTempDisplay 25 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DXviXXAddrXss TXmpSXnsorXXrmXntXr = { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xX, 0xX, 0xXX }; DXviXXAddrXss TXmpSXnsorXhamXXr = { 0xXX, 0xXX, 0xX, 0xXX, 0xXX, 0xX, 0xX, 0xXX }; DXviXXAddrXss TXmpSXnsorRadiator = { 0xXX, 0xXX, 0xXX, 0xX, 0xXX, 0xXX, 0xX, 0xXX }; DXviXXAddrXss TXmpSXnsorXontrollXr = { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xX, 0xXX }; char APssid[] = "SSID"; char APpass[] = "PASSWORD"; WiFiServer VirtuinoServer(80); WiFiServer iSpindelServer(81); float TempiSpindel; float TempFermenter; float TempChamber; float TempController; float TempRadiator; float Gravity; float Battery; float ImportanceTempiSpindel = 0.1; float ImportanceTempChamber = 0.1; float AverageTemp; float SetTemp; float DiffTemp; float SavedTemp; const int freq = 500; const int ChanelPWM = 0; const int resolution = 8; int PWMFilling = 0; byte iSpindelReading = 0; byte SecurityStatus = 0; byte PeltierStatus = 0; unsigned long FanTime; unsigned long FanHotTime = 25000; unsigned long FanColdTime = 60000; unsigned long ReadTime; unsigned long ReadTempTime = 2000; float SecurityHighTempRadiator = 50.0; float SecurityLowTempRadiator = 35.0; float SecurityHighTempController = 50.0; float SecurityLowTempController = 35.0; byte SecurityControler = 0; byte SecurityRadiator = 0; Oraz main.cpp: #include "main.h" Virtuino_ESP_WifiServer virtuino(&VirtuinoServer); void setup() { virtuino.DEBUG = false; sensors.begin(); EEPROM.begin(EEPROM_SIZE); pinMode(CoolingPin, OUTPUT); pinMode(WarmingPin, OUTPUT); pinMode(FanHot, OUTPUT); pinMode(FanCold, OUTPUT); pinMode(EnablePin, OUTPUT); ledcSetup(ChanelPWM, freq, resolution); ledcAttachPin(SignalPWM, ChanelPWM); ReadEEPROM(); digitalWrite(CoolingPin, LOW); digitalWrite(WarmingPin, LOW); digitalWrite(FanHot, LOW); digitalWrite(FanCold, LOW); ledcWrite(ChanelPWM, 0); WiFi.mode(WIFI_AP); WiFi.softAP(APssid, APpass); virtuino.password = "1234"; VirtuinoServer.begin(); iSpindelServer.begin(); delay(1000); delay(1000); } void loop(void) { ControlSecurityStatus(); WiFiClient iSpindelClient = iSpindelServer.available(); virtuino.run(); SetTemp = virtuino.vMemoryRead(0); if (SetTemp!=SavedTemp) { WriteEEPROM(); } SavedTemp = SetTemp; if (iSpindelClient) { while (iSpindelClient.connected()) { if (iSpindelClient.available()) { String line = iSpindelClient.readStringUntil('\r'); const size_t capacity = JSON_OBJECT_SIZE(9) + 90; const char* json = line.c_str(); DynamicJsonDocument doc(capacity); deserializeJson(doc, json); if (doc["ID"] == 1234567) { TempiSpindel = doc["temperature"]; Gravity = doc["gravity"]; Battery = doc["battery"]; iSpindelReading = 1; } } }; delay(1); iSpindelClient.stop(); } if ((millis() - ReadTime) >= ReadTempTime) { ReadTemp(); ReadTime = millis(); } CalcDiffTemp(); if (PeltierStatus != 0) { PeltierControl(); } if (virtuino.lastCommunicationTime != 0) { SendingValues(); virtuino.lastCommunicationTime = 0; } FanTimeControlOFF(); yield(); } void ReadTemp() { sensors.requestTemperatures(); TempFermenter = sensors.getTempC(TempSensorFermenter); TempChamber = sensors.getTempC(TempSensorChamber); TempController = sensors.getTempC(TempSensorController); TempRadiator = sensors.getTempC(TempSensorRadiator); } void CalcDiffTemp() { if (iSpindelReading != 0) { AverageTemp = TempiSpindel * ImportanceTempiSpindel + TempChamber * ImportanceTempChamber + TempFermenter * (1.0F - ImportanceTempiSpindel - ImportanceTempChamber); } else { AverageTemp = TempChamber * ImportanceTempChamber + TempFermenter * (1.0F - ImportanceTempChamber); } DiffTemp = round((SetTemp - AverageTemp)*10)/10; PWMFilling = fabs(DiffTemp)*510; if (DiffTemp <= -0.3F) { digitalWrite(CoolingPin, HIGH); digitalWrite(WarmingPin, LOW); PeltierStatus = 1; } else if (DiffTemp >= 0.3F) { digitalWrite(CoolingPin, LOW); digitalWrite(WarmingPin, HIGH); PeltierStatus = 1; } else if (abs(DiffTemp) <= 0.1F) { digitalWrite(CoolingPin, LOW); digitalWrite(WarmingPin, LOW); PeltierStatus = 0; } } void SendingValues() { virtuino.vMemoryWrite(1, TempiSpindel); virtuino.vMemoryWrite(2, TempFermenter); virtuino.vMemoryWrite(3, TempChamber); virtuino.vMemoryWrite(4, AverageTemp); virtuino.vMemoryWrite(5, Gravity); virtuino.vMemoryWrite(6, Battery); virtuino.vMemoryWrite(7, TempController); virtuino.vMemoryWrite(8, TempRadiator); if (SecurityStatus == 0 && digitalRead(CoolingPin) != 0) { virtuino.vMemoryWrite(9, -PWMFilling); } else if (SecurityStatus == 0 && digitalRead(WarmingPin) != 0) { virtuino.vMemoryWrite(9, PWMFilling); } else { virtuino.vMemoryWrite(9, 0); } virtuino.vMemoryWrite(10, digitalRead(FanHot)); virtuino.vMemoryWrite(11, digitalRead(FanCold)); } void PeltierControl() { if (SecurityStatus == 0) { if (abs(DiffTemp) < 0.50F) { digitalWrite(EnablePin, HIGH); FanControlON(); ledcWrite(ChanelPWM, PWMFilling); } else { digitalWrite(EnablePin, HIGH); ledcWrite(ChanelPWM, 255); FanControlON(); } } } void WriteEEPROM() { EEPROM.put(0, SetTemp); delay(100); EEPROM.commit(); delay(100); } void ReadEEPROM() { SetTemp = EEPROM.get(0, SetTemp); delay(100); SavedTemp = SetTemp; virtuino.vMemoryWrite(0, SetTemp); delay(100); } void FanControlON() { digitalWrite(FanHot, HIGH); digitalWrite(FanCold, HIGH); FanTime = millis(); } void FanTimeControlOFF() { if (SecurityStatus == 0) { if ((millis() - FanTime) >= FanHotTime) { digitalWrite(FanHot, LOW); digitalWrite(EnablePin, LOW); } if ((millis() - FanTime) >= FanColdTime) { digitalWrite(FanCold, LOW); digitalWrite(EnablePin, LOW); } } } String PrepareHtmlPage() { String htmlPage = String("HTTP/1.1 200 OK\r\n") + "Content-Type: text/html\r\n" + "Connection: close\r\n" + // the connection will be closed after completion of the response "Refresh: 5\r\n" + // refresh the page automatically every 5 sec "\r\n" + "<!DOCTYPE HTML>" + "<html>" + "Analog input: " + String(analogRead(A0)) + "</html>" + "\r\n"; return htmlPage; } void ControlSecurityStatus() { if (TempRadiator >= SecurityHighTempRadiator && SecurityStatus == 0) { SecurityStatus = 1; SecurityRadiator = 1; FanControlON(); digitalWrite(EnablePin, LOW); } else if (TempController >= SecurityHighTempController && SecurityStatus == 0) { SecurityStatus = 1; SecurityControler = 1; digitalWrite(FanCold, LOW); digitalWrite(FanHot, LOW); digitalWrite(EnablePin, LOW); } else if (SecurityStatus == 1 && TempRadiator <= SecurityLowTempRadiator && SecurityControler == 0) { SecurityStatus = 0; SecurityRadiator = 0; } else if (SecurityStatus == 1 && TempController <= SecurityLowTempController && SecurityRadiator == 0) { SecurityStatus = 0; SecurityControler = 0; } } Obecnie jeszcze tak jak pisałem sprawdzam poprawność działania, testuje wartości opóźnień (np. odczyt temperatury co 2s jest zbyt częsty i bezsensowny, ale do testów przydatny). Miałem trochę zabawy z parsowaniem JSONa przesyłanego od iSpindla ale działa już tak jak powinno No i teraz komunikacja następuje co 10s, ostatecznie pewnie będzie co 30min. Całością steruję za pomocą aplikacji stworzonej w Virtuino, myślałem o BLYNK, ale doszedłem do wniosku że sterowanie przez internet jest zbędne. Na górze aplikacji wyświetlam uśrednioną temperaturę z trzech termometrów (w iSpindlu, przyczepiony do boku pojemnika, bezpośrednio z komory) oraz zawartość cukru w płynie (na razie iSpindel nie jest skalibrowany poprawnie). Tym dużym pokrętłem reguluję temperaturę która chcę mieć. Poniżej wyświetlam moc chłodzenia/grzania (mocno zmniejszyłem histerezę względem założeń), oraz wyświetlam temperaturę z trzech czujników. Dwie pompy sygnalizują pracę wentylatorów na stronie ciepłej i zimnej. Na samym dole mam informacje o napięciu w iSpindlu, odczyt temperatury z czujnika znajdującego się obok radiatorów doczepionych do mostków, oraz czujnika przyczepionego do radiatora od ogniwa Peltiera. Chcę jeszcze dodać wyświetlacz LCD i możliwość sterowania za pomocą fizycznych przycisków, ale na razie nie mam pomysłu jak to miało by działać.
  12. Żebym był z Gdańska Od 2 lata zabieram się za zorganizowanie czegoś takiego w swoim mieście, ale jak zwykle, brak czasu
  13. Zobaczymy jak się sprawdzi i czy za dużo prądu zużywać nie będzie. Muszę jeszcze płytkę pod elektronikę zaprojektować, teraz jak znam wymiary będzie łatwiej i może do końca miesiąca wszytko zrobię.
  14. Wczoraj skończyłem wszystko składać. Wygląda że będzie działać . Jak odpaliłem podpinając na krótko i wykorzystując 1/3 mocy temperatura spadła o ok. 10°C w ciągu 15min. Nie testowałem jeszcze szczelności na tej pokrywie, przy pełnej wyrównanie temperatury wewnątrz z temp. otoczenia zajęła 5 dni kiedy w środku znajdowały się 2 butelki 1,5l z wodą o temperaturze początkowej 10°C. Muszę jeszcze dodatkowo zaizolować duży radiator od góry, aby zmniejszyć wpływ otoczenia i jak wszystko dobrze wyschnie w pt pewnie będę sprawdzał jaką temperaturę minimalną uda się wewnątrz osiągnąć wykorzystując tym razem ok 1/2 mocy ogniw.
  15. Ostatnio widziałem filmik jak drona próbują zasilać super kondensatorami. Był w stanie chyba 30s latać. Ale pomysł na rakietę kozacki
×
×
  • Utwórz nowe...