晾晒谷物收获机自动化代码开源留存(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();
}

样机图片

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别和李俊儒抢辣条

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值