Система отбраковки по весу, или дружим Ардуино с весами CAS AD
- Войдите на сайт для отправки комментариев
Втр, 08/11/2016 - 22:56
Схема подключения:
перечень:

Код:
#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
}
}