1. Du er her:  
  2. Hjem
Lilleholt.no
  • Hjem
  • Lenker
  • Webkamera
  • Målestasjoner
  • Arduino
    • Kom i gang
      • Hva er Arduino
      • Flere Arduino-versjoner og utbygging
      • Installere Arduino IDE og drivere
      • Utviklingsmiljøet Arduino IDE
    • Hello World
      • Det første programmet
      • Programmet, bit for bit
    • Programmering av Arduino
      • Variabler
      • Operatorer
      • Valg-setninger
      • Løkker
      • Funksjoner
    • Viktige prinsipper
      • Skrive digitale verdier
      • Lese digitale verdier
      • Lese analoge verdier
      • Skrive analoge verdier
      • Serial Monitor
      • Serial plotter
      • Glidende gjennomsnitt
      • Tilstandsmaskin
      • Bitfikling og registere
    • Tilkobling av komponenter og moduler
      • Ultralydsensor HC-SR04
      • LCD-display
      • DHT22
      • LED-ring med WS2812B RGB-lysdioder
      • Opp- og utlading av kondensator
    • Introduksjon til objektorientering og klasser
    • Internet of Things - et lite eksempel
    • Generell elektronikk
  • Planteblogg
  • Logg inn

Hjem

Kondensator: Opp- og utlading

En veldig viktig og mye brukt komponent i elektronikken er kondensatoren.

Kondensatoren virker som et lager for energi, vi kan sammenligne den med et lite batteri, som kan lades opp og lades ut veldig raskt.
I skjema og regnestykker angis kondensatorer som C, og størrelsen kalles kapasitans. Kapasitansen måles i Farad, F. 

Figuren under viser et par vanlige symboler for kondensatorer. Den ene er en upolarisert kondensator, dvs. at det ikke har noe si hvilken vei de kobles. Dette er som oftest verdier fra noen få pF (picoFarad) og opp til noen hundre nF (nanoFarad). Når verdiene kommer opp i μF (mikroFarad) er kondensatorene som oftest polariserte, som på symbolet til høyre. Disse er merket enten med + eller -, slik at de ikke blir koblet med feil polaritet. Feilkobling kan føre til ødelagt kondensator, eller i verste fall en liten eksplosjon.
(Det finnes unntak på dette med størrelsene, f.eks. start- eller driftskondensatorer for motorer, som kan være noen μF)

Symbol for kondensator

Her skal vi se på spenningskurver over kondensatoren når den lades opp, og når den lades ut. Koblingen er veldig enkel, bare kondensatoren og en resistor (motstand) for å begrense strømmen.

Oppkobling

 

 

En veldig enkel kobling til dette eksperimentet. Her går det an å eksperimenter med verdier. Hvis du bruker en mindre kondensator, bør du gå opp i verdi på resistoren. Tidskonstanten τ (Tau) er R*C, og den bør havne på ca. det samme for at vi skal rekke å ta noen målinger for hver opp- og utlading.

Oppgave

Oppgave 1:

Koble opp etter skjemaet under "Oppkobling".

Skriv et program som lader opp kondensatoren med strøm fra pinne 2. Mens kondensatoren lades opp, skal du ta analoge målinger med pinne A0, og skrive målingene til serieporten. 

Når kondensatoren er (tilnærmet) fullt oppladet, skal den lades ut igjen gjennom samme pinne. Mål på samme måte som med oppladingen. Når kondensatoren er oppladet, starter hele prosessen på nytt.

Se resultatene på Serial Plotter.

Oppgave 2:

Skriv om koden slik at du viser den målte spenningen, i stedet for verdien direkte fra ADC'en.

 

Løsningsforslag

Dette er et forslag til løsning. Hvis du endrer verdier på motstand eller kondensator må du kanskje endre delay'ene.

Oppgave 1:

Program Oppgave 1

 

Oppgave 2:

Program Oppgave 2

Resultat

Oppgave 1:

Serial plotter:

Opplading kondensator
 
Oppgave 2:

Serial plotter: 

Spenningsmåling

Serial Monitor:
Detaljer
Skrevet av: Per Sigbjørn
Kategori: Opp- og utlading av kondensator
Sist oppdatert 27. november 2024
Treff: 366

Glidende gjennomsnitt

Dette er et eksempel på kode for å lage et glidende gjennomsnitt av måleverdier. Dette kan være nyttig hvis du har sensorer som ikke er veldig nøyaktig, hvis du skal bruke verdiene til å styre noe annet som du ikke vil skal ha så "brå" bevegelser, eller hvis du bare vil ha ekstra fine grafer.

Eksempelet bruker ultralydsensoren HC-SR04, som vi har beskrevet på en annen side. Biblioteket som er brukt heter "Ultrasonic Simple",  skrevet av Erick Simões. Har fjernet de fleste kommentarer for å spare litt plass.

Måleverdiene lagres i et array med en størrelse definert av "antallVerdier". Biblioteket returnerer målinger i antall cm, så vi har brukt heltallsverdier over alt.

Verdiene skrives til serieporten, og både den "momentane" avstanden og gjennomsnittet skrives ut. Hvis du bruker Serial Plotter vil du derfor få opp en kurve for hver av disse.

/* * Basert på eksempel fra biblioteket Ultrasonic Simple av Erick Simões * */
#include <Ultrasonic.h>

#define antallVerdier 10

Ultrasonic ultrasonic(12, 13); // Trigger-pinne 12 og Echo-pinne 13
int avstand;

void setup() {
Serial.begin(9600);
pinMode(8,OUTPUT);
digitalWrite(8,LOW);
}

int verdier[antallVerdier];
long teller=0;
int sum, snitt;
void loop() {
avstand = ultrasonic.read();
//Her lager vi et "glidende gjennomsnitt" av verdiene
verdier[teller%antallVerdier]=avstand;
if(teller>=antallVerdier){
sum=0;
for(int x=0;x<antallVerdier;x++) sum+=verdier[x];
snitt=sum/antallVerdier;
}
teller++;
// Serial.print("Avstand i CM: ");
Serial.print(avstand); //Den siste målte avstanden
Serial.print(",");
Serial.println(snitt); //Gjennomsnittet
if(avstand<50) {
digitalWrite(8,HIGH);
delay(avstand*4);
digitalWrite(8,LOW);
}
delay(100);
}

 

Detaljer
Skrevet av: Per Sigbjørn
Kategori: Glidende gjennomsnitt
Sist oppdatert 15. oktober 2024
Treff: 3675

Tilstandsmaskin

En tilstandsmaskin er en måte å skrive et program på som lar oss kontrollere flyten basert på hendelser og forskjellige moduser.

Tilstandsmaskiner kan brukes i veldig mange typer programmer. Et godt eksempel kan være et menysystem med flere nivåer, hvor du bruker knapper til å endre nivå eller tilstand, mens du hele tiden har en eller annen form for display som viser hvor i menyen du er.

Vi skal starte med å lage en veldig enkel tilstandsmaskin med bare en knapp og en lysdiode. Hendelsen vi skal endre tilstand på er da selvsagt når knappen blir trykt inn. De to forskjellige modusene for lysdioden er da naturlig nok AV eller PÅ, eller LEDOFF og LEDON som vi kaller det i programmet. Jeg skal ikke forklare koden nærmere her, men prøver å kommentere godt slik at koden blir lesbar og forståelig.

I eksempel to utvider vi dette med en ekstra tilstand hvor lysdioden blinker.

Eksempel 1


Enkelt eksempel

 
/*
 * Arduino - enkel tilstandsmaskin
 * 
 */
#define LEDOFF 0 //Tilstand 0
#define LEDON 1 //Tilstand 1

 void setup() {
pinMode(2,INPUT_PULLUP); //Setter opp pinne for trykknappen
pinMode(13,OUTPUT); //Bruker pinne 13 (med innebygd LED) som utgang
Serial.begin(9600); //Bruker serie-konsollet for å skrive debug-informasjon
}

