Tellstick-15.c. Kompilering av programmet: gcc -o tellstick-15 -Wall -ltelldus-core -W -O2 -s -pipe -lm tellstick-15.c

Relevanta dokument
Raspberry Pi och Tellstick, ett program i C.

printenv sort pager printenv grep args sort pager

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

Hur man kompilerar och kör IT++-program med MinGW. 1 Sammanfattning. 2 Om dokumentet. 3 Om min konfiguration

Programmeringsteknik med C och Matlab

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Skizz till en enkel databas

Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström

(2) Skriv ett program som skapar ett antal processer vars relationer beskrivs av nedanstående tidsdiagram a

Övning från förra gången: readword

Lösningar till uppgifterna sätts ut på kurssidan på nätet idag kl Omtentamen i Programmering C, 5p, A1, D1, E1, Fri, Pr1, Te/Ek1,

Tentamen OOP

Och!efter!ca!20!omgångar!hamnade!den!på!en!stabil!konfiguration!enligt!nedan! där!den!stannar!kvar.!

4 Sammansatta datatyper

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

Dugga i Grundläggande programmering STS, åk

Möte 9: Relationer mellan körande processer - (PI)

SMD 134 Objektorienterad programmering

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs Verónica Gaspes. IDE-sektionen.

Övningar till UNIX/Linux Grundkurs och förslag till LÖSNING

Övningar Dag 2 En första klass

Tentamen i Programmering grundkurs och Programmering C

Snabbguide Visma Compact API Version 5.1 Copyright Visma Spcs AB Visma Compact API

Lösningsförslag, tentamen FYTA11 Javaprogrammering

Växtviskaren EITF11 Digitala projekt VT15, I12

lex källkod lex.l lexkompilator lex.yy.c C- kompilator lex.yy.c a.out sekvens av tokens a.out input specifikation av tokens mha reguljära uttryck

Editering, Kompilering och Exekvering av Javaprogram

Föreläsning 7 Strängar

GPT föreläsning 8. Förra veckan: Man kan ta tiden på en sorterad teckensträng Förra gången: Problemlösning på lägre nivå kan sortera funktioner

Denna laboration skapades för elever vid Roslagens Högskola men kan användas av vem som helst. Namnen på servrarna måste i så fall ändras.

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning 2: Avlusning och antilustekniker

Systemnära programmering Tentamen. Systemnära programmering, 7.5hp 5 november 2012

TDIU01 - Datortenta (DAT2)

SORTERING OCH SÖKNING

Examination i. PROGRAMMERINGSTEKNIK F1/TM1 TIN212 (Dugga) Dag: Onsdag Datum: Tid: (OBS 3 tim) Rum: V

Objektorienterad programmering D2

Tillämpad programmering

Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Mikrodatorteknik

Enkla datatyper minne

Tentamen i. för D1 m fl, även distanskursen. lördag 19 januari 2013

Innehållsförteckning. Exempel. Åtkomst & användarhandledning

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Sockets: server. with Ada.Command_Line; use Ada.Command_Line; with Ada.Exceptions; use Ada.Exceptions; with Ada.Text_IO; use Ada.

... Funktionsanrop. Vad händer när man kör ett program?

Föreläsning 1 & 2 INTRODUKTION

Dessa komponenter plus några motstånd, klockkrets, kondensatorer och annat smått och gott har åstadkommit ett fungerande POV-hjul.

Lektion 1 - Programmeringsteknik F1, ht 2003

Grundläggande programmering med C# 7,5 högskolepoäng

Bruksanvisning för astrour typ

TDIU01 - Programmering i C++, grundkurs

Övning 3 i 2D1324. Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning

Operativsystem ID1200/06 Tentamen :00-18:00

Poster ( structar ) Postdeklarationer

Generell säkerhet. Loggning - Hur mycket ska man logga? Inloggningsrutinerna i Unix. Loggning fortsättning

Programmeringsteknik med C och Matlab

Det finns många flaggor till g++,

16 Programmering TI -86 F1 F2 F3 F4 F5 M1 M2 M3 M4 M5

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Pekare och arrayer. Indexering och avreferering

Att använda Java SE JDK 6

PROGRAMMERING A VC# 2008 EXPRESS UTVECKLINGSVERKTYGET VISUAL C#

Utkast. Programmering. Signals. Olika typer av program. Sommarkurs Avbrott i mjukvara.

