2014-11-25 15:27:33 +01:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <sys/ioctl.h>
|
|
|
|
#include <linux/i2c-dev.h>
|
|
|
|
#include <ncurses.h> /* libncurses5-dev */
|
|
|
|
|
|
|
|
/*
|
|
|
|
2014-08-26 PCF8591.c
|
|
|
|
|
|
|
|
sudo apt-get install libncurses5-dev
|
|
|
|
|
|
|
|
gcc -o PCF8591 PCF8591.c -lcurses -lpigpio -lpthread
|
|
|
|
|
|
|
|
sudo ./PCF8591
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
2014-11-25 19:05:55 +01:00
|
|
|
Connect Pi 3V3 - VCC, Ground - Ground, SDA - SDA, SCL - SCL.
|
2014-11-25 15:27:33 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
#define PCF8591_I2C_ADDR 0x48
|
|
|
|
|
|
|
|
/*
|
|
|
|
P4 The thermister voltage is provided at AIN 1.
|
|
|
|
P5 The photocell voltage is provided at AIN 0.
|
|
|
|
P6 The single turn 10K ohm trim pot voltage is provided at AIN 3.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
7 6 5 4 3 2 1 0
|
|
|
|
0 X X X 0 X X X
|
|
|
|
| | | | | |
|
|
|
|
A B B C D D
|
|
|
|
|
|
|
|
0 1 0 0 0 1 0 0
|
|
|
|
|
|
|
|
A 0 D/A inactive
|
|
|
|
1 D/A active
|
|
|
|
|
|
|
|
B 00 single ended inputs
|
|
|
|
01 differential inputs
|
|
|
|
10 single ended and differential
|
|
|
|
11 two differential inputs
|
|
|
|
|
|
|
|
C 0 no auto inc
|
|
|
|
1 auto inc
|
|
|
|
|
|
|
|
D 00 select channel 0
|
|
|
|
01 select channel 1
|
|
|
|
10 select channel 2
|
|
|
|
11 select channel 3
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
int main(int argc, char *argv[])
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
int r;
|
|
|
|
int handle;
|
|
|
|
char aout;
|
|
|
|
unsigned char command[2];
|
|
|
|
unsigned char value[4];
|
|
|
|
unsigned char str[8];
|
|
|
|
|
|
|
|
int j;
|
|
|
|
int key;
|
|
|
|
|
|
|
|
if (gpioInitialise() < 0) return 1;
|
|
|
|
|
|
|
|
initscr();
|
|
|
|
noecho();
|
|
|
|
cbreak();
|
|
|
|
nodelay(stdscr, true);
|
|
|
|
curs_set(0);
|
|
|
|
|
|
|
|
printw("PCF8591 + or - to change aout, any other key to quit.");
|
|
|
|
|
|
|
|
mvaddstr(10, 0, "Brightness");
|
|
|
|
mvaddstr(12, 0, "Temperature");
|
|
|
|
mvaddstr(14, 0, "?");
|
|
|
|
mvaddstr(16, 0, "Resistor");
|
|
|
|
|
|
|
|
refresh();
|
|
|
|
|
|
|
|
handle = i2cOpen(1, PCF8591_I2C_ADDR, 0);
|
|
|
|
|
|
|
|
command[1] = 0;
|
|
|
|
aout = 128;
|
|
|
|
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
for (i=0; i<4; i++)
|
|
|
|
{
|
|
|
|
command[1] = aout;
|
|
|
|
command[0] = 0x40 | ((i + 1) & 0x03); // output enable | read input i
|
|
|
|
|
|
|
|
i2cWriteDevice(handle, &command, 2);
|
|
|
|
|
|
|
|
usleep(20000);
|
|
|
|
|
|
|
|
// the read is always one step behind the selected input
|
|
|
|
value[i] = i2cReadByte(handle);
|
|
|
|
|
|
|
|
sprintf(str, "%3d", value[i]);
|
|
|
|
mvaddstr(10+i+i, 12, str);
|
|
|
|
value[i] = value[i] / 4;
|
|
|
|
move(10 + i + i, 16);
|
|
|
|
|
|
|
|
for(j = 0; j < 64; j++)
|
|
|
|
if(j < value[i]) addch('*'); else addch(' ');
|
|
|
|
}
|
|
|
|
|
|
|
|
refresh();
|
|
|
|
|
|
|
|
key = getch();
|
|
|
|
|
|
|
|
if ((key == '+') || (key == '=')) aout++;
|
|
|
|
else if ((key == '-') || (key == '_')) aout--;
|
|
|
|
else if (key != -1) break;
|
|
|
|
}
|
|
|
|
|
|
|
|
endwin();
|
|
|
|
|
|
|
|
i2cClose(handle);
|
|
|
|
|
|
|
|
gpioTerminate();
|
|
|
|
|
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
|