Läsa pulser från serieporten (led-detektor)

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
hatt
Inlägg: 39
Blev medlem: 6 mars 2004, 16:50:31

Re: Läsa pulser från serieporten (led-detektor)

Inlägg 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?
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Läsa pulser från serieporten (led-detektor)

Inlägg 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.
hatt
Inlägg: 39
Blev medlem: 6 mars 2004, 16:50:31

Re: Läsa pulser från serieporten (led-detektor)

Inlägg 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.
bearing
Inlägg: 11687
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Läsa pulser från serieporten (led-detektor)

Inlägg av bearing »

är det din egen terminologi det där, v-g?
alltså att "minska på motståndet" skulle betyda "öka resistansen"
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Läsa pulser från serieporten (led-detektor)

Inlägg 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 :D
hatt
Inlägg: 39
Blev medlem: 6 mars 2004, 16:50:31

Re: Läsa pulser från serieporten (led-detektor)

Inlägg av hatt »

eeeehhh... Nu är jag inte mindre förvirrad :shock:
hatt
Inlägg: 39
Blev medlem: 6 mars 2004, 16:50:31

Re: Läsa pulser från serieporten (led-detektor)

Inlägg av hatt »

Ingen nära piteå som har en klar fototransistor liggande?
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Läsa pulser från serieporten (led-detektor)

Inlägg 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. :wall:

Mitt projekt finns där--> http://elektronikforumet.com/forum/view ... =3&t=31240 står exakt vilken trissa jag använt osv.
hatt
Inlägg: 39
Blev medlem: 6 mars 2004, 16:50:31

Re: Läsa pulser från serieporten (led-detektor)

Inlägg 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
bearing
Inlägg: 11687
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Läsa pulser från serieporten (led-detektor)

Inlägg 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.
hatt
Inlägg: 39
Blev medlem: 6 mars 2004, 16:50:31

Re: Läsa pulser från serieporten (led-detektor)

Inlägg 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);
 }
bearing
Inlägg: 11687
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Läsa pulser från serieporten (led-detektor)

Inlägg 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);
}
hatt
Inlägg: 39
Blev medlem: 6 mars 2004, 16:50:31

Re: Läsa pulser från serieporten (led-detektor)

Inlägg 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
Maalobs
Inlägg: 1304
Blev medlem: 3 februari 2005, 14:35:15
Ort: Stockholm

Re: Läsa pulser från serieporten (led-detektor)

Inlägg 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... :wink:
hatt
Inlägg: 39
Blev medlem: 6 mars 2004, 16:50:31

Re: Läsa pulser från serieporten (led-detektor)

Inlägg 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
Skriv svar