Fö 8 TSEA81. Real-time Linux

En kort text om programmering i C.

OOP Objekt-orienterad programmering

KOMMUNALT AKTIVITETSMEDLEMSBIDRAG

Avancerad SSL-programmering II

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

F4. programmeringsteknik och Matlab

Repetition C-programmering

Lösningar till uppgifterna sätts ut på kurssidan och på WebCT (Gamla Tentor) i dag kl 19. Tentamen i Programmering C, 5p, Distans, övriga,

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Larmcentral. Digitala Projekt. Cecilia Olsson & Erika Björck Handledare: Bertil Lindvall LUNDS TEKNISKA HÖGSKOLA

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl 13. Omtentamen i Programmering C, 5p, A1, D1, PA1, Fri,

DOWN/RESET(Knapp C) UP/START(Knapp D)

Vad händer när man kör ett program? Program och processer. Funktionsanrop. Avsluta programmet

Tentamen på kursen DA7351, Programmering , kl Malmö högskola Teknik och samhälle. DA7351, Programmering

Din manual BLAUPUNKT NAVIRECHNER RGS 08

Programmeringsuppgifter 1

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

Chalmers, Data- och informationsteknik DAI2 samt EI3. Peter Lundin. Godkänd räknedosa

Laboration 10 - NetBeans

Programmering A C# VT Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson

Dagens föreläsning. Specialtecken. Mer om printf. Formateringssträngar. Mer om scanf. Programmeringsteknik för Ingenjörer VT05

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Tillämpad UNIX. Laborations-PM Christian von Schultz, Programpaket och processhantering

Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp :00-18:00

Tyck om Burlöv Den första resp. sista synpunkten under aktuell period registrerades

Introduktion till arv

Svensk e-legitimation. Nu kör vi!

Programmeringsolympiadens final 2009

Att använda pekare i. C-kod

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Omtentamen i Programmering C, Fri, Kväll,

Transkript:

Tellstick-15.c Ett program skrivet i C för att med Tellstick tända och släcka en eller flera lampor. Det nya i detta program är att strömbrytare 1 tänds och släcks efter solens upp- och nedgång, tänds vid solens nedgång och släcks vid solens uppgång. Kompilering av programmet: gcc -o tellstick-15 -Wall -ltelldus-core -W -O2 -s -pipe -lm tellstick-15.c Programmet kommer att skifta loggfil kl 00:01, så kallad loggroll. Programmet startas med kommandot: /home/pi/development/cprog/tellstick/tellstick-15 -f </dev/null &>/dev/null & Avsluta programmet med shellkommandot: kill -9 PID där PID, process ID, är det id som sätts på programmet. PID kan hittas med hjälp av shellkommandot: ps -ef Programmet tellstick-15.c / tellstick-15.c 2014-11-28 Jan Pihlgren Loggroll körs varje natt klockan 00:01. Programmet justerar sig till att mäta absolut minut. (diff) Programmet utnyttjar en indatafil där tänd och släcktider anges. Brytare nr 1 kommer alltid att tändas vid solens nedgång och släckas vid solens uppgång. PATH/tellstick-13 -f Indatafilens organisation: löpnr tändtid släcktid brytarnr/enhetsnr ex: 1 15:00 17:00 2 ordningsnr, tändtid, släcktid, brytarenr Programmet stoppas med kommando:

kill -9 PID eller sudo kill -9 PID där PID hittas med kommando ps -ef och leta efter startkommandot ovan. Tänker införa möjlighet att kommunicera med programmet när det körs. Kompilera: (gcc -o tellstick-15 -Wall -ltelldus-core -W -O2 -s -pipe -lm tellstick-15.c) / #include <telldus-core.h> #include <time.h> #include <sys/time.h> #include <math.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include "struktur.h" #include "sunrise.h" / struct strombr char nr[2]; char ontid[10]; char offtid[10]; char switchnr[2]; ; struct strombr brytare[25]; / // Ordningsnummer // Brytarens/enhetens nr // Plats för 25 brytare/enheter char indatafile[] = "/home/pi/script/tidschema_ny.data"; char logfile[] = "/home/pi/temp/tellstick.log"; int antpost =0; int postnr; char typ[2]=" "; void loggroll(); void readdata_ny();