int tilstand=LEDOFF; // Oppretter tilstand-variabelen og setter den til "LEDOFF" (0) i starten.

void loop() {
if(!digitalRead(2)){ //Sjekker om knappen er trykt inn (knappen kortslutter pinnen til jord,
//så vi må sjekke om pinnen er 0)
  while(!digitalRead(2)); //Fjerning av prell (debounce) Løkken fortsetter til knappen slippes.
  tilstand++; //Endrer tilstand (øker med 1)
  if(tilstand>1) tilstand=0; //Siden vi har bare 2 tilstander, må vi sette den til 0 igjen
//hvis den blir 2 (eller mer)
  Serial.print("Tilstand: "); //Skriver til serieporten
  Serial.println(tilstand); //Skriver tilstandsnummeret til seriporten
    delay(50);  //Ekstra fjerning av prell (debounce)
  }
if(tilstand==LEDOFF){ //Hva skal gjøres hvis tilstanden er "LEDOFF"
  digitalWrite(13,LOW); //Slukker lysdioden på pinne 13
  }
if(tilstand==LEDON){ //Hva skal gjøres hvis tilstanden er "LEDON"
  digitalWrite(13,HIGH); //Tenner lysdioden på pinne 13
  }
 
}
 

Eksempel 2


Eksempel 2

Et litt mer mer avansert eksempel:

/*
 * Arduino - enkel tilstandsmaskin
 * 
 */
/*
 * Arduino - enkel tilstandsmaskin
 * 
 */
#define LEDOFF 0 //Tilstand 0
#define LEDON 1 //Tilstand 1
#define LEDBLINK 2 //Tilstand 2

long sisteSkift=millis(); //Lager, og initialiserer en variabel for når lysdioden skiftet tilstand sist
//Funksjonen millis() returnerer antall millisekunder siden programmet startet
//Vi bruker long, siden dette tallet kan bli større enn den en int kan lagre
long tid; //Variabel for å lagre "gjeldende tid"

void setup() {
pinMode(2,INPUT_PULLUP); //Setter opp pinne for trykknappen
pinMode(13,OUTPUT); //Bruker pinne 13 (med innebygd LED) som utgang
Serial.begin(9600); //Bruker serie-konsollet for å skrive debug-informasjon
}

int tilstand=LEDOFF; // Oppretter tilstand-variabelen og setter den til "LEDOFF" (tilstand 0) i starten.

void loop() {
if(!digitalRead(2)){ //Sjekker om knappen er trykt inn (knappen kortslutter pinnen til jord, så vi må
// sjekke om pinnen er 0)
while(!digitalRead(2)); //Fjerning av prell (debounce) Løkken fortsetter til knappen slippes.
tilstand++; //Endrer tilstand (øker med 1)
if(tilstand>2) tilstand=0; //Siden vi har bare 3 tilstander, må vi sette den til 0 igjen hvis den
//blir 3 (eller mer)
Serial.print("Tilstand: "); //Skriver til serieporten
Serial.println(tilstand); //Skriver tilstandsnummeret til seriporten
delay(50);  //Ekstra fjerning av prell (debounce)
}
if(tilstand==LEDOFF){ //Hva skal gjøres hvis tilstanden er "LEDOFF"
digitalWrite(13,LOW); //Slukker lysdioden på pinne 13
  }
if(tilstand==LEDON){ //Hva skal gjøres hvis tilstanden er "LEDON"
digitalWrite(13,HIGH); //Tenner lysdioden på pinne 13
  }
if(tilstand==LEDBLINK){ //Hva skal gjøres hvis tilstanden er "LEDBLINK"
  tid=millis(); //For å unngå å bruke "delay" bruker vi millis for å holde styr på hvordan
// lysdioden skal blinke. Dette gjør at vi kan skifte tilstand med knappen
// når som helst, uansett hvor lange blink vi har
  if(tid-sisteSkift>400) { //Sjekker om det er mer enn 400 ms siden sist lysdioden skiftet tilstand.
    digitalWrite(13,!digitalRead(13)); //Leser nivået på pinne 13, inverterer det, og skriver tilbake
//til pinnen (en "toggle"-funksjon)
    sisteSkift=tid; //Nå har vi skiftet tilstand, så vi setter variabelen sisteSkift
//til den nåværende tiden.
    }
  } 
}

 

