Система отбраковки по весу, или дружим Ардуино с весами CAS AD

Нет ответов
BlackTramp
Offline
Зарегистрирован: 08.11.2016

Схема подключения:
перечень: 

Код:

#include <LiquidCrystal.h> // Подключение библиотеки LCD экрана.

LiquidCrystal lcd(7, 8, 9, 10, 11, 12); // Пины подключения LCD экрана (RS, E, DB4, DB5, DB6, DB7).

byte CasStartMsg = 0x05;              //Команда проверки связи с весами CAS (Байт 05H).
byte CasReadyMsg = 0x06;              //Ответ, получаемый с весов CAS при наличии связи (Байт 06H).
byte CasStabilityWeightMsg = 0x11;    //Команда для получения с весов CAS состояния стабильности и веса(Байт 11H).
char StabilityWeightMsg[15];          //Массив из 15 элементов для хранения полученных данных.
float SpecifiedWeight = 126.0;        //Постоянная для хранения эталонного веса (Максимальное значение 2500.0, после точки только 0 или 5)
float UpLimit = 127.0;                //Постоянная для хранения верхнего предела веса
float DawnLimit = 125.0;              //Постоянная для хранения нижнего предела веса
float ConvertedWeight = 0;            //Переменная для хранения конвертированного значения веса с символов ASCII, в числовом вида float
#define LedPin  6                     //Пин подключения зеленого светодиода
#define RelayPin_1  5                 //Пин подключения 1-го реле
#define RelayPin_2  4                 //Пин подключения 2-го реле

void setup() 
{
    pinMode(LedPin, OUTPUT);          //Светодиод как выход с МК
    pinMode(RelayPin_1, OUTPUT);      //Реле 1 как выход с МК
    pinMode(RelayPin_2, OUTPUT);      //Реле 2 как выход с МК
    
    lcd.begin(16, 2);                 //Подключаем LCD экран с 16 символов на 2х строках
    Serial.begin(9600);               //задаём скорость передачи данных по последовательному интерфейсу в битах в секунду
    


    byte ArrowUP[8]={B00000,B00100,B01110,B10101,B00100,B00100,B00100,B00000,};    
    lcd.createChar(1, ArrowUP);                                                   //знак стрелки вверх
    byte ArrowDown[8]={B00000,B00100,B00100,B00100,B10101,B01110,B00100,B00000,};
    lcd.createChar(2, ArrowDown);                                                 //знак стрелки вниз
  
    
}