int sunrise( int year, int month, int day); int main(int argc, char argv[]) time_t tid; struct tm info; char buffer[80]; char sec[80]; char klockan[10]; int i; int go = 1; // fortsätt programmet int diff; // skillnads char version[] = "Version: tellstick-15"; char rolltid[] = "00:01"; int year=2014; int month=12; int day=1; time(&tid); info = localtime(&tid); strftime(buffer,80,"%y",info); year=atoi(buffer); strftime(buffer,80,"%m",info); month=atoi(buffer); strftime(buffer,80,"%d",info); day=atoi(buffer); loggroll(); / Rulla loggfilerna / readdata_ny(); / läs in data för tändtider och släcktider i struct brytare / sunrise(year,month,day); / Sätt tiden för solens upp- och nedgång för brytare 0 / printf("datum = %d-%d-%d:\n",year,month,day); printf("brytare 0,Tändtid = %s Släcktid = %s\n",brytare[0].ontid,brytare[0].offtid); FILE fp; if (argc > 1)

if (strcmp(argv[1], "-f") == 0) / Läsa från datafil om tänd- och släcktider? / / Hämtas data från fil / postnr = 0; / Första tändtiden, post nr 1 / // else // strcmp? // fp=fopen(logfile, "a"); fprintf(fp,"%s\n",version); fprintf(fp,"brytare %s\n ",brytare[postnr].switchnr); fprintf(fp,"tändning sker klockan %s\n",brytare[postnr].ontid); fprintf(fp, "Släckning sker klockan %s\n",brytare[postnr].offtid); fclose(fp); while(go!= 0) time(&tid); info = localtime(&tid); strftime(buffer,80,"%h:%m",info); strcpy(klockan,buffer); strftime(sec,80,"%h:%m:%s",info); strftime(buffer,80,"%y",info); year=atoi(buffer); strftime(buffer,80,"%m",info); month=atoi(buffer); strftime(buffer,80,"%d",info); day=atoi(buffer); sunrise(year,month,day); / Sätt tiden för solens upp- och nedgång för brytare 0 / // printf("datum = %d-%d-%d:\n",year,month,day); // printf("brytare 0,Tändtid = %s Släcktid = %s\n",brytare[0].ontid,brytare[0].offtid); fp=fopen(logfile, "a"); for(i = 0; i < antpost; i++) if(strcmp(klockan,brytare[i].ontid) == 0)

tdturnon(atoi(brytare[i].switchnr)); fprintf(fp,"tänder %s Kl %s\n",brytare[i].switchnr,klockan); if(strcmp(klockan,brytare[i].offtid) == 0) tdturnoff(atoi(brytare[i].switchnr)); fprintf(fp,"släcker %s Kl %s\n",brytare[i].switchnr,klockan); fclose(fp); if(strcmp(rolltid,klockan) == 0) loggroll(); loggfilerna readdata_ny(); data igen / sunrise(year,month,day); solens upp och nergång / // Rulla / läs in / Återställ brytare 0 till fp=fopen(logfile, "a"); fprintf(fp,"%s\n",version); if(strcmp(argv[1],"-f") == 0) fprintf(fp,"ant poster = %d\n",antpost); fprintf(fp,"tändning kl %s. Släckning kl %s\n",brytare[0].ontid,brytare[0].offtid); fclose(fp); / Här ska programmet kontrollera om det finns något inkommande kommando som ska åtgärdas / diff = 60 - atoi(sec); sleep(diff); // go=0; tdclose(); // Rucka klockan så tiden blir exact på minuten. return 0;

void loggroll() char oldfile1[] = "/home/pi/temp/tellstick.old1"; char oldfile2[] = "/home/pi/temp/tellstick.old2"; char oldfile3[] = "/home/pi/temp/tellstick.old3"; / Radera oldfile3 / remove(oldfile3); / Flytta filer / rename(oldfile2, oldfile3); // flytta oldfile2 till oldfile3 rename(oldfile1, oldfile2); // flytta oldfile1 till oldfile2 rename(logfile, oldfile1); // flytta logfile till oldfile1 return; void readdata_ny() FILE data; data = fopen(indatafile,"r"); antpost=0; while(1) fscanf(data,"%s",brytare[antpost].nr); fscanf(data,"%s",brytare[antpost].ontid); fscanf(data,"%s",brytare[antpost].offtid); fscanf(data,"%s",brytare[antpost].switchnr); antpost++; if(feof(data)) antpost--; break; fclose(data); return;

