diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..75b8a299c85661f3c6e173e9e14fadf99a68a678 Binary files /dev/null and b/.DS_Store differ diff --git a/mainPI/Server.c b/mainPI/Server.c new file mode 100644 index 0000000000000000000000000000000000000000..77554dea6dde683f5a5f6c6da6ce30dd06707d39 --- /dev/null +++ b/mainPI/Server.c @@ -0,0 +1,395 @@ +#include <sys/stat.h> +#include <sys/types.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <arpa/inet.h> +#include <sys/socket.h> +#include <pthread.h> +#include "gpio.h" +#include "lcd.h" +#include <signal.h> + +#define IN 0 +#define OUT 1 +#define LOW 0 +#define HIGH 1 +#define PIN 20 +#define POUT 21 + +#define BUFFER_MAX 45 +#define DIRECTION_MAX 45 +#define VALUE_MAX 256 + +#define LCD_LINE_1 0X80 // LCD RAM ADDRESS FOR THE 1ST LINE +#define LCD_LINE_2 0xC0 // LCD RAM address for the 2nd line +#define LCD_LINE_3 0x94 // LCD RAM address for the 3rn line +#define LCD_LINE_4 0xD4 // LCD RAM address for the 4th line + +#define bool _Bool +#define false 0 +#define true 1 + +int clk_timer[6]; +bool pressure_flag = false; +bool is_timer_started = false; +char send_sig[16]; +int act_socket; +bool switch_count = false; + +int sensor_socket; + +void increase_time(){ + clk_timer[5]++; + if(clk_timer[5] == 10){ + clk_timer[5] = 0; + clk_timer[4]++; + } + if(clk_timer[4] == 6){ + clk_timer[4] = 0; + clk_timer[3]++; + } + if(clk_timer[3] == 10){ + clk_timer[3] = 0; + clk_timer[2]++; + } + if(clk_timer[2] == 6){ + clk_timer[2] = 0; + clk_timer[1]++; + } + if(clk_timer[1] == 10){ + clk_timer[1] = 0; + clk_timer[0]++; + } + +} +void error_handling(char *message){ + fputs(message,stderr); + fputc('\n',stderr); + exit(1); +} + +void exit_handler(int sig){ + close(act_socket); + printf(" sensing PI exit\n"); + exit(1); +} + +void exit_handler2(int sig){ + close(sensor_socket); + printf(" sensing PI exit\n"); + exit(1); +} + +void lcd_timer(){ + char out_time[8]; + while(1){ + sprintf(out_time,"%d%d:%d%d:%d%d",clk_timer[0],clk_timer[1],clk_timer[2],clk_timer[3],clk_timer[4],clk_timer[5],clk_timer[6],clk_timer[7]); + lcd_string("Studying...",LCD_LINE_1); + lcd_string(out_time,LCD_LINE_2); + if(pressure_flag && switch_count)increase_time(); + sleep(1); + } +} +void act_init(int port_num,char addr[]){ + int sock; + struct sockaddr_in actu_addr; + char msg[2]; + char on[2] = "1"; + int str_len; + int light = 0; + + sock = socket(PF_INET,SOCK_STREAM,0); + act_socket = sock; + //printf("%d\n",sock); + memset(&actu_addr, 0, sizeof(actu_addr)); + actu_addr.sin_family = AF_INET; + // printf("hello\n"); + actu_addr.sin_addr.s_addr = inet_addr(addr); + // printf("%d\n",port_num); + actu_addr.sin_port = htons(port_num); + // printf("1111\n"); + printf("Connecting to Actuator Pi....\n"); + if(connect(sock,(struct sockaddr *)&actu_addr,sizeof(actu_addr))==-1){ + error_handling("connect() error"); + } + printf("Successfully Connected to Actuator Pi\n"); +} +void send_actuator(){ + + // printf("in send\n"); + char msg[16]; + // sprintf(msg,"%d",send_sig); + printf("send to actuator : %s\n",send_sig); + int ret = write(act_socket,send_sig,sizeof(send_sig)); + if(ret == -1){ + printf("Write failed..\n"); + } + // printf("11\n"); + usleep(500*100); + sleep(2); +} + +void buttonRead(){ + int repeat = 10000; + int state = 1; + int prev_state = 0; + int light = 0; + + //Enable GPIO pins + if (-1 == GPIOExport(PIN) || -1 == GPIOExport(POUT)) + return (1); + //Set GPIO directions + if (-1 == GPIODirection(PIN, IN) || -1 == GPIODirection(POUT, OUT)) + return (2); + if (-1 == GPIOWrite(POUT, 1)) + return (3); + + + do{ + // if( -1 == GPIOWrite(POUT2,1)){ + // return 3; + // } + GPIORead(PIN); + // printf("I'm reading %d in GPIO %d\n", GPIORead(PIN), PIN); + int count = 0; + if(GPIORead(PIN) != 1){ // 버튼이 눌리지 않은 상태, 불은 꺼져있음 + while(GPIORead(PIN) != 1){ + // printf("waiting for %d\n", state); + // 버튼이 눌려있는 상태, 불은 꺼져있음 + continue; + } + // GPIOWrite(POUT,state); // 불을 켠다 + char led_on[2]; + sprintf(led_on,"%d",1); + int ret = write(sensor_socket,led_on,sizeof(led_on)); + if(switch_count){ + switch_count = false; + } + else{ + for(int i=0;i<6;i++){ + clk_timer[i] = 0; + } + printf("Program Start with invoking Sensor Pi.\n"); + switch_count = true; + } + usleep(100000); + int temp = state; + state =prev_state; + prev_state = temp; + + } + usleep(100000); + } + while(repeat--); + + if(-1 == GPIOUnexport(POUT) || -1 == GPIOUnexport(PIN)){ + return; + } +} + + +int main(int argc, char *argv[]) +{ + clk_timer[0] = 0; + clk_timer[1] = 0; + clk_timer[2] = 0; + clk_timer[3] = 0; + struct result{ + int distance; + int light; + int press; + }; + int state = 1; + int prev_state = 1; + int light = 0; + + signal(SIGINT, exit_handler); + signal(SIGINT, exit_handler2); + + char lcd_out[20]; + + int serv_sock, clnt_sock = -1; + struct sockaddr_in serv_addr, clnt_addr; + socklen_t clnt_addr_size; + char msg[2]; + pthread_t p_thread[2]; + // 여기 활성화 해야함!!!! + act_init(atoi(argv[2]),argv[3]); + int button_read = pthread_create(&p_thread[1], NULL, buttonRead, NULL); + // printf("%d\n",button_read); + + bus_open(); + lcd_init(); + sleep(2); + //Enable GPIO pins + if (-1 == GPIOExport(PIN) || -1 == GPIOExport(POUT)) + return (1); + //Set GPIO directions + if (-1 == GPIODirection(PIN, IN) || -1 == GPIODirection(POUT, OUT)) + return (2); + if (-1 == GPIOWrite(POUT, 1)) + return (3); + + // if (argc != 2) + // { + // printf("Usage : %s <port>\n", argv[0]); + // } + + serv_sock = socket(PF_INET, SOCK_STREAM, 0); + if (serv_sock == -1) + error_handling("socket() error"); + + memset(&serv_addr, 0, sizeof(serv_addr)); + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); + serv_addr.sin_port = htons(atoi(argv[1])); + + if (bind(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) + error_handling("bind() error"); + if (listen(serv_sock, 5) == -1) + error_handling("listen() error"); + printf("Connected to Sensor Pi...\n"); + if (clnt_sock < 0) + { + clnt_addr_size = sizeof(clnt_addr); + clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_addr, + &clnt_addr_size); + sensor_socket = clnt_sock; + if (clnt_sock == -1) + error_handling("accept() error"); + } + printf("Successfully Connected to Sensor Pi...\n"); + char rec_msg[2]; + int oxygen_cnt = 0; + int light_cnt = 0; + int temp_cnt = 0; + int humid_cnt = 0; + while (1) + { + state = GPIORead(PIN); + + int result[15]; + int retor = read(clnt_sock,result,sizeof(result)); + if(retor == -1) printf("read failed\n"); + // else printf("read success\n"); + // printf("%d %d %d\n", ptr->light, ptr->distance, ptr->press); + // 0 : press, 1 : distance, 2 : light 3: temp 4 : humid + // sprintf(lcd_out, "%d %d %d", result[0],result[1],result[2]); + printf("pressure : %d, oxygen: %d, light : %d, temp : %d , humidity : %d\n", result[0], result[1], result[2], result[3], result[4]); + if(result[0] >400 && !pressure_flag){ + if(!is_timer_started){ + is_timer_started = true; + int check_timer_thread = pthread_create(&p_thread[0], NULL, lcd_timer, NULL); + } + pressure_flag = true; + } + else if(result[0] <=0){ + pressure_flag = false; + } + + // Low oxygen -> turn on acuator + // printf("is it zero?\n"); + + if(result[1]<=50 && oxygen_cnt == 0){ + //send_sig = result[1]; + // printf("Distance %d\n", send_sig); + oxygen_cnt = 3; + if(result[1]>=0 && result[1] <=15){ + sprintf(send_sig,"Low oxygen:10%%"); + send_actuator(); + } + else{ + sprintf(send_sig,"Low oxygen:30%%"); + send_actuator(); + } + + } + else if(oxygen_cnt>=1){ + oxygen_cnt --; + } + + //Light + if(result[2] >=0 && light_cnt == 0){ + // printf("light here\n"); + if(result[2] >=0 && result[2] <= 100){ + light_cnt = 3; + sprintf(send_sig,"Brightness:10%%"); + send_actuator(); + } + if(result[2] >=100 && result[2] <= 200){ + light_cnt = 3; + sprintf(send_sig,"Brightness:20%%"); + send_actuator(); + } + if(result[2] >=700 && result[2] <= 800){ + light_cnt = 3; + sprintf(send_sig,"Brightness:80%%"); + send_actuator(); + } + if(result[2] >=800){ + light_cnt = 3; + sprintf(send_sig,"Brightness:90%%"); + send_actuator(); + } + } + else if(light_cnt >=1){ + light_cnt --; + } + + if(result[3] >=0 && temp_cnt == 0){ + temp_cnt = 2; + if(result[3] <=26){ + sprintf(send_sig,"Low Temperture"); + send_actuator(); + } + else if(result[3] >=30){ + sprintf(send_sig,"High Temperture"); + send_actuator(); + } + } + else if(temp_cnt >=1){ + temp_cnt--; + } + + if(result[4] >= 0 && humid_cnt == 0){ + humid_cnt = 2; + if(result[4] <= 55){ + sprintf(send_sig,"Too Dry:80%%"); + send_actuator(); + } + else if(result[4] >55 &&result[4] <= 60){ + sprintf(send_sig, "Too Dry:90%%"); + send_actuator(); + } + else if(result[4] >= 90 && result[4] < 100){ + sprintf(send_sig, "Too Humid:10%%"); + send_actuator(); + } + else if(result[4] >= 100){ + sprintf(send_sig, "Too Humid:20%%"); + send_actuator(); + } + } + else if(humid_cnt >= 1){ + humid_cnt--; + } + + + // if(result[3]) + // lcd_string("prs lght dist", LCD_LINE_2); + // lcd_string(lcd_out,LCD_LINE_1); + // sleep(2); + // printf("3\n + // usleep(50 * 100); + } + printf("while ended\n"); + close(clnt_sock); + close(serv_sock); + //Disable GPIO pins + if (-1 == GPIOUnexport(PIN) || -1 == GPIOUnexport(POUT)) + return (4); + return (0); +} diff --git a/mainPI/gpio.h b/mainPI/gpio.h new file mode 100644 index 0000000000000000000000000000000000000000..0071c9c8509b687dd6fae2fb758d7142de173639 --- /dev/null +++ b/mainPI/gpio.h @@ -0,0 +1,128 @@ +#include <sys/stat.h> +#include <sys/types.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> + + +#define IN 0 +#define OUT 1 +#define LOW 0 +#define HIGH 1 +#define PIN 20 +#define POUT 21 + + +#define BUFFER_MAX 45 +#define DIRECTION_MAX 45 +#define VALUE_MAX 256 + +static int GPIOUnexport(int pin){ + char buffer[BUFFER_MAX]; + ssize_t bytes_written; + int fd; + + fd=open("/sys/class/gpio/unexport",O_WRONLY); + if(-1==fd){ + fprintf(stderr,"falied to pen unexport\n"); + return -1; + } + + bytes_written=snprintf(buffer,BUFFER_MAX,"%d",pin); + write(fd,buffer,bytes_written); + close(fd); + return 0; +} + +static int GPIOExport(int pin){ + + char buffer[BUFFER_MAX]; + ssize_t bytes_written; + int fd; + + fd=open("/sys/class/gpio/export",O_WRONLY); + if(-1==fd){ + fprintf(stderr, "failed export wr"); + return 1; + } + bytes_written=snprintf(buffer,BUFFER_MAX, "%d", pin); + write(fd,buffer,bytes_written); + close(fd); + return 0; +} + + +static int GPIODirection(int pin,int dir){ + static const char s_directions_str[]="in\0out"; + + + char path[DIRECTION_MAX]="/sys/class/gpio/gpio%d/direction"; + int fd; + + snprintf(path, DIRECTION_MAX, "/sys/class/gpio/gpio%d/direction",pin); + + fd=open(path,O_WRONLY); + if(-1==fd){ + fprintf(stderr,"Failed to open gpio direction for writing!\n"); + return -1; + } + + if(-1==write(fd,&s_directions_str[IN == dir ? 0 :3], IN==dir ? 2:3)){ + fprintf(stderr,"failed to set direction!\n"); + return -1; + } + + close(fd); + return 0; +} + + + +static int GPIOWrite(int pin, int value){ + static const char s_values_str[] ="01"; + + char path[VALUE_MAX]; + int fd; + + // printf("write value!\n"); + + snprintf(path,VALUE_MAX, "/sys/class/gpio/gpio%d/value",pin); + fd=open(path,O_WRONLY); + if(-1==fd){ + fprintf(stderr,"failed open gpio write\n"); + return -1; + } + + //0 1 selection + if(1!=write(fd,&s_values_str[LOW==value ? 0:1],1)){ + fprintf(stderr,"failed to write value\n"); + return -1; + } + close(fd); + return 0; +} + +static int GPIORead(int pin){ + char path[VALUE_MAX]; + char value_str[3]; + int fd; + + snprintf(path, VALUE_MAX, "/sys/class/gpio/gpio%d/value",pin); + fd=open(path, O_RDONLY); + if(-1==fd){ + fprintf(stderr,"failed to open gpio value for reading\n"); + return -1; + } + + if(-1==read(fd,value_str,3)){ + fprintf(stderr,"failed to read val\n"); + return -1; + } + close(fd); + + return(atoi(value_str)); +} + + diff --git a/mainPI/lcd.h b/mainPI/lcd.h new file mode 100644 index 0000000000000000000000000000000000000000..f5e618c3d47863e5b5f59432729977165a6b5e19 --- /dev/null +++ b/mainPI/lcd.h @@ -0,0 +1,169 @@ +#include <unistd.h> +#include <fcntl.h> +#include <sys/ioctl.h> +#include <linux/i2c-dev.h> +#include <stdio.h> +#include <string.h> + + +/* + Reference Python Code for i2c: https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/lcd_i2c.py + Reference C Code for i2c bus opening : https://raspberry-projects.com/pi/programming-in-c/i2c/using-the-i2c-interface +*/ + +#define I2C_ADDR 0x27 +#define LCD_WIDTH 16 + +#define LCD_CHR 1 // sending data +#define LCD_CMD 0 // sending command + +// #define LCD_LINE_1 0X80 // LCD RAM ADDRESS FOR THE 1ST LINE +// #define LCD_LINE_2 0xC0 // LCD RAM address for the 2nd line +// #define LCD_LINE_3 0x94 // LCD RAM address for the 3rn line +// #define LCD_LINE_4 0xD4 // LCD RAM address for the 4th line + +#define LCD_BACKLIGHT 0x08 // ON +// #define LCD_BACKLIGHT = 0x00 //OFF + +#define ENABLE 0b00000100 // ENABLE BIT + +//Timing constants +#define E_PULSE 0.0005 +#define E_DELAY 0.0005 + + +int file_i2c; +int length; +unsigned char buffer[60] = {0}; +unsigned char text_buffer[15] = {0}; + + + + +void bus_open(){ + //OPEN I2C BUS + char *filename = (char*)"/dev/i2c-1"; + if((file_i2c = open(filename, O_RDWR)) < 0){ + //ERROR + printf("Failed to open i2c bus"); + return; + } + + // int addr = 0x5a; + if(ioctl(file_i2c, I2C_SLAVE, I2C_ADDR) < 0) + { + printf("Failed to acquire bus access and / or talk to slave. \n"); + //ERROR HANDLING; you can check errno to see what went wrong + return; + } + +} + +void bus_read(){ + //------ READ BYTES ------- + length = 4; + if(read(file_i2c, buffer, length) != length) + { + //ERROR + printf("Failed to read from the i2c bus.\n"); + } + else{ + printf("Data read: %s\n",buffer); + } +} + +void bus_write_bit(int write_bit){ + // WRITE BYTES + buffer[0] = write_bit; + length = 1; + if(write(file_i2c,buffer,length) != length) + { + //ERRPR + printf("Failed to write to the i2c bus.\n"); + } +} + +void bus_write_text(char character){ + // WRITE BYTES + text_buffer[0] = character; + length = 1; + if(write(file_i2c,text_buffer,length) != length) + { + //ERRPR + printf("Failed to write to the i2c bus.\n"); + } +} +void lcd_toggle_enable(int bits){ + sleep(E_DELAY); + bus_write_bit(bits | ENABLE); + + sleep(E_PULSE); + bus_write_bit(bits & ~ENABLE); + + sleep(E_DELAY); +} + + +void lcd_byte(char bits, int mode){ + // send byte to data pins + // bits = data + // mode 1 for data, 0 for command + // 데이터를 4 비트 씩 쪼개서 전송한다! 따라서 비트마스킹 필요함 + + char bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT; + char bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT; + + // High bits + bus_write_text(bits_high); + lcd_toggle_enable(bits_high); + + bus_write_text(bits_low); + lcd_toggle_enable(bits_low); +} + +void lcd_init(){ + lcd_byte(0x33,LCD_CMD); + lcd_byte(0x32, LCD_CMD); + lcd_byte(0x06, LCD_CMD); + lcd_byte(0x0C, LCD_CMD); + lcd_byte(0x28, LCD_CMD); + lcd_byte(0x01, LCD_CMD); + + sleep(E_DELAY); +} + + + + +void lcd_string(char *message, char line){ + // Send string to display + lcd_byte(line,LCD_CMD); + + for(int i = 0 ; i < strlen(message); i ++){ + lcd_byte(message[i],LCD_CHR); + } + for(int i = strlen(message);i < LCD_WIDTH;i++){ + lcd_byte(' ',LCD_CHR); + } + +} + +// int main(){ +// bus_open(); +// lcd_init(); +// sleep(2); + +// lcd_string(" HELLO WORLD!!!", LCD_LINE_1); +// lcd_string("I'M RASPBERRY PI",LCD_LINE_2); + +// sleep(5); + +// lcd_string("LET'S ROCK",LCD_LINE_1); +// lcd_string("LETS ROLLLL", LCD_LINE_2); + +// sleep(5); + +// return 0; +// } + +