Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'ds18b20'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - roboty
    • Projekty - DIY
    • Projekty - DIY (początkujący)
    • Projekty - w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie
    • Kosz

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Znaleziono 4 wyniki

  1. Witam, jak to często bywa, początkujący porywa się na gruby projekt w tym przypadku też ale ambicje są, gorzej z praktyką i wiedzą Projekt jaki chcę stworzyć to mikro kontroler z zastosowaniem Mega 2560 do którego podłączone są dwa czujniki DS18B20 na osobnych pinach (by w przypadku uszkodzenia jednego z nich uniknąć ponownego programowania układu, a tutaj akurat znaczenie ma kolejność czujników) dwa wyświetlacze LED 7-segmentowe moduły komunikujące się na 1-wire( układ TM1637); Wyświetlacze na bieżąco podają temperaturę z czujników, przy czym po przekroczeniu nastawnej granicy temperatury dla czujnik drugiego uruchamia się przekaźnik dla lampy sygnalizacyjnej, Od włączenia układu następuje odliczanie od 0 do około 5 minut (300000ms) pod WARUNKIEM że na jednym z pinów jest stan niski (zwarcie z masą poprzez przekaźnik dostający sygnał z zewnętrznego urządzenia) gdy odliczanie dobiegnie do końca poprzez Ethernet shield wysyłane są dane pomiarów do bazy danych gdzieś w sieci lokalnej. po wysłaniu wszystko zaczyna się od początku, czyli zliczanie i kolejne wysyłanie danych. Tak na brudno w notatniku wypisałem sobie: po uruchomieniu programu: -wykrycie czujników ds18b20 na PIN 2 ("temp_in" -temp. wejścia powietrza do chłodzenia) i PIN 3 ("temp_out" -temp.powietrza po schłodzeniu obszaru/produktu); -wyświetlenie wartości "temp_in" na TM1637 wyświetlacz pierwszy jako "DisplayTin" oraz "temp_out" na "DisplayTout" - wyświetlacz drugi. Ze względu na brak znaku kropki wyświetlacza i 9-bit rozdzielczość pomiaru zamiast kropki wyświetlany znak stopni, np dla wartości temperatury 17.0 i 24.5: ---- ---- ---- | | | | | | | | | | | | ---- | | | | | | | | ---- ---- ---- ---- | | | | | | | | | | | | ---- ---- ---- ---- | | | | | | ---- ---- -sprawdzenie warunku jeśli temp_out >= tempALARM (wartość ustawiana i zapamietywana po zaniku zasilania) to na pinie alarmu stan wysoki wyzwalający przekaźnik; -sprawdzenie wciśnięcia przycisku (PINy 30-33) zmiany wartości maksymalnej temperatury na wyjsciu "tempALARM", lub numeru linii produkcyjnej "liniaNr"; -sprawdzenie wartości na wejściu pinu NARAwAuto (aktywne schladzanie w trybie automatycznym) jesli prawda uaktywniene zliczania licznika do 4.5-5min (300000 ms); --po osiąnięciu wartości max licznika 300000 ms uruchomienie funkcji dla EthShield wysyłającej dane pomiaru "temp_in" "temp_out" numer linii produkcyjnej "liniaNr" (ustawiany recznie i zapamietywany) oraz stan wyjscia pinu ALARMtemp; -podczas zmian nastawy tempALARM na wyświetlaczu pojawia się na 5 sekund wartość w postaci: ---- ---- ---- | | | | | | | | O | | ---- ---- ---- | | | O | | | | | | | ---- ---- ---- skok o 1 stopień celciusza, zakres 1 do 50 Dla zmiany numeru linii przykładowo wyświetla: ---- ---- | | | | O | | ---- | O | | | | | ---- ---- skok o 1, zakres od 1 do 63, obie wartości muszą być zapamiętane po zaniku zasilania; a podłączenie pinów mniej więcej tak rozmieszczone: /* informacje pinologii pin 0 pin 1 pin 2 DS18B20data temp_in //wejsciowa temp powietrza nr.1 pin 3 DS18B20data temp_out //temp po wyjsciu nr.2 pin 4 SDCardShield SS //SlaveSelect pin 5 CLK1 out //zegar dla wyswietlacza 1 na tm1637 pin 6 DIO1 out //dane dla wysw.1 pin 7 CLK2 out //zegar dla wyswietlacza 2 na tm1637 pin 8 DIO2 out //dane dla wysw.2 pin 9 ALARMtemp out relay //po przekroczeniu nastawionej temp alarm na buzzer/sygnalizator swietlny przez przekaznik pin 10 ETH SS Mega2560 pin 53 //SlaveSelect wybrannie ukladu perferyjnego eth/sd pin 11 ETH MOSI Mega2560 pin 50 //dane do ukladu pin 12 ETH MISO Mega2560 pin 51 //dane z ukladu pin 13 ETH SCK Mega2560 pin 52 //sygnal zegara pin 25 NARAwAuto in zRelay //zwarcie do masy po zapodaniu 24V z Nary do przekaznika pin 27 SendTemp_LED (Mega2560) //wyslanie danych do bazy danych info LED pin 30 keyENT lub keyAL_down pin 31 keyEXIT lub keyAL_up pin 32 keyDN lub keyLN_down pin 33 keyUP luk keyLN_up */ Dla pin 30-33 nie jestem pewien rozwiązania, czyli czy zrobić menu, i przeskakiwanie po wartościach nastawianych czyli temp. maxymalna i wyzwalanie alarmu plus numer linii/urządzenia pomiarowego. Czy na sztywno przyporządkować dany przycisk pod zwiększanie/zmniejszanie parametru pierwszego i drugiego. Co będzie lepszym rozwiązaniem? Znalazłem na forum temat myślę że nada się idealnie ta biblioteka dla mnie, jeden wątek na rozpoznanie czujników i wyświetlenie ich na wyświetlaczach + sprawdzenie wartości temp alarmu, drugi watek sprawdzający wciśnięcie jednego z przycisków i ewentualną zmianę wartości i jej zapisanie do pamięci, trzeci wątek odliczający ten czas 5 min (+czas na wykonanie pozostałych wątków) i po zakończeniu wysłania danych zresetowanie licznika. W obecnej chwili udało mi się ujarzmić wyświetlanie dwóch wyświetlaczy na bibliotece TM1637Display.h , kolejny krok którym się zajmuje to wyświetlanie wartości czujników na osobnych modułach. Następnie dodanie możliwości zmiany parametrów z przycisków. Jak się to uda to jestem w 1/3 drogi do sukcesu. Czy jakieś porady na początek, na co uważać, lub do samego zamysłu działania?
  2. To proste, po prostu w kodzie nie mam dely i while ( zdarzenie ) . W bibliotekach też nie ma takich "kwiatków" (Ty niestety w TM1637 masz). Ogólnie z bibliotekami Arduino jest duży problem. Najpierw szukam i sprawdzam czy działa bo różnie z tym bywa. Przykładowo software serial (nie powinno się używać takich wynalazków ale czasem nie ma wyjścia i trzeba pamiętać aby nie zawieszać przerwań a jeśli już to nie dłużej niż czas trwania bitu) stwarza problem z transmisją inną niż ramka 8N1. Dla AVR są stosowne biblioteki, dla ESP nie znalazłem. Z NTP też jest problem. Jak jedna libs ma jakąś funkcjonalność to czegoś tam jej brakuje. jak znajdę taką co ma to czego brakuje, to nie ma czegoś innego. W konsekwencji trzeba modyfikować bibliotekę. Są biblioteki, które "wykrzaczają" soft w pewnych sytuacjach. Mam to w NTP. Trzeba będzie szukać co jest "nie halo". Dobrze, że wiem jak są zbudowane ramki NTP, jak dekodować czas UNIXa bo robiłem to kiedyś "na piechotę", tak z 10 lat temu ale chyba arduino jest po to, aby zrobić ale się nie narobić? Zrobić NTP nie wiedząc co to UDP, ARP, TPC, idt. Niestety tak nie jest. Albo ja mam pecha, albo arduino jest mocno ograniczone przez kiepskich programistów tworzących biblioteki. A może mam za duże wymagania? Może niektórym nie przeszkadza, ze program reaguje po sekundzie od naciśnięcia przycisku, mnie przeszkadza. Może rysowanie obrazu na LCD przez 2 sekundy nie jest problemem, dla mnie jest. Im dłużej mam styczność z Arduino, tym bardziej jestem do niego zniechęcony. Chyba dam sobie z nim spokój, tak jak kiedyś z Bascom. Nie żałuję, że wybrałem C zamiast Bascom i czuję, że nie będę żałował, że porzucę Arduino. Tym optymistycznym akcentem, kończę swoją wypowiedź.
  3. Cześć, Jak włączyć/wyłączyć zasilanie pasożytnicze na czujniku DS18B20? Z góry dziękuję. PS.: Przepraszam jeśli dałem temat w złej kategorii...
  4. Wszystko działa dobrze, ale gdy temperatura spadnie poniżej 0 to pokazuje jakiś dziwny odczyt. Siedzę nad tym już drugi dzień i nie wiem o co chodzi. Używam arduino nano. Z góry dziękuję za pomoc #include <ModbusRtu.h> #include <OneWire.h> #include <DallasTemperature.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #define SLAVE_ID 1 #define BUTTON_PIN 7 #define RS_PIN 5 #define DS_PIN 10 #define SUN_PIN A1 #define TEMP_REG 0 #define SUN_REG 1 uint16_t au16data[9] = { 9999, 9999, 2, 3, 2018, 11, 16, 8, 7}; Modbus slave(SLAVE_ID, 0, RS_PIN); OneWire oneWire(DS_PIN); DallasTemperature sensors(&oneWire); DeviceAddress ds18b20 = { 0x28, 0x90, 0x63, 0x45, 0x92, 0x06, 0x02, 0xE0 }; //1 //DeviceAddress ds18b20 = { 0x28, 0x68, 0xA6, 0x45, 0x92, 0x03, 0x02, 0x3C }; //2 //DeviceAddress ds18b20 = { 0x28, 0x12, 0xC6, 0x45, 0x92, 0x08, 0x02, 0x59 }; //3 LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); int temperature = 9999; unsigned long getTempTime = 0; unsigned long lastUpdate = 0; unsigned long buttonTime = 0; int buttonHoldTime = 0; byte sun = 0; bool lcdLight = true; void setup() { sensors.begin(); slave.begin( 9600 ); // baud-rate at 9600 lcd.begin(16,2); pinMode(BUTTON_PIN, INPUT); } void loop() { temperature = readTemp(); if(temperature != NULL || temperature < 200) au16data[TEMP_REG] = temperature; sun = readSun(); if(sun != NULL) au16data[SUN_REG] = sun; slave.poll(au16data, 16); if(millis()-lastUpdate >= 1500UL) { lcd.clear(); printTime(); lcd.setCursor(0, 1); printPage0(); lastUpdate = millis(); } if(digitalRead(BUTTON_PIN) == HIGH){ if(buttonTime == 0) buttonTime = millis(); buttonHoldTime += millis()-buttonTime; buttonTime = millis(); } else{ if(buttonHoldTime > 750){ if(lcdLight == true) lcdLight = false; else lcdLight = true; } else if(buttonHoldTime < 500 && buttonHoldTime > 50) ; buttonHoldTime = 0; buttonTime = 0; } if(lcdLight == true) lcd.backlight(); else lcd.noBacklight(); ////////////////////////////////////// } int readTemp(){ if(millis()-getTempTime >= 1000UL){ sensors.requestTemperatures(); getTempTime = millis(); return sensors.getTempC(ds18b20)*10; } else return temperature; } byte readSun(){ return map(analogRead(SUN_PIN), 0, 1023, 0, 100); } void printTime(){ if(au16data[7] < 10) lcd.print(0); lcd.print(au16data[7]); lcd.print(":"); if(au16data[8] < 10) lcd.print(0); lcd.print(au16data[8]); lcd.print(" "); lcd.print(au16data[6]); lcd.print("."); lcd.print(au16data[5]); lcd.print("."); lcd.print(au16data[4]); } void printPage0(){ lcd.print("T:"); lcd.print(au16data[TEMP_REG]/10); lcd.print("."); lcd.print(au16data[TEMP_REG]-au16data[TEMP_REG]/10*10); lcd.print("*C"); lcd.print(" "); lcd.print("SUN:"); lcd.print(au16data[SUN_REG]); lcd.print("%"); }
×
×
  • Utwórz nowe...