晾晒谷物收获机自动化代码开源留存(1)
本文涉及代码他人无借鉴价值,仅作本人代码备份使用
该代码为两个单片机联机使用,本系列共三个部分,包括:主单片机代码(1),从单片机代码(2),传感器自建库代码(3)。部分可从网络直接下载的库代码不做说明。
设备工作时序
主机代码(main)
以下为主机代码,为第四代修改代码。
/********************************************/
//串口0:电脑显示
//串口1:两个单片机之间的通信
//串口2:蓝牙之间的通信
//串口3:WiFi模块通信
//定时器2中断:实时获取重量,接收蓝牙信号
//定时器3中断:接收WiFi信号,发送WiFi信号
/********************************************/
#include <Wire.h>
#include <LCD12864RSPI.h> //调用LCD显示屏的库
#include <Keypad.h> //调用4x4软键盘的库
#include "HX711.h" //调用根目录下称重模块的库
#include "Modbus_TCP.h" //调用WiFi模块库
#include <FlexiTimer2.h> //调用定时器的库
#include <Servo.h> //调用舵机的库
Modbus_Tcp modbus_tcp; //实例化Modbus_Tcp
short modbusData[modbusDataSize] = {}; //建立modbus数据库
int BH1750address = 0x23;
byte buff[2];
Servo F_servo; //声明封袋舵机
Servo D_servo; //声明倒物舵机
#define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )
/* 储存舵机角度 */
#define F_servo_kai 103
#define F_servo_guan 145
#define D_servo_zheng 187
#define D_servo_dao 60
/* 储存步进电机步数 */
int F_STEP;
int D_STEP = 19000;
int S_STEP = 5700;
/* 储存步进电机速度 */
int F_SPEED = 200;
int D_SPEED = 200;
int S_SPEED = 200;
const byte ROWS = 4;
const byte COLS = 4;
/* 端口定义 */
#define BUZZER 38
#define LED 40
#define fangdai_stepper_CLK 4
#define fangdai_stepper_DIR 30 //HIGH放袋
#define daopian_stepper_CLK 2
#define daopian_stepper_DIR 34 //HIGH出,LOW收
//#define sigang_stepper_CLK 3
//#define sigang_stepper_DIR 32 //HIGH出,LOW收
#define sigang_stepper_CLK 9
#define sigang_stepper_DIR 35 //HIGH出,LOW收
#define jidianqi 46
LCD12864RSPI LCDA(A1, A2, A3); //LCD端口定义
byte rowPins[ROWS] = {22, 23, 24, 25}; //行针脚连接的接口
byte colPins[COLS] = {26, 27, 28, 29}; //列的针脚连接的接口
char hexaKeys[ROWS][COLS] = { //储存4x4软键盘数字位置
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
Keypad kpd = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
/* 变量定义 */
int weight; //定义设置的标准重量,初始化为0
int val; //定义按键后输入的char转换为int
char Keys; //定义按键后输入的char
unsigned int weight_timer; //定义定时器实时获取的称重模块重量
int jinru = 0; //蓝牙模块输入数字时的等待标志位
char bluetooth; //蓝牙获取到的字符
char get_WiFi; //WiFi获取到的字符
int comInt_wifi; //WiFi串口输出的int型数据储存
int comInt_bluetooth; //蓝牙串口输出的int型数据储存
int state; //储存状态
char Send[5];
int timer3_counter; //定义定时器3变量
int cishu; //定义定时器3进入的次数
/* lcd12864字符串 */
unsigned char guige[] = {
0xB9, 0xE6,
0xB8, 0xF1,
0xA3, 0xBA
}; //规格:�
unsigned char kemeidai[] = {
0xBF, 0xCB,
0x2F, 0x00,
0xB4, 0xFC
}; //克/袋�
unsigned char xiaodai[] = {
0xD0, 0xA1,
0xB4, 0xFC,
0x20, 0x00,
0x20, 0x00
}; //小袋
unsigned char zhongdai[] = {
0xD6, 0xD0,
0xB4, 0xFC,
0x20, 0x00,
0x20, 0x00
}; //中袋
unsigned char dadai[] = {
0xB4, 0xF3,
0xB4, 0xFC,
0x20, 0x00,
0x20, 0x00
}; //大袋
unsigned char chaodadai[] = {
0xB3, 0xAC,
0xB4, 0xF3,
0xB4, 0xFC
}; //超大袋
unsigned char daizi[] = {
0xB4, 0xFC,
0xD7, 0xD3,
0xA3, 0xBA
}; //袋子:
unsigned char dangqianzhongliang[] = {
0xB5, 0xB1,
0xC7, 0xB0,
0xD6, 0xD8,
0xC1, 0xBF,
0xA3, 0xBA
}; //当前重量:
unsigned char ke[] = {
0xBF, 0xCB
}; //克
unsigned char mubiaodadao[] = {
0xC4, 0xBF,
0xB1, 0xEA,
0xB4, 0xEF,
0xB5, 0xBD,
0xA3, 0xA1
}; //目标达到!
unsigned char zhengzaizhuangdai[] = {
0xD5, 0xFD,
0xD4, 0xDA,
0xD7, 0xB0,
0xB4, 0xFC,
0xA1, 0xAD,
0xA1, 0xAD
}; //正在装袋……
unsigned char tjau[] = // 天津农学院
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x02, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
0x0C, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x00,
0x1E, 0x3F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xF0, 0x00,
0x0E, 0x21, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xC0, 0x00,
0x0C, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
0x00, 0xFF, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
0x31, 0xFB, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
0x70, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x58, 0x00,
0xF0, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xF8, 0x00,
0xF0, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xF0, 0x00,
0x60, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xC0, 0x00,
0x00, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00,
0x0C, 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x1C, 0x00, 0x00,
0x08, 0x6F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00,
0x08, 0x13, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x80, 0x00,
0x38, 0x7F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xE0, 0x00,
0x79, 0xFF, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xF8, 0x00,
0x38, 0xF3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x7F, 0x00,
0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x3F, 0xC0,
0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0xC0,
0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xFC,
0x70, 0x00, 0x02, 0x01, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x7C,
0xC0, 0x00, 0x1F, 0x03, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0xC9,
0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0xDC, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7F, 0x81, 0xF0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x77, 0xFE, 0x00, 0x00, 0x01,
0x7C, 0x00, 0x43, 0x1F, 0xF8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0xCE, 0x00, 0x01, 0x1F,
0xFE, 0x00, 0x06, 0x3E, 0xB8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0x1C, 0x00, 0x03, 0xFF,
0xCC, 0x00, 0x3C, 0x70, 0x30, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xEE, 0x3C, 0x00, 0x07, 0xF8,
0x1C, 0x00, 0x3E, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0xCC, 0x18, 0x00, 0x07, 0x00,
0xC0, 0x00, 0x67, 0x67, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xD8, 0x20, 0x00, 0x0E, 0x0F,
0xE0, 0x00, 0x43, 0x07, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x0E, 0x3E,
0x60, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x38, 0x18, 0x00, 0x04, 0x70,
0xC0, 0x00, 0xC2, 0x09, 0xC0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x78, 0x3C, 0x00, 0x00, 0x61,
0x80, 0x00, 0xCE, 0x1F, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x7C, 0x30, 0x00, 0x00, 0x03,
0x80, 0x00, 0xDC, 0x3B, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xDF, 0x00, 0x00, 0x00, 0x07,
0xF0, 0x00, 0xC0, 0x72, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0xBF, 0xC0, 0x00, 0x00, 0x3F,
0xF8, 0x00, 0xC0, 0xC6, 0x08, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0xB3, 0xFF, 0x80, 0x00, 0x7F,
0xF0, 0x00, 0xC0, 0x0E, 0x0E, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x30, 0xFF, 0xC0, 0x00, 0x7F,
0xC0, 0x00, 0x40, 0x1F, 0x06, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x38, 0x1F, 0x00, 0x00, 0x00,
0xC0, 0x00, 0x40, 0x3F, 0x9C, 0x00, 0x00, 0x00,
0x00, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x60, 0x63, 0xF8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x08, 0x1F, 0x80, 0x00, 0x00, 0x03,
0x00, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x1E,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x1C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
/* ——定时器3中断执行程序 */
ISR(TIMER3_OVF_vect) //常规中断服务
{
TCNT3 = timer3_counter; //预加载 timer
if(cishu%5 == 0)
{
Send_WIFI();
for(int i=0;i<6;i++)
{
Serial3.write(Send[i]);
}
}
cishu ++;
if(cishu > 65000){cishu = 0;}
}
/* ——定时器2中断执行程序 */
void Timer_Get_Weight()
{
GET_WiFi();
Weight_Timer();
GET_BlueTooth();
/*****手机app显示的数据*****/
Serial.print("额定重量:");
Serial.print(weight);
Serial.print("当前实时重量:");
Serial.print(weight_timer);
Serial.print("当前状态:");
Serial.println(state);
}
void GET_WiFi()
{
while (Serial3.available())
{
get_WiFi = Serial3.read();
Serial1.write(get_WiFi);
if (get_WiFi == 'X')
{
comInt_wifi = Serial3.parseInt();
weight = comInt_wifi;
}
}
}
void Send_WIFI()
{
// weight=random(100,999);
int weight_ge = (weight_timer%10) + '0';
int weight_bai = (weight_timer/100) + '0';
int weight_shi = ((weight_timer%100)/10) + '0';
state = state + '0';
Send[0] = '#';
Send[1] = weight_bai;
Send[2] = weight_shi;
Send[3] = weight_ge;
Send[4] = '#';
Send[5] = state;
}
void GET_BlueTooth() //蓝牙执行程序
{
while (Serial2.available())
{
bluetooth = Serial2.read();
Serial1.write(bluetooth);
if (bluetooth == 'X')
{
comInt_bluetooth = Serial2.parseInt();
weight = comInt_bluetooth;
}
else if (bluetooth == '+') //重量+10g
{
weight += 10;
}
else if (bluetooth == '-') //重量-10g
{
weight -= 10;
}
}
}
void RESET()
{
F_servo.write(F_servo_kai); // 舵机角度初始化
delay(1000);
D_servo.write(D_servo_zheng);
delay(3000);
}
/* 步进电机的计步移动 */
void Fangdai_Stepper() //放袋步进电机
{
for (F_STEP; F_STEP > 0; F_STEP--)
{
digitalWrite(fangdai_stepper_CLK, HIGH);
delayMicroseconds(F_SPEED);
digitalWrite(fangdai_stepper_CLK, LOW);
delayMicroseconds(F_SPEED);
}
}
void Daopian_Stepper() //刀片步进电机
{
for (D_STEP = 19000; D_STEP > 0; D_STEP--)
{
digitalWrite(daopian_stepper_CLK, HIGH);
delayMicroseconds(D_SPEED);
digitalWrite(daopian_stepper_CLK, LOW);
delayMicroseconds(D_SPEED);
}
}
void Sigang_Stepper() //丝杠步进电机
{
for (S_STEP = 5700; S_STEP > 0; S_STEP--)
{
digitalWrite(sigang_stepper_CLK, HIGH);
delayMicroseconds(S_SPEED);
digitalWrite(sigang_stepper_CLK, LOW);
delayMicroseconds(S_SPEED);
Serial.print("丝杠");
}
}
/*设置重量的主要函数*/
void Set_Weight_main()
{
RESET(); //复位
/* 显示屏初始化 */
LCDA.clear();
delay(500);
LCDA.clear();
weight = 0; //设置的重量清零
Set_Weight(); //开始设置重量
Weight_Timer(); //定时器实时获取称重模块的重量
Reach_the_goal(); //达到目标后,执行后续程序
}
void Set_Weight() //该函数的目的就是:设置一个三位数的额定重量值,根据设置的重量的范围设置袋子的种类,最后给额定重量weight赋值。。。设置重量的时候涉及到显示屏的显示,也写在里面
{
int num = 3;
int flog = 0;
Keys = kpd.getKey(); //从库里面获取键盘的输入值
/*
字符转数值�
A ---- 17
B ---- 18
C ---- 19
D ---- 20
* ---- -6
# ---- -13
*/
val = Keys - '0';
LCDA.setCursor(0,0);
LCDA.chinese(guige,AR_SIZE(guige)); // 规格:
LCDA.setCursor(0,5);
LCDA.chinese(kemeidai,AR_SIZE(kemeidai)); // 克/袋
if (val == -6)
{
int A = 0,B = 0,C = 0;
LCDA.clear();
LCDA.setCursor(0,0);
LCDA.chinese(guige,AR_SIZE(guige)); // 规格:
LCDA.setCursor(0,5);
LCDA.chinese(kemeidai,AR_SIZE(kemeidai)); // 克/袋
while(flog == 0)
{
LCDA.setCursor(1,3);
LCDA.print(A);
LCDA.setCursor(1,4);
LCDA.print(B);
LCDA.setCursor(1,5);
LCDA.print(C);
Serial.print(val);
Keys = kpd.getKey();
val = Keys - '0';
if (Keys)
{
if (val == 0)
{
if (num%3 == 0){A = 0;num++;}
else if (num%3 == 1){B = 0;num++;}
else {C = 0;num++;}
}
if (val == 1)
{
if (num%3 == 0){A = 1;num++;}
else if (num%3 == 1){B = 1;num++;}
else {C = 1;num++;}
}
if (val == 2)
{
if (num%3 == 0){A = 2;num++;}
else if (num%3 == 1){B = 2;num++;}
else {C = 2;num++;}
}
if (val == 3)
{
if (num%3 == 0){A = 3;num++;}
else if (num%3 == 1){B = 3;num++;}
else {C = 3;num++;}
}
if (val == 4)
{
if (num%3 == 0){A = 4;num++;}
else if (num%3 == 1){B = 4;num++;}
else {C = 4;num++;}
}
if (val == 5)
{
if (num%3 == 0){A = 5;num++;}
else if (num%3 == 1){B = 5;num++;}
else {C = 5;num++;}
}
if (val == 6)
{
if (num%3 == 0){A = 6;num++;}
else if (num%3 == 1){B = 6;num++;}
else {C = 6;num++;}
}
if (val == 7)
{
if (num%3 == 0){A = 7;num++;}
else if (num%3 == 1){B = 7;num++;}
else {C = 7;num++;}
}
if (val == 8)
{
if (num%3 == 0){A = 8;num++;}
else if (num%3 == 1){B = 8;num++;}
else {C = 8;num++;}
}
if (val == 9)
{
if (num%3 == 0){A = 9;num++;}
else if (num%3 == 1){B = 9;num++;}
else {C = 9;num++;}
}
if (val == -6)
{
num = 3;
A = 0;
B = 0;
C = 0;
}
if (val == -13)
{
flog = 1;
}
weight = A*100 + B*10 + C; // 计算重量
}
}
}
if (val == -13)
{
LCDA.clear();
}
if (val == 17)
{
weight = 150;
}
else if (val == 18)
{
weight = 300;
}
else if (val == 19)
{
weight = 500;
}
else if (val == 20)
{
weight = 800;
}
if (weight <= 150)
{
LCDA.setCursor(1,3);
LCDA.chinese(xiaodai,AR_SIZE(xiaodai));
}
else if (weight <= 300)
{
LCDA.setCursor(1,3);
LCDA.chinese(zhongdai,AR_SIZE(zhongdai));
}
else if (weight <= 500)
{
LCDA.setCursor(1,3);
LCDA.chinese(dadai,AR_SIZE(dadai));
}
else if (weight > 500)
{
LCDA.setCursor(1,3);
LCDA.chinese(chaodadai,AR_SIZE(chaodadai));
}
if(weight > 99)
{
LCDA.setCursor(0,3);
LCDA.print(weight);
}
if (weight <= 99)
{
LCDA.setCursor(0,3);
LCDA.print(weight);
LCDA.setCursor(0,4);
LCDA.print(" ");
}
LCDA.setCursor(1,0);
LCDA.chinese(daizi,AR_SIZE(daizi)); //袋子:
return(weight);
}
void Weight_Timer() //定时器实时获取称重模块获取的重量
{
weight_timer = Get_Weight(); //得到实时的重量值——————等待读取,没有读取到则一直等待
// weight_timer = 123;//调试预设初始值,单片机连接Hx711后删去
LCDA.setCursor(3, 0);
LCDA.chinese(dangqianzhongliang, AR_SIZE(dangqianzhongliang)); //当前重量:
LCDA.setCursor(3, 7);
LCDA.chinese(ke, AR_SIZE(ke)); //克
/* 重量范围 位数不同 分格显示 */
if (weight_timer > 99)
{
LCDA.setCursor(3, 5);
LCDA.print(weight_timer);
}
else if (weight_timer > 9)
{
LCDA.setCursor(3, 5);
LCDA.print(weight_timer);
LCDA.setCursor(3, 6);
LCDA.print(" ");
}
else
{
LCDA.setCursor(3, 5);
LCDA.print(" ");
LCDA.setCursor(3, 5);
LCDA.print(weight_timer);
LCDA.setCursor(3, 6);
LCDA.print(" ");
}
LCDA.setCursor(3, 5);
LCDA.print(weight_timer);
}
void Reach_the_goal() //达到目标后
{
int flog = 0; //while循环标志位
int a = 0; //清一次屏 赋变量
unsigned int temporary = Get_Weight(); //储存临时重量
if (temporary > weight - 5 && temporary < weight + 100 && weight != 0) //判断是否达到设置的额定重量
{
state = 1;
digitalWrite(BUZZER, LOW);
digitalWrite(LED, HIGH);
temporary = Get_Weight();
while (temporary >= weight && flog == 0) //如果实时的重量大于设置的重量,则一直循环
{
temporary = Get_Weight();
if (a == 0) {
LCDA.clear();
a = 1;
}
LCDA.setCursor(0, 1);
LCDA.chinese(mubiaodadao, AR_SIZE(mubiaodadao));
LCDA.setCursor(1, 1);
LCDA.chinese(zhengzaizhuangdai, AR_SIZE(zhengzaizhuangdai));
/* 不同的位数在不同的格子显示 */
if (weight > 99)
{
LCDA.setCursor(3, 5);
LCDA.print(weight);
}
else if (weight > 9)
{
LCDA.setCursor(3, 5);
LCDA.print(weight);
LCDA.setCursor(3, 6);
LCDA.print(" ");
}
else
{
LCDA.setCursor(3, 5);
LCDA.print(weight);
LCDA.setCursor(3, 6);
LCDA.print(" ");
}
LCDA.setCursor(3, 0);
LCDA.chinese(dangqianzhongliang, AR_SIZE(dangqianzhongliang)); //当前重量:
LCDA.setCursor(3, 7);
LCDA.chinese(ke, AR_SIZE(ke)); //克
Keys = kpd.getKey();
val = Keys - '0';
Packing();
if (temporary < weight) {
flog = 1;
digitalWrite(BUZZER, HIGH);
digitalWrite(LED, LOW);
LCDA.clear();
return;
}
if (val == -6) {
digitalWrite(BUZZER, HIGH);
digitalWrite(LED, LOW);
LCDA.clear();
weight = 0;
return;
}
flog = 1;
digitalWrite(BUZZER, HIGH); //复位
digitalWrite(LED, LOW);
LCDA.clear();
}
a = 0;
}
}
void Packing() //包装的一系列程序
{
state = 1;
F_servo.write(F_servo_guan);
delay(1000);
digitalWrite(fangdai_stepper_DIR, HIGH);
if (weight <= 150)
{
F_STEP = 800;
}
else if (weight <= 300)
{
F_STEP = 1600;
}
else if (weight <= 500)
{
F_STEP = 2400;
}
else if (weight > 500)
{
F_STEP = 3200;
}
Fangdai_Stepper();
delay(500);
D_servo.write(D_servo_dao);
delay(2000);
/* 丝杠缩回,使加热板贴合 */
digitalWrite(sigang_stepper_DIR, LOW);
Sigang_Stepper();
// S_STEP = 5700;
/*继电器控制电阻丝通电加热*/
digitalWrite(jidianqi, HIGH);
delay(4000);
digitalWrite(jidianqi, LOW);
/*刀片走刀*/
digitalWrite(daopian_stepper_DIR, HIGH);
Daopian_Stepper();
delay(100);
digitalWrite(daopian_stepper_DIR, LOW);
Daopian_Stepper();
delay(100);
/*丝杠伸出,离开加热板*/
digitalWrite(sigang_stepper_DIR, HIGH);
Sigang_Stepper();
// S_STEP = 5700;
/*舵机复位*/
D_servo.write(D_servo_zheng);
delay(1000);
F_servo.write(F_servo_kai);
delay(3000);
Init_Hx711(); //初始化称重模块
Get_chushi(); //得到称重模块初始值——————等待读取,没有读取到则一直等待
S_STEP = 1000; //加热步进电机步数复位
D_STEP = 19000; //走刀步进电机步数复位
delay(1000);
}
void setup()
{
/************配置定时器3***************/
noInterrupts(); //禁止所有中断
TCCR3A = 0;
TCCR3B = 0;
timer3_counter = 34286; //预加载timer1为 65536-16MHz/256/50HZ
TCNT3 = timer3_counter; //预加载 timer
TCCR3B |= (1 << CS12); //256 分频器(256 prescaler?)
TIMSK3 |= (1 << TOIE3); //启用定时器溢出中断
interrupts(); //允许所有中断
F_servo.attach(8); //舵机端口定义 //黄色线
D_servo.attach(7); //蓝色线
F_servo.write(F_servo_kai); // 舵机角度初始化
delay(500);
D_servo.write(D_servo_zheng);
delay(500);
/* 设置端口为输入或者输出模式 */
pinMode(BUZZER, OUTPUT);
pinMode(LED, OUTPUT);
pinMode(fangdai_stepper_CLK, OUTPUT);
pinMode(fangdai_stepper_DIR, OUTPUT);
pinMode(daopian_stepper_CLK, OUTPUT);
pinMode(daopian_stepper_DIR, OUTPUT);
pinMode(sigang_stepper_CLK, OUTPUT);
pinMode(sigang_stepper_DIR, OUTPUT);
pinMode(jidianqi, OUTPUT);
Serial.begin(38400); //设置串口0的波特率
Serial1.begin(38400); //设置串口1的波特率
Serial2.begin(115200); //设置串口2的波特率
Serial3.begin(115200); //设置串口2的波特率
LCDA.clear();
LCDA.DrawFullScreen(tjau); //显示天津农学院
RESET();
Init_Hx711(); //初始化称重模块
Get_chushi(); //得到称重模块初始值——————等待读取,没有读取到则一直等待
FlexiTimer2::set(100 , 1.0 / 1000, Timer_Get_Weight);
FlexiTimer2::start(); //每0.1秒获取一次重量值
//attachInterrupt(5, Set_Weight_main, CHANGE);//外部中断int.5端口18执行Set_Weight函数。 (实际运行好像并不起作用)
LCDA.clear();
}
void loop()
{
state = 0;
Set_Weight();
Reach_the_goal();
}