#include <TimerOne.h>
#include <TimerThree.h>
// define arduino pin
#define RDATA1 22
#define RSCK 23
#define RDATA 24
#define RCS 25
#define Led1 26
#define Led2 27
#define Led3 28
#define RstMCP 29
bool flick;
bool ledState;
int m_iCount;
int m_icountSend;
int m_icountSendnumber;
bool m_bstartProtect;
String dataTemp;
String m_RFID;
String datarecive;
bool m_bInc;
bool b_enableSend;
unsigned long previousMillis = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(19200);
Serial2.begin(19200);// TO BOARD
Serial1.begin(38400);
Serial3.begin(38400);
InitIO();
// Inital timer for update infomation
//--- time 100ms to check and send data
Timer1.initialize(200000); //100ms
Timer1.attachInterrupt(UpdateValue);
//---time 3s to check protect action---
Timer3.initialize(3000000); //3s
Timer3.attachInterrupt(ProtectAction);
}
void loop() {
// put your main code here, to run repeatedly:
//--- read serial 0 and 1
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= 100) {
previousMillis = currentMillis;
CountProtect(); // count pulse from software
}
Serial0Read(); // to AGV
Serial2Read(); // to AGV
Serial1Read(); // RFID reader
Serial3Read(); // RFID reader
}
void InitIO()
{
pinMode(Led1, OUTPUT);
pinMode(Led2, OUTPUT);
pinMode(Led3, OUTPUT);
pinMode(RstMCP, OUTPUT);
pinMode(RDATA1, INPUT);
digitalWrite(RstMCP, true);
}
void UpdateValue()
{
LedState();
SendRFIDtoAGV();
}
void SendRFIDtoAGV()
{
if (!b_enableSend) return;
m_icountSend ++;
if (m_icountSend > 2) {
m_icountSend = 0;
m_icountSendnumber ++;
SerialSend(m_RFID);// SEND TO BOARD SERIAL 2
//Serial.println(m_RFID);
if(m_icountSendnumber >20){
b_enableSend = false;
m_RFID = "";
m_icountSend = 0;
m_icountSendnumber=0;
}
}
}
void Serial0Read() // Recieve Data from AGV
{
//Serial.println("hehe");
if (Serial.available()) {
byte inByte = Serial.read();
//Serial.write(inByte);
if (inByte == 0x02) {
//Serial.println("bat dau");
datarecive = "";
}
else if (inByte == 0x03) {
//Serial.println(dataTemp.length());
//Serial.println(datarecive);
if (datarecive = m_RFID) {
b_enableSend = false;
m_RFID = "";
m_icountSend = 0;
}
if (datarecive = "RST") {
b_enableSend = false;
m_RFID = "";
m_icountSend = 0;
}
}
else
datarecive += (char)inByte;
}
}
void Serial2Read() // Recieve Data from AGV
{
//Serial.println("hehe");
if (Serial2.available()) {
byte inByte = Serial2.read();
//Serial.write(inByte);
if (inByte == 0x02) {
//Serial.println("bat dau");
datarecive = "";
}
else if (inByte == 0x03) {
//Serial.println(dataTemp.length());
//Serial.println(datarecive);
if (datarecive = m_RFID) {
b_enableSend = false;
m_RFID = "";
m_icountSend = 0;
}
if (datarecive = "RST") {
b_enableSend = false;
m_RFID = "";
m_icountSend = 0;
}
}
else
datarecive += (char)inByte;
}
}
void LedState()
{
//------- flick lamp to show arduino work----
if (flick) {
flick = false;
digitalWrite(Led1, true);
digitalWrite(Led2, false);
ledState = true;
}
else {
flick = true;
digitalWrite(Led1, false);
digitalWrite(Led2, true);
ledState = false;
}
//------led protect flick when software on-------
// ----- led off when soft ware off-------------
if (m_bstartProtect) {
digitalWrite(Led3, ledState);
}
else
{
digitalWrite(Led3, true);
}
}
////////////////////////////////
////// Read from RFID
////////////////////////////////
void Serial1Read()
{
//Serial.println("hehe");
if (Serial1.available()) {
byte inByte = Serial1.read();
//Serial.write(inByte);
if (inByte == 0xAA) {
//Serial.println("bat dau");
dataTemp = "";
}
else if (inByte == 0xBB) {
//Serial.println(dataTemp.length());
if (dataTemp.length() == 4) {
if (dataTemp == m_RFID) {
return;
}
m_RFID = dataTemp;
b_enableSend = true;
m_icountSendnumber=0;
//Serial.println(m_RFID);
}
}
else
dataTemp += (char)inByte;
}
}
////////////////////////////////
////// Read RFID
////////////////////////////////
void Serial3Read()
{
//Serial.println("hehe");
if (Serial3.available()) {
byte inByte = Serial3.read();
//Serial.write(inByte);
if (inByte == 0xAA) {
//Serial.println("bat dau");
dataTemp = "";
}
else if (inByte == 0xBB) {
//Serial.println(dataTemp.length());
if (dataTemp.length() == 4) {
if (dataTemp == m_RFID) {
//Serial.println("trung roi");
return;
}
m_RFID = dataTemp;
b_enableSend = true;
m_icountSendnumber=0;
//Serial.println(m_RFID);
}
}
else
dataTemp += (char)inByte;
}
}
void SerialSend(String str)
{
Serial2.write(2);
Serial2.print(str);
Serial2.write(3);
}
void CountProtect()
{
if (digitalRead(RDATA1) && !m_bInc) {
m_bInc = true;
m_iCount ++;
}
if (!digitalRead(RDATA1)) {
m_bInc = false;
}
}
void ProtectAction()
{
// off mcp23017 during 3s and then turn on again----
if (!m_bstartProtect)
// on output when stop during 3s
digitalWrite(RstMCP, true);
//--- off all output when didn't recieve pulse-----
if (m_bstartProtect && m_iCount < 3 ) {
// off output all-----------------
m_bstartProtect = false;
digitalWrite(RstMCP, false);
}
if (!m_bstartProtect && m_iCount >= 3 ) {
//--- start protect---
//---- enable protect action---
m_bstartProtect = true;
}
m_iCount = 0;
}
Cách cập nhật Anhdv Boot không mất dữ liệu
5 days ago
0 Post a Comment:
Post a Comment
Cảm ơn bạn đã chia sẻ ý kiến!
Chúc bạn có một ngày thật vui vẻ.