/ header för strukturen brytare / struct strombr char nr[2]; char ontid[10]; char offtid[10]; char switchnr[2]; ; struct strombr brytare[25]; strucktur.h // Ordningsnummer // Brytarens/enhetens nr // Plats för 25 brytare/enheter sunrice.h / sunrise.h Copyright (GPL) 2004 Mike Chirico mchirico@comcast.net Updated: Sun Nov 28 15:15:05 EST 2004 Program adapted by Mike Chirico mchirico@comcast.net Reference: http://prdownloads.sourceforge.net/souptonuts/working_with_time.tar.gz?download http://www.srrb.noaa.gov/highlights/sunrise/sunrise.html Modified: 2014-11-28 Jan Pihlgren Position för MÄRSTA: 59 grader 37 minuter 0 sekunder N, 17 grader 51 minuter 0 sekunder E 59.62, -17.85 Kompilera: (gcc -L/usr/local/lib -Wall -W -lm -o sunrise sunrise.c) (gcc -o sunrise -Wall -W -O2 -s -pipe -lm sunrise.c) Exekvera för Märsta:

./sunrise 2014 11 24 59.62-17.85 / double calcsuneqofcenter(double t); / Convert degree angle to radians / double degtorad(double angledeg) return (M_PI angledeg / 180.0); double radtodeg(double anglerad) return (180.0 anglerad / M_PI); double calcmeanobliquityofecliptic(double t) double seconds = 21.448 - t(46.8150 + t(0.00059 - t(0.001813))); double e0 = 23.0 + (26.0 + (seconds/60.0))/60.0; return e0; // in degrees double calcgeommeanlongsun(double t) double L = 280.46646 + t (36000.76983 + 0.0003032 t); while( (int) L > 360 ) L -= 360.0; while( L < 0)

L += 360.0; return L; // in degrees double calcobliquitycorrection(double t) double e0 = calcmeanobliquityofecliptic(t); double omega = 125.04-1934.136 t; double e = e0 + 0.00256 cos(degtorad(omega)); return e; // in degrees double calceccentricityearthorbit(double t) double e = 0.016708634 - t (0.000042037 + 0.0000001267 t); return e; // unitless double calcgeommeananomalysun(double t) double M = 357.52911 + t (35999.05029-0.0001537 t); return M; // in degrees double calcequationoftime(double t) double epsilon = calcobliquitycorrection(t); double l0 = calcgeommeanlongsun(t);

double e = calceccentricityearthorbit(t); double m = calcgeommeananomalysun(t); double y = tan(degtorad(epsilon)/2.0); y = y; double sin2l0 = sin(2.0 degtorad(l0)); double sinm = sin(degtorad(m)); double cos2l0 = cos(2.0 degtorad(l0)); double sin4l0 = sin(4.0 degtorad(l0)); double sin2m = sin(2.0 degtorad(m)); double Etime = y sin2l0-2.0 e sinm + 4.0 e y sinm cos2l0-0.5 y y sin4l0-1.25 e e sin2m; return radtodeg(etime)4.0; // in minutes of time double calctimejuliancent(double jd) double T = ( jd - 2451545.0)/36525.0; return T; double calcsuntruelong(double t) double l0 = calcgeommeanlongsun(t); double c = calcsuneqofcenter(t); double O = l0 + c; return O; // in degrees double calcsunapparentlong(double t) double o = calcsuntruelong(t);

double omega = 125.04-1934.136 t; double lambda = o - 0.00569-0.00478 sin(degtorad(omega)); return lambda; // in degrees double calcsundeclination(double t) double e = calcobliquitycorrection(t); double lambda = calcsunapparentlong(t); double sint = sin(degtorad(e)) sin(degtorad(lambda)); double theta = radtodeg(asin(sint)); return theta; // in degrees double calchouranglesunrise(double lat, double solardec) double latrad = degtorad(lat); double sdrad = degtorad(solardec); double HA = (acos(cos(degtorad(90.833))/(cos(latrad)cos(sdrad))-tan(latrad) tan(sdrad))); return HA; // in radians double calchouranglesunset(double lat, double solardec) double latrad = degtorad(lat); double sdrad = degtorad(solardec); double HA = (acos(cos(degtorad(90.833))/(cos(latrad)cos(sdrad))-tan(latrad) tan(sdrad))); return -HA; // in radians