void loop() 
{
  label:
  
  Serial.write(CasStartMsg);         //отправляем в последовательный порт команду проверки связи
  delay(30);                         //ждём 30мс

  if (Serial.read() == CasReadyMsg)  // если от весов пришёл ответ
  {
  Serial.write(CasStabilityWeightMsg); //отправляем в весы команду на получения веса и состояния стабильности
  lcd.setCursor(0, 1);              //выводим на LCD на 1й строке эталонное значение веса
  lcd.print(SpecifiedWeight);
  lcd.setCursor(7, 1);              //выводим на LCD символы "kg"
  lcd.print("kg");
  delay(30);                           //ждём 30мс
  }
  
  
  else if (Serial.read() != CasReadyMsg)
  {
   lcd.clear(); 
   lcd.setCursor(0, 0);      
   lcd.print("NOT CONNECTED");          //иначе выводим на LCD "нет связи" с весами
   delay(1000);                         //ждём 1сек
   lcd.setCursor(0, 0);
   lcd.print("             ");        //стираем с LCD
   delay(1000);
   goto label;
  }  
  

  char i;                                          //переменная для Serial.readBytes, которая считывает символы, поступающие через последовательный порт, и помещает их в приемный буфер
   i = Serial.readBytes(StabilityWeightMsg, 15);   //StabilityWeightMsg - буффер, 15-количество символов


   lcd.setCursor(0, 0);
   lcd.print(StabilityWeightMsg[2]);  // выводим на LCD значение стабильности веса (U - нестабильно, S - стабильно) 
   lcd.setCursor(1, 0);
   lcd.print(StabilityWeightMsg[3]);  // выводим на LCD знак минуса
   lcd.setCursor(8, 0);
   lcd.print(StabilityWeightMsg[4]);  // выводим на LCD значение веса
   lcd.setCursor(9, 0);
   lcd.print(StabilityWeightMsg[5]);  // выводим на LCD значение веса
   lcd.setCursor(10, 0);
   lcd.print(StabilityWeightMsg[6]);  // выводим на LCD значение веса
   lcd.setCursor(11, 0);
   lcd.print(StabilityWeightMsg[7]);  // выводим на LCD значение веса
   lcd.setCursor(12, 0);
   lcd.print(StabilityWeightMsg[8]);  // выводим на LCD точка постоянная
   lcd.setCursor(13, 0);
   lcd.print(StabilityWeightMsg[9]);  // выводим на LCD последнее значение веса
   lcd.setCursor(14, 0);
   lcd.print(StabilityWeightMsg[10]); // выводим на LCD символ "k"
   lcd.setCursor(15, 0);
   lcd.print(StabilityWeightMsg[11]); // выводим на LCD символ "g"

  int a[4];                                                    //Массив для конвертации веса с символа в числовое значение
  
  if (StabilityWeightMsg[4]>47 && StabilityWeightMsg[4]<58) //если пришёл символ цифры
   a[0] = (StabilityWeightMsg[4] - '0') * 1000;              //то переводим в значение и умножаем на 1000
  else a[0] = 0;                                            //иначе принимаем значение 0

  if (StabilityWeightMsg[5]>47 && StabilityWeightMsg[5]<58) 
   a[1] = (StabilityWeightMsg[5] - '0') * 100;
  else a[1] = 0;

  if (StabilityWeightMsg[6]>47 && StabilityWeightMsg[6]<58) 
   a[2] = (StabilityWeightMsg[6] - '0') * 10;
  else a[2] = 0;

  if (StabilityWeightMsg[7]>47 && StabilityWeightMsg[7]<58) 
   a[3] = StabilityWeightMsg[7] - '0';
  else a[3] = 0;
 
  if (StabilityWeightMsg[9] == 53)                            //Если последний символ "5"
   ConvertedWeight = a[0] + a[1] + a[2] + a[3] + 0.5;          //то прибавляем ко всем значениям 0.5
  else
   ConvertedWeight = a[0] + a[1] + a[2] + a[3] + 0;            //иначе прибавляем 0

  if (StabilityWeightMsg[3] == '-')                          //Если приходит знак минуса, то меняем вес на противоположный 
   ConvertedWeight = !ConvertedWeight;
  
  if (SpecifiedWeight < ConvertedWeight)                      //если эталонный вес меньше полученного веса
  {
   lcd.setCursor(15, 1);                                      //выводим на LCD символ стрелки вверх
   lcd.print("\1");
  }
  else if (SpecifiedWeight == ConvertedWeight)                //если если эталонный вес равен полученному весу
  {
   lcd.setCursor(15, 1);                                      //выводим на LCD символ " = "
   lcd.print("=");
  }
  else                                                        //иначе выводим символ стрелки вниз
  {
   lcd.setCursor(15, 1);
   lcd.print("\2");
  }

  if (StabilityWeightMsg[2] == 83 && (ConvertedWeight <= UpLimit) && (ConvertedWeight >= DawnLimit))    //если получен символ "S"(стабильный вес) И заданный вес равен полученному весу
  
  {
    digitalWrite(LedPin, HIGH);                                             //то включаем светодиод
  }
  else 
  {
    digitalWrite(LedPin, LOW);                                              //иначе выключаем светодиод
  }

    if (StabilityWeightMsg[2] == 83 && (ConvertedWeight < DawnLimit))   //если получен символ "S"(стабильный вес) И заданный вес меньше нижнего предела
  {
    digitalWrite(RelayPin_1, HIGH);                                         //то включаем Реле 1
  }
  else 
  {
    digitalWrite(RelayPin_1, LOW);                                          //иначе выключаем Реле 1
  }

      if (StabilityWeightMsg[2] == 83 && (ConvertedWeight > UpLimit)) //если получен символ "S"(стабильный вес) И заданный вес больше верхнего предела
  {
    digitalWrite(RelayPin_2, HIGH);                                         //то включаем Реле 2
  }
  else 
  {
    digitalWrite(RelayPin_2, LOW);                                          //иначе выключаем Реле 2
  }  
}