Официальный сайт компании Arduino по адресу arduino.cc
Система отбраковки по весу, или дружим Ардуино с весами 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 } }