double calcjd(int year,int month,int day) if (month <= 2) year -= 1; month += 12; int A = floor(year/100); int B = 2 - A + floor(a/4); 1524.5; double JD = floor(365.25(year + 4716)) + floor(30.6001(month+1)) + day + B - return JD; double calcjdfromjuliancent(double t) double JD = t 36525.0 + 2451545.0; return JD; double calcsuneqofcenter(double t) double m = calcgeommeananomalysun(t); double mrad = degtorad(m); double sinm = sin(mrad); double sin2m = sin(mrad+mrad); double sin3m = sin(mrad+mrad+mrad); double C = sinm (1.914602 - t (0.004817 + 0.000014 t)) + sin2m (0.019993-0.000101 t) + sin3m 0.000289; return C; // in degrees double calcsunriseutc(double JD, double latitude, double longitude)

double t = calctimejuliancent(jd); // First pass to approximate sunrise double eqtime = calcequationoftime(t); double solardec = calcsundeclination(t); double hourangle = calchouranglesunrise(latitude, solardec); double delta = longitude - radtodeg(hourangle); double timediff = 4 delta; // in minutes of time double timeutc = 720 + timediff - eqtime; // in minutes double newt = calctimejuliancent(calcjdfromjuliancent(t) + timeutc/1440.0); eqtime = calcequationoftime(newt); solardec = calcsundeclination(newt); hourangle = calchouranglesunrise(latitude, solardec); delta = longitude - radtodeg(hourangle); timediff = 4 delta; timeutc = 720 + timediff - eqtime; // in minutes return timeutc; double calcsunsetutc(double JD, double latitude, double longitude) double t = calctimejuliancent(jd); // First pass to approximate sunset

double eqtime = calcequationoftime(t); double solardec = calcsundeclination(t); double hourangle = calchouranglesunset(latitude, solardec); double delta = longitude - radtodeg(hourangle); double timediff = 4 delta; // in minutes of time double timeutc = 720 + timediff - eqtime; // in minutes double newt = calctimejuliancent(calcjdfromjuliancent(t) + timeutc/1440.0); eqtime = calcequationoftime(newt); solardec = calcsundeclination(newt); hourangle = calchouranglesunset(latitude, solardec); delta = longitude - radtodeg(hourangle); timediff = 4 delta; timeutc = 720 + timediff - eqtime; // in minutes // printf(" eqtime = %f \nsolardec = %f \ntimeutc = %f\n\n",eqtime,solardec,timeutc); return timeutc; int sunrise(int year, int month, int day) time_t seconds; time_t tseconds; struct tm ptm=null; struct tm tm; int dst=-1; char buffer[30]; float JD=calcJD(year,month,day);

double latitude = 59.62; double longitude = -17.85; // Minus för söder om ekvatorn, för Märsta // Minus för öster om Greenwich, för Märsta JD = calcjd(year,month,day); tm.tm_year= year-1900; tm.tm_mon=month-1; / Jan = 0, Feb = 1,.. Dec = 11 / tm.tm_mday=day; tm.tm_hour=0; tm.tm_min=0; tm.tm_sec=0; tm.tm_isdst=-1; seconds = mktime(&tm); int delta; dst =tm.tm_isdst; ptm = gmtime ( &seconds ); delta = ptm->tm_hour; tseconds = seconds; seconds= seconds + calcsunriseutc( JD, latitude, longitude)60; seconds= seconds - delta3600; strftime(buffer,30,"%m-%d-%y %T",localtime(&seconds)); // printf("sunrise %s ",buffer); char rise[35]; strftime(rise,30,"%h:%m",localtime(&seconds)); seconds=tseconds; seconds+=calcsunsetutc( JD, latitude, longitude)60; seconds= seconds - delta3600; strftime(buffer,30,"%m-%d-%y %T",localtime(&seconds)); // printf("sunset %s\n",buffer); char set[35]; strftime(set,30,"%h:%m",localtime(&seconds));

// --------------------------------------- // printf("sunset %s ",set); // printf("sunrise %s\n",rise); strcpy(brytare[0].ontid,set); strcpy(brytare[0].offtid,rise); return 0; Kompilering gcc -o tellstick-15 -Wall -ltelldus-core -W -O2 -s -pipe -lm tellstick-15.c 1 04:30 08:11 1 2 05:00 06:00 2 4 16:15 17:05 2 tidschema_ny.data