Sida 2 av 3
Re: Läsa pulser från serieporten (led-detektor)
Postat: 8 april 2009, 21:30:17
av hatt
Om jag lyser på den med t.ex tv-fjärren skickas en puls, med den reagerar ej på led på elmätaren.
Kan det bero på för högt/lågt motstånd?
Re: Läsa pulser från serieporten (led-detektor)
Postat: 8 april 2009, 21:38:24
av v-g
Om du har en vanlig LED dvs inte en IR ska du ha klar kapsel. Annars föreslår jag att minska på motståndet (dvs högre ohmtal). Eller så helt enkelt experimentera det kostar ju inget att testa då inget ska kunna gå sönder.
Re: Läsa pulser från serieporten (led-detektor)
Postat: 8 april 2009, 21:48:03
av hatt
Det jag undrar över är alltså om det är någon idé att fortsätta med den fototrissan jag har.
LTR-4206E
datablad:
http://pdf1.alldatasheet.com/datasheet- ... 4206E.html
tack för all hjälp.
Re: Läsa pulser från serieporten (led-detektor)
Postat: 8 april 2009, 21:50:31
av bearing
är det din egen terminologi det där, v-g?
alltså att "minska på motståndet" skulle betyda "öka resistansen"
Re: Läsa pulser från serieporten (led-detektor)
Postat: 8 april 2009, 22:00:20
av v-g
Nä nu skrev jag nog fel. har 6 st skrikande ungar här så hav förbarmelse detta är min enda tillflykt

Re: Läsa pulser från serieporten (led-detektor)
Postat: 8 april 2009, 22:14:51
av hatt
eeeehhh... Nu är jag inte mindre förvirrad

