使用Wifiduino接受上位机数据,控制云台(内含测试用LCD1602)-Arduino中文社区 - Powered by Discuz! Archiver

Wilfried 发表于 2018-5-18 19:51

使用Wifiduino接受上位机数据,控制云台(内含测试用LCD1602)

感谢奈何送的Wifiduino,因为一直比较忙,所以没有怎么用,直到昨日我可爱的Nano同学光荣牺牲,我又把魔爪伸向了可怜的Wifiduino,希望它能在暴力使用中撑得久一点吧。。。。
程序主要用途是获取上位机按照XXX,XXX/n格式发送的坐标数据,控制二自由度云台运行,数据处理部分已在上位机完成,降低下位机压力,写的比较简单,用软件延时代替了delay,提高兼容性,还望各位大佬轻踩!(目前为有线连接测试阶段,下一步会改为无线传输,这个坑我保证尽快填)
#include <Servo.h>
#include <LiquidCrystal.h>

#define NOP do { __asm__ __volatile__ ("nop"); } while (0)
#define ulong unsigned long

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);      //构造一个LiquidCrystal的类成员。使用数字IO ,12,11,5,4,3,2

int Sign = 0;//标志位为0时写入X为1时写入Y
int Finish = 0;
Servo myservo1;
Servo myservo2;
int val1 = 90;
int val2 = 90;
String inputString = "";         // 缓存字符串
boolean stringComplete = false;// 是否string已经完成缓存

void Change() {
String MouseX = "";
String MouseY = "";
int ch; char temp;
ch = inputString.length();
for (int i = 0; i < ch; i++) {
    temp = inputString.charAt(i);
    if (temp != '\n') {
      if (temp != ',') {
      if (Sign == 0) {
          MouseX += temp;
      }
      else {
          MouseY += temp;
      }
      }
      else {
      Sign = 1;
      }
    }
    else {
      //转换坐标系
      int x =MouseX.toInt();
      int y =MouseY.toInt();
      val1 = map(x, 0, 720, 0, 180) ;
      val2 = map(y, 10, 570, 0, 180);
      Sign = 0;//标志位归0
      break;
    }
}
myservo1.write(val1);
delay_(500);
myservo2.write(val2 );
delay_(500);
//lcd.setCursor(0, 0);          //设置液晶开始显示的指针位置,0列0行,人类理解的第一行
//lcd.print(inputString);
/*Serial.print( MouseX.toInt());
    delay(15);
    Serial.print('x');
    delay(15);
    Serial.println( MouseY.toInt());
    delay(15);*/
}

void setup() {
// 初始化串口
Serial.begin(9600);
// 将inputString反转200个字符:
inputString.reserve(200);
myservo1.attach(9);
myservo2.attach(6);
//等待串口准备好
while (!Serial);

   lcd.begin(16, 2);   //初始化LCD1602
   lcd.print("Welcome to use!"); //液晶显示Welcome to use!
   delay(1000);          //延时1000ms
   lcd.clear();          //液晶清屏
}

void loop() {

// 如果缓存string接收完成:
if (stringComplete) {
    // 清空String:
    inputString = "";
    stringComplete = false;
}

    lcd.setCursor(0, 1);          //0列,1行,人类理解的第二行
    lcd.print("for LingShun Lab");
    delay_(1000);            //延时1000ms
    lcd.setCursor(0, 0);
    lcd.print("Good Job!   ");
    delay_(1000);                  //延时1000ms


}

/*
SerialEvent在arduino板上的RX引脚收到数据时会被系统自动调用。在系统内部,它是在每次loop函数执行时连带执行的。因此如果再loop使用delay,serialEvent的调用也会被延迟,这样就有可能一次收到>=2个字符。
*/
void serialEvent() {
while (Serial.available()) {
    // 获取新的字符:
    char inChar = (char)Serial.read();
    if ((inChar < 48 || inChar > 57) && inChar != 10 && inChar != 44) {
      break;
    }
    // 将它加到inputString中:
    inputString += inChar;
    // 如果收到了换行符,就将变量设置为true
    if (inChar == '\n') {
      stringComplete = true;
      Change();
      inputString = "";
    }
}
}

void delay_(int ms)//软件延时
{
for (int i = 0; i < ms; i++)
{
    for (ulong j = 0; j < 1985; j++) NOP;
}
}


订单号: 144382428888177774
页: [1]
查看完整版本: 使用Wifiduino接受上位机数据,控制云台(内含测试用LCD1602)