Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Vinnerliste

Populært innhold

Viser innholdet med mest poeng siden 26. mars 2024 i Oppføringer

  1. Her er kode for å lese DS18B20: Bibliotekene er: Dalles DS18B20 ser ut som en transistor men er egentlig en IC. Den finnes i TO-92 (som en liten transistor) pakning men også bygget inn i en vanntett rustfri probe med lang kabel: Den er superenkel å bruke til å lese temperaturer med og koster lite. Det eneste den trenger er en pull-up resistor på 4,7k (Mellom + og Data) Spenningen kan være mellom 3 og 5,5V (Altså kan du bruke 3,3V spenningen fra ESP32en om det trengs. Mange sensorer Du kan koble opptil 32 stk DS18B20 etter hverandre på samme kabelen (Kun 1 pullup resistor) Du kan spørre etter antallet slik: deviceCount = sensors.getDeviceCount(); Og du leser dem slik: Temp1=sensors.getTempCByIndex(0); Temp2=sensors.getTempCByIndex(1); Alarmer Biblioteket inneholder også kode for alarmer om du ikke vil kode dem selv. Da må du også finne adressen til sensoren: DeviceAddress Temp1Addr; sensors.getAddress(Temp1Addr, 0); så kan du sette alarmtemperaturene: sensors.setHighAlarmTemp(Temp1Addr, 26.5); sensors.setLowAlarmTemp(Temp1Addr, 19); Og teste om alarmen er aktiv: if (sensors.hasAlarm(Temp1Addr)) { OBS Den trigger både på høy og lav så du må lese temp for å finne ut hvem. Leseintervaller Når du skal bruke den med MQTT må du bestemme deg for NÅR den skal rappportere temperaturen. Hver gang temperaturen endrer seg (mer en x grader)? Fast hvert x sekund Hver gang du ber om det. For den har passert over/under en granse (Alarm) De to første kan hardkodes eller de kan ha en default verdi og så kan de endres med MQTT kommandoer. Interupt Om du skal lese dem hvert x sekund kan du bruke et interupt. (Om du bruker en delay kan jo ikke ESP32 gjøre noe annet fornuftig mens den venter) Et interupt avbryter prosessoren med det den driver med og kjører en rutine, når rutinen er ferdig fortsetter prosessoren der den slapp. Rutinen som skal kjøres merkes med IRAM_ATTR slik at compileren legger den i instruksjons RAM for at den skal kunne kjøres raskt: void IRAM_ATTR onTimer(){ itsTimeNow=1; } En slik rutine bør gjøre så lite som mulig for ikke å forstyrre prosessoren for mye. Det enkelste er å bare sette en variabel. Denne bør deklareres med voilatile for at compileren skal holde den i RAM (og ikke i et register) slik at hovedprogrammet kan lese den correct: volatile int itsTimeNow = 0; I hoved loop'en kan vi nå teste på denne slik: if (itsTimeNow==1 ) { read_temp(); MQTTclient.publish("TempTestClient/Temp1", String(Temp1)); itsTimeNow=0; // Reset } Timer ESP32 har flere (2-4) harware timere som vi kan bruke til å kalle på interuptet. Du deklarerer den slik: hw_timer_t *My_timer = NULL; og setter den til å telle slik: My_timer = timerBegin(0, 8000, true); Fordi disse timerne teller VELDIG fort har jeg her brukt en "prescaler" på 8000 som gjør at jeg kan be om et interupt hver gang den når 10000 og det vil utgjøre et sekund: timerAttachInterrupt(My_timer, &onTimer, true); // Kobler interupt rutinen til timeren timerAlarmWrite(My_timer, 100000, true); //10000 = 1 Sek Altså hvert 10sek her timerAlarmEnable(My_timer); //start Her er et forslag til MQTT kode som poster temp fra 2 sensorer på forskjellige vis:
    2 poeng
  2. Her er kode for å styre addresserbare LEDS Bibliotekene er: Litt om LED Å slå på en LED er vanligvis noe av det aller første en gjør når en starter med å leke med ESP32. ESP32 har til og med en onboard LED på pinne 2 som en kan bruke til testing uten eksterne komponenter. En LED har ingen (stor) indre motstand som en lyspære og må ha en ekstern motstand for å begrense strømmen slik at den ikke brenner opp. Max støm på LEDen finner du i spesifiksjonen på den, der finner du også spenningsfallet over selve LEDen (Forward Voltage). Om den site ikke er oppgitt kan du slå den opp (typisk) i en tabell. Her er en kalkulator for motstand: https://www.digikey.com/en/resources/conversion-calculators/conversion-calculator-led-series-resistor Husk at ESP32 pinnen selv ikke tåler mer enn typisk 20mA. (Noen sier 40mA) Det lange beinet skal til +: Skal du ha 3 LEDs (Feks Rød, gul og Grønn) må du bruke 3 pinner på ESP32en og en egen motstand for hver LED. RGB Led Men det finnes LED som har alle 3 fargene bygget inn i samme LED, -en RGB LED. Her er alle mins koblet sammen og ført ut på den lengste pinnen: OBS De finnes både i "common Anode" og "Common Catode", husk å sjekke hva du kjøper. Her må du fremdeles ha en motstand for hver farge og bruke 3 pinner. RGB LED Strips De første LED stripene som kom var koblet slik at alle LEDene hadde sin egen motstand og fargene var ført ut på hver sin tilkobling: Disse oppfører seg altså litt som en RBG LED men drar veldig mye strøm på grunn av alle LEDene. Du kan altså ikke koble disse direkte til pinner på ESP32en men må sette en driver-boks i mellom eller en havlvleder som feks en MOS-Fet. (Det kommer en egen guid senere om MOS-Fet) For å få hvitt lys skal en slå på både Rød, grønn og Blå samtidig. Dette blir ikke helt hvitt så derfor ble det laget striper med en egen hvit LED i tillegg: RGBW. Til interiør belysning var det ønskelig med en varmere hvit og derfor kom RGBWW som har enda en ekstra LED som er warm-white. Adresserbare LED MEN fordi LEDstrips ble så poppulære bygget man etterhvert inn en egen liten IC på hver eneste LED på stripen slik at disse kunne styres med et signal fra ESP32en. Dette gjorde også at en kunne styre hver enkelt LED på stripen helt separat og ikke alle de RØD samtidig slik som på RGB stripene. Senere ble disse ICene integrert i selve LEDen. Disse LED stippene har altså bare 3 tilkoblinger: + - og data og hver IC sender dataene videre til nestemann. De trenger ingen motstander eller MOS-Fet og har egen strøm strømforskyning som kan være 24V for å kunne ha lange striper uten spenningsfall. Adresseringen er "relativ" slik at førstemann på stripa er nr 0 og nestemann er nr 1 osv. Dette skjer ved at ICen "teller opp" adressen med 1 og sender videre. Du kan altså klippe og skjøte hvor du vil og adressene er fremdeles fortløpende fra den første som får data og videre bortover. OBS Det betyr osgå at stripene har en rettning som du må følge når du kobler. Blir det brudd i datastrømmen slukker hele resten av rekka. De har derfor begynt å produsere striper med en esktra backup datakanal (merket BO - BI) Enkelt Adresserbare LED Det finnes også enkelt LED som er adresserbare. Jeg er veldig glad i slike for å la ESP32en kommunisere statuser med omverdenen. Her trenger jeg bare en pinne på ESP32en og en motstand (330 ohm) mellom ESP32en og LEDen og så kan jeg koble meg videre med så mange ekstra LED jeg bare trenger uten å bruke flere pinner eller motstander 🙂 Kode Koden for å jobbe med Adresserbare LED er super enkel. Alt skjer i biblioteket FastLED: #include "FastLED.h" #define NUM_LEDS 264 \\ Antall LED på stripa CRGB leds[NUM_LEDS]; \\ Et "array" led LEDene #define PIN 4 \\ Pinnen der datakabelen på stripen er tilkoblet void setup() { FastLED.addLeds<WS2812, PIN, RGB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); } WS2812 er typen IC på LED stripen. Så er det bare å skru på en og en LED slik: leds[Pixel].r = red; leds[Pixel].g = green; leds[Pixel].b = blue; der Pixel er adressen til LEDen, og første LED er 0. og red, green, blue er verdier fra 0 til 255 for styrken på lyset. Eller slik om du foretrekker det: leds[Pixel] = CRGB(Red, Green, Blue); eller slik leds[Pixel] = CHSV(Hue, Saturation, Value); Når du har satt alle veridene på alle LEDene du ønsker, sender du det til stripe med denne kommandoen: FastLED.show(); Du lager ganske fort en par forenklings rutiner som feks disse: void setPixel(int Pixel, byte red, byte green, byte blue) { leds[Pixel].r = red; leds[Pixel].g = green; leds[Pixel].b = blue; } void setAll(byte red, byte green, byte blue) { for(int i = 0; i < NUM_LEDS; i++ ) { setPixel(i, red, green, blue); } showStrip(); } Jeg har ikke noe MQTT kode her for det klarer dere selv, men jeg har en liten kodesnutt som kjøres dersom barnebarna roper "Alexa show me rainbow" som dere kan få:
    1 poeng
Vinnerlisten er satt til Oslo/GMT+02:00
×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.