Oppgaver


Oppgaver:

1: Start på et nytt prosjekt. Lag en tilstandsmaskin med 4 tilstander. Hver tilstand skal lyse opp eller blinke hver sin lysdiode, gjerne med hver sin farge. Tilstand skal endres med et knappetrykk. Skriv tilstandene underveis serieporten (Serial Monitor)

2: Bruk teknikken du har lært til å realisere et enkelt trafikklys med 3 lysdioder.

 

Løsningsforslag


Løsningsforslag:

Oppgave 1:  

Kommer

Detaljer
Skrevet av: Per Sigbjørn
Kategori: Tilstandsmaskin
Sist oppdatert 14. oktober 2024
Treff: 12173

Funksjoner

Funksjoner

Et veldig viktig konsept i programmering er funksjoner. De kan gå under flere navn, funksjoner, metoder, subrutiner osv. , men konseptet er stort sett det samme:

En samling med kode-linjer som utfører en jobb, og gjerne en jobb som skal utføres flere ganger. Funksjonen kan, men må ikke, returnere et svar til programmet eller funksjonen som kalte den opp.

Strukturen er slik:

retur_type funksjonens_navn( parameter-liste ) { 
    //  “Kroppen” av funksjonen (koden som utføres)
}


retur-type: Hvis funksjonen skal returnere en verdi, må data-typen angis. F.eks int, float, char
funksjonens_navn: Navnet velger du helt selv, men det må ikke inneholde mellomrom eller norske tegn
parameter-liste: Parameterlisten angir hvilke verdier som sendes inn i funksjonen, og hvilken data-type de skal ha.  Flere parametere skilles med komma.
"kroppen": Koden som funksjonen skal utføre, «omringet» av klammeparenteser { }. Hvis funksjonen skal returnere en verdi, avsluttes den med en «return»-setning.

Enkelt eksempel

Enkelt eksempel

Et eksempel:

void minFunksjon(){
    int teller;  //Lokal variabel
    for (teller=0;teller<10;teller++){ //for-loop med 10 "runder"
       digitalWrite( 9, HIGH );  // Setter pinne 9 høy
       delay(200);  //Pause på 200 millisekund
       digitalWrite( 9, LOW );  // Setter pinne 9 lav
       delay(200);  //Pause på 200 millisekund
   }
}

Denne funksjonen skal ikke returnere noe, derfor bruker vi «void» (tomrom). Funksjonen har heller ingen parametre, men parantesene må uansett være med.
Navnet på funksjonen velger du helt selv, men det bør være beskrivende for hva funksjonen gjør. Siden dette er bare et eksempel, kaller vi den her "minFunksjon". Funksjonskallet (når vi skal bruke funksjonen) vil da bare være:

minFunksjon();

 

Eksempel med returverdi og to parametere

Eksempel med returverdi og to parametere

Et mer avansert eksempel:

int minAndreFunksjon(int antall, float desimalTall){
    int teller;  //Lokal variabel
    for (teller=0;teller<antall;teller++){
       digitalWrite( 9, HIGH );  // Setter pinne 9 høy
       delay(200);  //Pause på 200 millisekund
       digitalWrite( 9, LOW );  // Setter pinne 9 lav
       delay(200);  //Pause på 200 millisekund
    }
    return teller;
}

void setup(){
pinMode(9, OUTPUT);
}

void loop(){
int minVariabel;
  minVariabel=minAndreFunksjon(123, 9.7);
}

 

Eksempel 2

Oppgaver

Oppgaver:

1: Start på et nytt prosjekt. Lag en funksjon som tar 2 parametere: en startverdi og en sluttverdi. Disse bruker du i en for-loop som teller fra startverdi til sluttverdi og skriver tellerverdien til serieporten (Serial Monitor)

Bruk funksjonen du lagde til å skrive ut verdiene fra 10 til 15 og verdiene 110 til 115.

Løsningsforslag

Løsningsforslag:

Oppgave 1:  

/* Start på et nytt prosjekt. Lag en funksjon som tar 2 parametere: en startverdi 
* og en sluttverdi. Disse bruker du i en for-loop som teller fra startverdi til
* sluttverdi og skriver tellerverdien til serieporten (Serial Monitor)
*/

void telleFunksjon(int start, int slutt){ // Funksjons-definisjon
int teller; // Lokal tellevariabel (Bare tilgjengelig inne i denne funksjonen)
for (teller=start;teller<=slutt;teller++){ // Løkke som teller fra "start" til og med "slutt"
Serial.println(teller); //Skriver tellevariabelen til serieporten
delay(400); //Pause på 400 millisekunder
}
} //Slutten av funksjonen

void setup() {
// put your setup code here, to run once:
Serial.begin(9600); //Setter opp serieporten til å kommunisere på 9600 baud
}

void loop() {
telleFunksjon(10,15); // Kaller funksjonen med parameterene 10 og 15
delay(1000); //Pause 1 sekund
telleFunksjon(110,115); // Kaller funksjonen med parameterene 110 og 115
delay(1000); //Pause 1 sekund
}

 

Detaljer
Skrevet av: Per Sigbjørn
Kategori: Funksjoner
Sist oppdatert 10. september 2024
Treff: 4751

Oppdatert versjon

Da er endelig nettsidene oppdatert til Joomla versjon 4. Det vil sikkert være noen barnesykdo mmer, så send meg gjerne en beskjed på Denne e-postadressen er beskyttet mot programmer som samler e-postadresser. Du må aktivere javaskript for å kunne se den. hvis du finner noe som ikke virker. 

Detaljer
Skrevet av: Per Sigbjørn
Kategori: Diverse
Sist oppdatert 15. mars 2024
Treff: 1342

Carolina Reaper sådd 26. juni 2020

Uttrykket "Bør oppbevares utilgjengelig for barn" nevnes i Wikipedia-artikkelen om Carolina Reaper. Riktignok beskriver det chili-pulveret som produseres av Chili Klaus, men det bør så absolutt gjelde for selve chili-frukten også. Denne bør kun inntas av de modige med sterkt hjerte. Når jeg først nevner Chili Klaus, så vil jeg absolutt anbefale å søke ham opp på YouTube og se på noen episoder med chili-smaking sammen med kjendiser. Jeg lo i hvert fall så tårene trillet av episoden med Truls Svendsen :-) https://www.youtube.com/watch?v=A-VCkvyaoeU 

Detaljer
Skrevet av: Per Sigbjørn
Kategori: Planter
Sist oppdatert 12. februar 2024
Treff: 13731

Read more: Carolina Reaper sådd 26. juni 2020

Habanero Dulce sådd 21. april 2020

Oppdatering 27. april 2021

Nesten et år har gått siden disse var sådd, og jeg har visst helt glemt å skrive om dem. To av disse plantene har overvintret i vinduskarmen på stua, og lever i beste velgående. Jeg har hatt en plante til stående på kontoret i vinter, som har gitt den del frukter. (se galleri)

Fruktene er gode på smak, men for den som liker litt styrke er det ikke mye å skryte av. Vil nesten si at de fruktene jeg har fått har vært like milde som paprika. En av stueplantene begynner å få frukter nå, så vi får håpe på at det blir litt utslag på Scoville-skalaen i det minste.

Detaljer
Skrevet av: Per Sigbjørn
Kategori: Planter
Sist oppdatert 27. april 2021
Treff: 7561

Read more: Habanero Dulce sådd 21. april 2020

