Hjem
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
- Treff: 3255
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.
Et litt mer mer avansert eksempel: 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. 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
/*
* 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:
- Detaljer
- Skrevet av: Per Sigbjørn
- Kategori: Tilstandsmaskin
- Treff: 9967
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(){ Denne funksjonen skal ikke returnere noe, derfor bruker vi «void» (tomrom). Funksjonen har heller ingen parametre, men parantesene må uansett være med. minFunksjon();
|
Eksempel med returverdi og to parametere
Eksempel med returverdi og to parametere
Et mer avansert eksempel: int minAndreFunksjon(int antall, float desimalTall){
|
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 |
- Detaljer
- Skrevet av: Per Sigbjørn
- Kategori: Funksjoner
- Treff: 4668
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å
- Detaljer
- Skrevet av: Per Sigbjørn
- Kategori: Diverse
- Treff: 910
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
- Treff: 12430
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
- Treff: 6732
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
- Treff: 7203
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
- Treff: 7134
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
- Treff: 4042
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
- Treff: 7921
Buena Mulata sådd 21. april
Oppdatering 21. august
Hele 4 måneder har gått siden jeg sådde 12 frø med Buena Mulata. Endelig begynner det å gi resultater. Når drivhuset var ferdig satte jeg 7 av 8 planter direkte ut i drivhuset. Trodde det skulle gå bra uten "tilvenning", men slik gikk det dessverre ikke. Alle chiliplantene i drivhuset fikk seg en skikkelig knekk og tok nesten kvelden. Overgangen fra 3-lags isolerglass til ett enkelt, tynt lag med glass var tydeligvis for hard. En lærer noe nytt hele tiden. Nå begynner plantene heldigvis å komme seg til igjen, og flere av dem har masse blomster. Chilien på bildet er fra planten som sto igjen inne. Den er ikke så veldig stor ennå, nærmer seg kanskje 7-8 cm, men for en nydelig farge! Den har også fått et par "søsken" de siste par dagene, så det kan nok bli litt avling før vinteren kommer. Plantene i drivhuset blomstrer også, så det er muligheter der også. Selve planten her er også litt spesiell. Bladene har litt mørkere farge, og "leddene" er tydelig lilla, så det er ikke vanskelig å plukke dem ut selv om merkingen skulle forsvinne. (skal legge ut bilde i galleriet.) Som jeg har skrevet om tidligere, skal dette være en sjelden sort, så jeg håper at jeg får høstet noen frø til neste sesong. Hvis noen er interessert er det bare å si fra. :-) |
- Detaljer
- Skrevet av: Per Sigbjørn
- Kategori: Planter
- Treff: 5886
Side 1 av 5