Re: Läsa pulser från serieporten (led-detektor)
Postat: 8 april 2009, 23:41:18
av hatt
Ingen nära piteå som har en klar fototransistor liggande?
Re: Läsa pulser från serieporten (led-detektor)
Postat: 9 april 2009, 00:27:19
av v-g
Ber om ursäkt att jag rört till det hela. Det jag sagt gäller i stort sett inte alls. Nivåerna är helt andra i en seriellport än vad som krävs för en PIC som är mitt fall.
Vette fan vad jag tänkte med alls.
Mitt projekt finns där-->
http://elektronikforumet.com/forum/view ... =3&t=31240 står exakt vilken trissa jag använt osv.
Re: Läsa pulser från serieporten (led-detektor)
Postat: 9 april 2009, 22:28:28
av hatt
Med en trissa med klar kåpa fungerar mitt bygge.
Vill försöka mig på att skriva ett program som räknar ut momentan och ackumulerad elförbrukning.
datormiljö: Linux
programspråk: C eller?
Har bara kommit så långt att varje puls skrivs ut i terminalen som ett ? (med vit bakgrund!? ASCII?)
Nu behöver jag en knuff framåt:
Hur räknar jag pulserna under en viss tid?
tick, tack
Re: Läsa pulser från serieporten (led-detektor)
Postat: 9 april 2009, 22:49:12
av bearing
I linux (och på nätet) har du tillgång till en manual som beskriver de flesta vanliga C-funktionerna.
Det finns en funktion som returnerar tiden som antalet sekunder sedan 1970.
I början av programmet:
*Spara antalet sekunder sedan 1970 i en variabel i början av programmet.
*Nollställ en räknare
I huvudloopen:
1. Vänta på tecken
2. Öka räknaren
3. Läs in antalet sekunder sedan 1970
4. Jämför det just inlästa värdet med det sparade värdet. Om skillnaden är större än t.ex. 5 (?) sekunder:
*Lägg det just inlästa värdet i variabeln som det jämförts med
*Spara räknaren i en lista (array)
*Nollställ räknaren
5. Gå till 1
Genom att titta listan kan både momentan och ackumulerad förbrukning presenteras, samt grafer ritas. Om du inte kan skriva ett program som ritar en graf kan du göra så att programet sparar listan i en fil och sedan importera filen i t.ex. Open Office Calc och där skapa en graf.
Re: Läsa pulser från serieporten (led-detektor)
Postat: 9 april 2009, 23:42:00
av hatt
Här nedan finns koden som jag har hittils.
Orkar någon ändra min kod och visa hur jag räknar antalet pulser på t.ex 5s och räknar ut och skriver momentan förbrukning till terminalen?
Stämmer detta "tänk"?
antalet pulser / 10000 (pulser/kWh) / (5s / 3600) * 1000 = momentan förbrukning i W
Tack igen!
Kod: Markera allt
#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
/*
* 'open_port()' - Open serial port 1.
*
* Returns the file descriptor on success or -1 on error.
*/
int open_port(void)
{
int fd; /* File descriptor for the port */
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{ /* Could not open the port */
fprintf(stderr, "open_port: Unable to open /dev/ttyS1 - %s\n",
strerror(errno));
}
return (fd);
}
void main()
{
int mainfd=0; /* File descriptor */
char chout;
struct termios options;
mainfd = open_port();
fcntl(mainfd, F_SETFL, FNDELAY); /* Configure port reading */
/* Get the current options for the port */
tcgetattr(mainfd, &options);
cfsetispeed(&options, B110); /* Set the baud rates to 9600 */
cfsetospeed(&options, B110);
/* Enable the receiver and set local mode */
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB; /* Mask the character size to 8 bits, no parity */
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8; /* Select 8 data bits */
options.c_cflag &= ~CRTSCTS; /* Disable hardware flow control */
/* Enable data to be processed as raw input */
options.c_lflag &= ~(ICANON | ECHO | ISIG);
/* Set the new options for the port */
tcsetattr(mainfd, TCSANOW, &options);
while (1)
{
read(mainfd, &chout, sizeof(chout)); /* Read character from ABU */
if (chout != 0)
printf("Got %c\n", chout);
chout=0;
}
/* Close the serial port */
close(mainfd);
}
Re: Läsa pulser från serieporten (led-detektor)
Postat: 10 april 2009, 11:25:26
av bearing
Här är ett förslag. Jag har inte kunnat kompilera då datorn jag sitter på saknar linux. Räkna med fel i kompileringen och kanske någon bugg.
EDIT: ändrade "%s\t%d\t%d\t%d\n" till "%s\t%f\t%f\t%f\n"
Kod: Markera allt
#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
#include <time.h>
#define interval 5
/*
* 'open_port()' - Open serial port 1.
*
* Returns the file descriptor on success or -1 on error.
*/
int open_port(void)
{
int fd; /* File descriptor for the port */
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{ /* Could not open the port */
fprintf(stderr, "open_port: Unable to open /dev/ttyS1 - %s\n",
strerror(errno));
}
return (fd);
}
void main()
{
int mainfd=0; /* File descriptor */
char chout;
struct termios options;
time_t start,earlier, now;
long pulseCount,pulseIntegral;
double currentPower,averagePower,ackumulatedEnergy;
char theTime[25];
mainfd = open_port();
fcntl(mainfd, F_SETFL, FNDELAY); /* Configure port reading */
/* Get the current options for the port */
tcgetattr(mainfd, &options);
cfsetispeed(&options, B110); /* Set the baud rates to 9600 */
cfsetospeed(&options, B110);
/* Enable the receiver and set local mode */
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB; /* Mask the character size to 8 bits, no parity */
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8; /* Select 8 data bits */
options.c_cflag &= ~CRTSCTS; /* Disable hardware flow control */
/* Enable data to be processed as raw input */
options.c_lflag &= ~(ICANON | ECHO | ISIG);
/* Set the new options for the port */
tcsetattr(mainfd, TCSANOW, &options);
pulseCount=0;
pulseIntegral=0;
start=earlier=time();
printf("Time\t\tCurrent Power(W)\tAverage Power(W)\tAckumulated Energy(kWh)\n");
while (1)
{
read(mainfd, &chout, sizeof(chout)); /* Read character from ABU */
if (chout != 0)
{
pulseCount++;
chout=0;
now=time();
if ((now-earlier)>=interval)
{
pulseIntegral+=pulseCount;
currentPower=(double)pulseCount*(3600/10)/(now-earlier);
averagePower=(double)pulseIntegral*(3600/10)/(now-start);
ackumulatedEnergy=(double)pulseIntegral/10000;
strftime(theTime,sizeof(theTime),"%d-%m-%y %H:%M:%S",now)
printf("%s\t%f\t%f\t%f\n",
theTime,currentPower,averagePower,ackumulatedEnergy);
earlier=now;
}
}
sleep(0); /* Give other processes some time */
}
/* Close the serial port */
close(mainfd);
}
Re: Läsa pulser från serieporten (led-detektor)
Postat: 10 april 2009, 15:56:11
av hatt
Får ett felmeddelande som säger att funktionen time (på två ställen) har för få argument.
Jag känner mig sämst men jag hittar inte vad det skulle vara för argument.
Noch einmal
Re: Läsa pulser från serieporten (led-detektor)
Postat: 10 april 2009, 17:08:42
av Maalobs
Dokumentationen för time() säger så här:
$ man 2 time
Reformatting time(2), please wait...
TIME(2) Linux Programmer's Manual TIME(2)
NAME
time - get time in seconds
SYNOPSIS
#include <time.h>
time_t time(time_t *t);
DESCRIPTION
time returns the time since the Epoch (00:00:00 UTC, JanÂ
uary 1, 1970), measured in seconds.
If t is non-NULL, the return value is also stored in the
memory pointed to by t.
RETURN VALUE
On success, the value of time in seconds since the Epoch
is returned. On error, ((time_t)-1) is returned, and
errno is set appropriately.
ERRORS
EFAULT t points outside your accessible address space.
NOTES
POSIX.1 defines seconds since the Epoch as a value to be
interpreted as the number of seconds between a specified
time and the Epoch, according to a formula for conversion
from UTC equivalent to conversion on the naïve basis that
leap seconds are ignored and all years divisible by 4 are
leap years. This value is not the same as the actual numÂ
ber of seconds between the time and the Epoch, because of
leap seconds and because clocks are not required to be
synchronised to a standard reference. The intention is
that the interpretation of seconds since the Epoch values
be consistent; see POSIX.1 Annex B 2.2.2 for further
rationale.
CONFORMING TO
SVr4, SVID, POSIX, X/OPEN, BSD 4.3
Under BSD 4.3, this call is obsoleted by gettimeofday(2).
POSIX does not specify any error conditions.
SEE ALSO
ctime(3), date(1), ftime(3), gettimeofday(2)
Linux 2.0.30 1997-09-09 TIME(2)
Dessutom har du lite fler fel än så:
$ cc -o test test.c
test.c: In function `main':
test.c:67: error: too few arguments to function `time'
test.c:80: error: too few arguments to function `time'
test.c:89: warning: passing arg 4 of `strftime' makes pointer from integer without a cast
test.c:90: error: parse error before "printf"
test.c:33: warning: return type of `main' is not `int'
Rad 89 saknar semikolon på slutet.
Ändra main() från void till int och avsluta funktionen med den här raden:
return 0;
Vad strftime vill ha för parametrar kan du slå upp med:
man 3 strftime
Eller egentligen borde du kanske inte lyssna på mig, det var många år sedan jag gjorde något i C...

Re: Läsa pulser från serieporten (led-detektor)
Postat: 11 april 2009, 11:52:57
av hatt
Nu printar programmet ut diverse värden. Nästa steg blir att lagra värdena i mysql.
Någon som förresten vet hur man använder variablerna (%s,%f osv.) i ett mysq_query?
Hittar bara exempel där man använder konstanter.
tack så länge