Mer om Bitfikling og registere - binærteller

Her fortsetter vi litt på forrige artikkel om bitfikling og lager en binærteller med den samme kretsen.

Knappene skal brukes til å telle opp og ned, samt å nulle ut telleren.

Har laget to enkle programmer, det første bare med en ren binærteller, og det andre inkluderer knappene for å telle opp, telle ned og å resette telleren. 

Detaljer
Skrevet av: Per Sigbjørn
Kategori: Bitfikling og registere
Sist oppdatert 09. april 2021
Treff: 9454

Read more: Mer om Bitfikling og registere - binærteller

Bitfikling og registere (litt for viderekomne)

Denne artikkelen tar for seg tema som kan være litt innfløkte, fordi vi hopper over en del av de innebygde Arduino-funksjonene og jobber direkte med registrene i mikrokontrolleren. Foreløpig tar vi for oss AtMega328 som er kontrolleren som sitter både i Arduino Uno og Arduino Nano, med flere.

Hvorfor i all verden skal vi gjøre det, spør du kanskje? Jo, i en del tilfeller blir koden både enklere, raskere og mer effektiv hvis vi manipulerer registrene direkte.

Detaljer
Skrevet av: Per Sigbjørn
Kategori: Bitfikling og registere
Sist oppdatert 08. april 2021
Treff: 9468

Read more: Bitfikling og registere (litt for viderekomne)

Nytt år, ny chili-sesong

i 2020 startet plantesesongen vår noen dager etter at Corona tok av her til lands, sånn ca midt i mars. Vi fant ut i løpet av sommeren at det hadde vært lurt å starte på litt tidligere, så nå er de første Chilisortene sådd.

Har også lært at en bør ha litt spesiell jordblanding til plantene, så denne gangen har jeg kjøpt inn Perlite for å gi bedre drenering og Vermiculite for å holde på fuktigheten. Dette har jeg blandet sammen med Urte- og grønnsaksjord, alt fra Plantasjen. Håper på at dette skal gi god vekst og fine og kraftige planter.

En av sortene jeg var mest spent på i forrige sesong, Trinidad Purple Coffee, ble ingen suksess. Her ble det ikke en eneste frukt, og plantene døde før de ble store nok. Satser på at det var jordblandingen som var problemet og at det går bedre denne gangen. Satte ned 6 frø av disse for sikkerhets skyld.

Foreløpig er disse sortene kommet i jorda:
Aji Blanco Cristal
Black Jalapeño
Bulgarian Carrot
Demon Red
Jamaican Bell
Hot Lemon
Trinidad Purple Coffee

Detaljer
Skrevet av: Per Sigbjørn
Kategori: Planter
Sist oppdatert 15. januar 2021
Treff: 4517

Beaver Dam sådd 21. april

Oppdatering 29. september

Det har vært veldig travelt i det siste både på jobb og med forberedelser til forrige helgs konfirmasjon, så det har blitt dårlig med oppdateringer på plantebloggen. Plantene vokser heldigvis selv om jeg har det travelt så det er da en del framgang. 

Den eneste chilien vi har høstet fra foreløpig er Beaver Dam. Jeg ventet til den hadde skiftet helt farge, men enda var det nok litt for tidlig. Frukten var god på smak, men det var veldig lite styrke. Ikke stor forskjell på denne og en snackpaprika egentlig. Det er noen frukter til som er under modning nå, så jeg tror vi skal vente i noen dager ekstra på dem, og se som det blir litt mer "fres". De skal jo ikke bli veldig sterke, men jeg håper på at det blir -litt- utslag på Scoville-skalaen i hvert fall.

(Nye bilder i galleriet)

Detaljer
Skrevet av: Per Sigbjørn
Kategori: Planter
Sist oppdatert 29. september 2020
Treff: 8445

Read more: Beaver Dam sådd 21. april

Side 1 av 5

  • 1
  • 2
  • 3
  • 4
  • 5

Søk


Avansert søk