Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // khai bao thu vien
- #include <wiringPi.h>
- #include "hx711.h"
- #include "precisionTiming.h"
- #include <time.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdint.h>
- #include <mysql.h>
- #include <stdlib.h>
- #include <lcd1602.h>
- #include <math.h>
- #define stepPin 17
- #define dirPin 27
- #define enaPin 22
- #define stepperSpeed 2000
- #define stepperStep 200
- #define tarePin 21
- #define feedPin 20
- #define getDataPin 16
- #define buzzerPin 12
- #define sochia -361.0
- //khai bao database
- MYSQL *conn;
- MYSQL_RES *res;
- MYSQL_ROW row;
- char *server = "localhost";
- char *user = "hungdz";
- char *password = "123465"; /* set me first */
- char *database = "database";
- // khai bao bien
- static int DT_PIN = 19;
- static int SCK_PIN = 26;
- static int readValue = 0;
- static int _offset = 0;
- static double _div = 0;
- static long int dropCount = 0;
- static volatile int reading = 0; //Keeps the read data
- static precisionTime_t readAverage = 70; //Keeps the average reading time of a single sample
- static float getMillisDiff (clock_t t1, clock_t t2);
- static float getDistFromTime (float timeDiff);
- static void edge ();
- double initdataremove;
- int storeid;
- char tareCounter = 0;
- char feedCounter = 0;
- char dataCounter = 0;
- double docgiatricannang;
- // Convert
- char *my_itoa(int num, char *str)
- {
- if(str == NULL)
- {
- return NULL;
- }
- sprintf(str, "%d", num);
- return str;
- }
- char *my_dtoa(double numread, char *strread)
- {
- if(strread == NULL)
- {
- return NULL;
- }
- sprintf(strread, "%5.2f", numread);
- return strread;
- }
- //Database Func
- void DataDone(int idofpack)
- {
- char cmd[256]={0};
- printf("%d \n",idofpack);
- sprintf(cmd,"UPDATE store SET status = 'done', dateofpack=NOW() WHERE id = %d",idofpack);
- mysql_query(conn, cmd);
- printf("query okay");
- mysql_close(conn);
- }
- int MysqlGetData()
- {
- int storeid;
- mysql_real_connect(conn, server,user, password, database, 0, NULL, 0);
- mysql_query(conn, "select id from store where status = 'submitted' order by dateofsubmit asc limit 1");
- res = mysql_use_result(conn);
- row = mysql_fetch_row(res);
- storeid=atoi(row[0]);
- mysql_free_result(res);
- return storeid;
- }
- // Button Interrupt
- void tarePressed()
- {
- delay(60);
- if (digitalRead(tarePin)==HIGH)
- {
- Buzzer();
- printf("tare pressed \n");
- tareCounter++;
- }
- }
- void feedPressed()
- {
- delay(60);
- if (digitalRead(feedPin)==HIGH)
- {
- Buzzer();
- printf("Feed pressed \n");
- feedCounter++;
- }
- }
- void dataPressed()
- {
- delay(60);
- if (digitalRead(getDataPin)==HIGH)
- {
- Buzzer();
- printf("Data pressed \n");
- dataCounter++;
- }
- }
- void Buzzer()
- {
- digitalWrite(buzzerPin,HIGH);
- delay(400);
- digitalWrite(buzzerPin,LOW);
- }
- // Stepper Function ----------------------------------------
- void Stepper_Init()
- {
- pinMode(stepPin,OUTPUT);
- pinMode(enaPin,OUTPUT);
- pinMode(dirPin,OUTPUT);
- pinMode(buzzerPin,OUTPUT);
- digitalWrite(enaPin,HIGH);
- digitalWrite(dirPin,HIGH);
- digitalWrite(stepPin,LOW);
- }
- void Rotation(int customdelay)
- {
- digitalWrite(stepPin,HIGH);
- delayMicroseconds(customdelay);
- digitalWrite(stepPin,LOW);
- delayMicroseconds(customdelay);
- }
- void CWOneStepStepper()
- {
- digitalWrite(dirPin,HIGH);
- Rotation(stepperSpeed);
- }
- void CW25StepStepper() // 25 steps func = 45 degree rotation
- {
- digitalWrite(enaPin,LOW);
- digitalWrite(dirPin,HIGH);
- for(int i=0;i<25;i++)
- {
- Rotation(stepperSpeed);
- }
- digitalWrite(enaPin,HIGH);
- }
- // LCD Function -------------------------------------------
- void lcd_i2c_setup()
- {
- int rc;
- rc = lcd1602Init(1, 0x27);
- if (rc)
- {
- printf("Initialization failed; aborting...\n");
- }
- lcd1602SetCursor(0, 0);
- lcd1602WriteString("Initializing..");
- delay(100);
- }
- // Hx711 Function
- void tare()
- {
- int i, rawReading=0;
- int sumtare=0;
- for (i = 0; i < 10; i++)
- {
- rawReading=getRawReading();
- printf ("RAW %d \t", rawReading);
- if(rawReading<5000)
- {
- printf("false data\n");
- i--;
- }
- else
- {
- printf ("GOOD \n");
- sumtare+=rawReading;
- }
- delay(100);
- }
- sumtare/=10;
- printf("Tare RAW %d\n",sumtare);
- char buffertare[20];
- my_itoa(sumtare, buffertare);
- lcd1602Clear();
- delay(100);
- lcd1602SetCursor(0, 0);
- lcd1602WriteString("T:");
- lcd1602WriteString(buffertare);
- setupHX711(sumtare, sochia);
- initdataremove=getReading();
- printf("tare done\n");
- }
- void initHX711 (int dtPin, int sckPin, int offset, double div)
- {
- DT_PIN = dtPin;
- SCK_PIN = sckPin;
- pinMode(DT_PIN, INPUT);
- pinMode(SCK_PIN, OUTPUT);
- wiringPiISR (DT_PIN, INT_EDGE_FALLING, edge);
- setupHX711(offset, div);
- }
- int extendSign (int val)
- {
- if ((val & (1<<23))>0)
- {
- val += 0xFF<<24;
- }
- return val;
- }
- double getReading ()
- {
- int val = extendSign(readValue);
- return (val + _offset)/_div;
- }
- int getRawReading ()
- {
- return extendSign(readValue);
- }
- long getAverageReadingTime ()
- {
- return readAverage;
- }
- long int getDropCount ()
- {
- return dropCount;
- }
- // Callback function called at falling edge on DT_PIN
- static void edge ()
- {
- if (!reading && !digitalRead(DT_PIN))
- {
- // printf("Reading \n");
- precisionTime_t microS = getTimeMicro();
- reading = 1;
- int read = 0;
- int i;
- precisionDelayMicro (1);
- for (i = 0; i < 24; i++)
- {
- digitalWrite(SCK_PIN,HIGH);
- read <<= 1;
- precisionDelayMicro (1);
- digitalWrite(SCK_PIN,LOW);
- if (digitalRead(DT_PIN)){
- #ifdef DEBUG
- // printf ("%d ", i);
- #endif
- read++;}
- }
- digitalWrite(SCK_PIN,HIGH);
- precisionDelayMicro (1);
- digitalWrite(SCK_PIN,LOW);
- // Calculates the reading time for this sample
- precisionTime_t readTime = getTimeMicro() - microS;
- // Calculates a weighted average through shifts to waste less time
- // It's like doing (readAverage*7 + readTime)/8
- // Probably the copiler would do this as well, but for being sure I used shifts
- readAverage = ((readAverage << 2) + (readAverage << 1) + readAverage + readTime)>>3;
- // This sample is valid if its reading time is less than average + 25% of the average
- int valid = !(readTime > (readAverage + (readAverage>>2)));
- #ifdef DEBUG2
- printf("\nAverage: %lld, Read Time: %lld, valid: %d\n", readAverage, readTime, valid);
- #endif
- if (valid)
- {
- readValue = read;
- }
- else
- {
- dropCount++;
- #ifdef DEBUGDROP
- printf("DROP: %d\n", read);
- #endif
- }
- reading = 0;
- }
- }
- void setupHX711 (int offset, double div)
- {
- _offset = offset;
- _div = div;
- }
- void feed (void)
- {
- int feedreading=0;
- do
- {
- CW25StepStepper();
- lcd1602SetCursor(10, 0);
- lcd1602WriteString(" ");
- delay(300);
- docgiatricannang=getReading();
- feedreading=docgiatricannang-initdataremove;
- printf("reading %d\n",feedreading);
- lcd1602SetCursor(10, 0);
- lcd1602WriteString("W:");
- char bufferfeed[20];
- my_itoa(feedreading,bufferfeed);
- lcd1602WriteString(bufferfeed);
- }
- while(feedreading<1000);
- lcd1602SetCursor(0, 0);
- lcd1602WriteString(" ");
- lcd1602SetCursor(0, 0);
- lcd1602WriteString("Done");
- printf("Feed done\n");
- }
- // Main
- int main (void)
- {
- wiringPiSetupGpio();
- conn = mysql_init(NULL);
- Stepper_Init();
- lcd_i2c_setup();
- initHX711(19, 26, 10000, sochia);
- tare();
- wiringPiISR(tarePin, INT_EDGE_RISING, &tarePressed);
- wiringPiISR(feedPin, INT_EDGE_RISING, &feedPressed);
- wiringPiISR(getDataPin, INT_EDGE_RISING, &dataPressed);
- while(1)
- {
- if(tareCounter>1)
- {
- lcd1602SetCursor(0, 1);
- lcd1602WriteString(" ");
- lcd1602SetCursor(0, 1);
- lcd1602WriteString("SETTING ZEROS...!");
- tare();
- tareCounter = 0;
- }
- if(dataCounter>1)
- {
- int processingid;
- processingid=MysqlGetData();
- printf("%d \n",processingid);
- char processingidconverted[20];
- my_itoa(processingid,processingidconverted);
- lcd1602SetCursor(0, 0);
- lcd1602WriteString(" ");
- lcd1602SetCursor(0, 1);
- lcd1602WriteString(" ");
- lcd1602SetCursor(0, 0);
- lcd1602WriteString("Feed Mode! ID:");
- lcd1602WriteString(processingidconverted);
- lcd1602SetCursor(0, 1);
- lcd1602WriteString("Pr feed to continue");
- printf("press feed button to continue");
- while(feedCounter<1) {
- delay(1000);
- }
- lcd1602SetCursor(0, 1);
- lcd1602WriteString(" ");
- lcd1602SetCursor(0, 1);
- lcd1602WriteString("FEEDING...!");
- feed();
- DataDone(processingid);
- printf("okay\n");
- feedCounter=0;
- dataCounter=0;
- lcd1602SetCursor(0, 0);
- lcd1602WriteString(" ");
- lcd1602SetCursor(0, 0);
- lcd1602WriteString("Scale Mode");
- }
- docgiatricannang=getReading();
- docgiatricannang-=initdataremove;
- printf("reading values: %5.2f, rawReading values %d\n",docgiatricannang,getRawReading());
- delay(1000);
- char getReadingMain[20];
- my_dtoa(docgiatricannang,getReadingMain);
- lcd1602SetCursor(0,1);
- lcd1602WriteString(" ");
- lcd1602SetCursor(0,1);
- lcd1602WriteString(getReadingMain);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement