智慧超市分捡系统

写卡 M2 & M5 & M6 demo_20190416

软件工具

下载链接:https://pan.baidu.com/s/1bS6nh4FZrDq24GkJfv6h3w
提取码:phy2

1、仓库区

ESP8266作为客户端加入手机创建的 tcpServer 中

   /*
   把8266作为TCPcleint,加入手机创建的tcpServer中
*/
#include<ESP8266WiFi.h>

//WIFI名字和密码
const char* ssid = "iCloud_TP";
const char* password = "icloud_TP";

const char *host = "192.168.1.190"; //修改为手机的的tcpServer服务端的IP地址,即手机在路由器上的ip
const int tcpPort = 8090;//sfq  修改为你建立的Server服务端的端口号

WiFiClient client;

//连接标识
int a = 0;
int infrared=0;
int i = 0;

void setup()
{
  Serial.begin(9600);
  ConnectWIFI();

  pinMode(16, INPUT);//  D0  板载指示灯
  pinMode(5, INPUT);//    D1
  pinMode(4, INPUT);//    D2
  pinMode(0, INPUT);//    D3  

  pinMode(2, OUTPUT);//     D4 TXD1
  pinMode(14, INPUT);//    D5
  pinMode(12, INPUT);//    D6
  pinMode(13, INPUT);//    D7
  pinMode(15, INPUT);//    D8

  digitalWrite(2, HIGH);
  
}

void loop()
{
  if (a == 1) {
    //串口数据发送到服务器
    //Senddata();
  } else {
    //连接服务端
    ConnectServer();
  }

  //连接服务端并用led灯表示连接状态
  LEDstate();

   //接收server数据发送到串口
    //Readdata();
    
    for(i=0;i<6;i++){
      Readinfrared(i);
    }
}

//连接WIFI
void ConnectWIFI() {
  WiFi.begin(ssid, password);
  //等待连接 
  uint8_t i = 0;
  while (WiFi.status() != WL_CONNECTED && i++ < 200) {
    delay(500);
//    Serial.print(".");
  }

  //连接失败
  if (i == 201) {
//    Serial.println("\nCould not connect WIFI. ");
    while (1) {
      delay(500);
    }
  } else {
//    Serial.println("connect WIFI ok");
  }
}

//led灯连接时常亮,未连接时闪烁
void LEDstate() {
  //连接情况 用led灯的状态显示
  a = 0;
  for (int i = 0; client.connected(); i++) {
    a = 1;
    break;
  }
  if (a == 0) {
    digitalWrite(2, HIGH);
    delay(500);
    digitalWrite(2, LOW);
    delay(500);
  } else {
    digitalWrite(2, LOW);
  }
}

//连接服务端
void ConnectServer() {
  while (!client.connected())
  {
    if (!client.connect(host, tcpPort)) {
      digitalWrite(2, HIGH);
      delay(500);
      digitalWrite(2, LOW);
      delay(500);
    }
  }
}

//串口数据发送到服务器
void Senddata() {
  //串口读取到的转发到wifi,因为串口是一位一位的发送所以在这里缓存完再发送
  while (Serial.available())
  {
    size_t counti = Serial.available();
    uint8_t sbuf[counti];
    Serial.readBytes(sbuf, counti);
    client.write(sbuf, counti);
//    Serial.write(sbuf, counti);
//    Serial.println("send over!");
  }

  //    //直接发送
  //    client.println(String("222222"));
  //    delay(2000);
}

void Readdata() {
  //读取从server返回到响应数据
  String line = client.readStringUntil('\r');
  Serial.println(line);
}
void Readinfrared(int ir){
//扫描端口
  switch(ir){
    case 0:
      ir=16;break;
    case 1:
      ir=5;break;
    case 2:
      ir=4;break;
    case 3:
      ir=14;break;
    case 4:
      ir=12;break;
    case 5:
      ir=13;break;
  }
  
    //获取信号
    infrared=digitalRead(ir);

          switch(ir){
            case 16:
            if(infrared == 1){
               client.println("m,"+String(infrared));}
              delay(100);
              break;
            case 5:
            if(infrared == 1){
               client.println("n,"+String(infrared));}
              delay(100);
              break;
            case 4:
            if(infrared == 1){
               client.println("o,"+String(infrared));}
              delay(100);
              break;
            case 14:
            if(infrared == 1){
               client.println("r,"+String(infrared));}
              delay(100);
              break;
            case 12:
            if(infrared == 1){
               client.println("q,"+String(infrared));}
              delay(100);
              break;
            case 13:
            if(infrared == 1){
               client.println("p,"+String(infrared));}
              delay(100);
              break;
          }
}

2、待捡区

未检测到货物时传送运行,货物到达推杆位置时停止传送,推至分捡传送,后退2S缓解储物处,正常运行。

#define motor_A 2   //推电机正转
#define motor_B 3    //推电机反转
#define motor_C 4   //传送电机正转
#define motor_D 5    //传送电机反转
#define limit_ONOFF 7    //限位开关
#define ITR  8 //光电开关


int limit_ONOFF_NUM = 0;    //存放限位开关信号,将信号保存下来
int ITR_NUM = 0;//存放物体到位值


void setup() 
{
  Serial.begin(9600);//串口波特率9600

  pinMode(motor_A,OUTPUT);
  pinMode(motor_B,OUTPUT);
  pinMode(motor_C,OUTPUT);
  pinMode(motor_D,OUTPUT);
  pinMode(7,INPUT_PULLUP);
  pinMode(ITR,INPUT_PULLUP);     
  
/*-----初始化输出引脚------*/
  digitalWrite(motor_A,LOW);
  digitalWrite(motor_B,LOW);
  digitalWrite(motor_C,LOW);
  digitalWrite(motor_D,LOW);
  delay(100);                  //延时0.1s
 }

void loop() 
{
    yunxing(); //开始运行工作
  
    ITR_NUM = digitalRead(ITR);    //读取
  if(ITR_NUM == 0)          //无物体靠近时为高电,有物体靠近时为低电平
  {      
        delay(100);
     ITR_NUM = digitalRead(ITR);
        if (ITR_NUM == 0){
             tingzhi();
             delay(1000);
             tuigan();
             delay(1000);
             shougan();
             delay(1000);
             daotui();
        }
  }      
}

/*----------------推杆控制-------------------*/
void tuigan()//推杆
{
  digitalWrite(motor_A, LOW); //初始化引脚为高电平
  digitalWrite(motor_B, HIGH);
  delay(500);
  do {
    limit_ONOFF_NUM = digitalRead(limit_ONOFF);
    if (limit_ONOFF_NUM == 0)
    {
      delay(50);
      limit_ONOFF_NUM = digitalRead(limit_ONOFF);
      if (limit_ONOFF_NUM == 0)
      {
        digitalWrite(motor_A, LOW); //初始化引脚为高电平
        digitalWrite(motor_B, LOW);
      }
    }
  } while (limit_ONOFF_NUM);
}

void shougan()//推杆
{
  digitalWrite(motor_B, LOW); //初始化引脚为高电平
  digitalWrite(motor_A, HIGH);
  delay(500);
  do {
    limit_ONOFF_NUM = digitalRead(limit_ONOFF);
    if (limit_ONOFF_NUM == 0)
    {
      delay(50);
      limit_ONOFF_NUM = digitalRead(limit_ONOFF);
      if (limit_ONOFF_NUM == 0)
      {
        digitalWrite(motor_A, LOW); //初始化引脚为高电平
        digitalWrite(motor_B, LOW);
      }
    }
  } while (limit_ONOFF_NUM);
}
/*----------------传送控制-------------------*/
void tingzhi()//传送停止

  {
    digitalWrite(motor_C,LOW);  
    digitalWrite(motor_D,LOW);
   
  }
  void yunxing()//传送运行

  {
    
    digitalWrite(motor_C,HIGH);  
    digitalWrite(motor_D,LOW);
   
  }
void daotui()//传送后退
  {
    digitalWrite(motor_D,HIGH);  
    digitalWrite(motor_C,LOW);
    delay(1500);
    digitalWrite(motor_C,LOW);
    digitalWrite(motor_D,LOW);
    delay(500);
   
  }

3、分捡区

3.1 RFID寻卡

RFID简介:射频识别即RFID(Radio Frequency IDentification)技术,又称无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触。常用的有低频(125k~134.2K)、高频(13.56Mhz)、超高频,微波等技术。RFID读写器也分移动式的和固定式的,目前RFID技术应用很广,如:图书馆,门禁系统,食品安全溯源等。

Arduino Uno <—> RFID-RC522
10 <—> SDA
13 <—> SCK
11 <—> MOSI
12 <—> MISO
null <—> IRQ
GND <—> GND
9 <—> RST
3.3V <—> 3.3V

示例

#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN         9           // 配置针脚
#define SS_PIN          10 
#define motor_A 2   //推电机
#define motor_B 3    //推电机
#define limit_ONOFF 5    //限位开关
         
MFRC522 mfrc522(SS_PIN, RST_PIN);   // 创建新的RFID实例
MFRC522::MIFARE_Key key;
int limit_ONOFF_NUM = 0;            //存放限位开关信号,将信号保存下来
char inByte = 0;                    //存放串口数据

void setup() {
    Serial.begin(9600);             // 设置串口波特率为9600
    pinMode(motor_A,OUTPUT);
    pinMode(motor_B,OUTPUT);
    pinMode(5,INPUT_PULLUP);

    digitalWrite(motor_A,LOW);
    digitalWrite(motor_B,LOW);
    
    while (!Serial);               // 如果串口没有打开,则死循环下去不进行下面的操作
    SPI.begin();                   // SPI开始
    mfrc522.PCD_Init();            // Init MFRC522 card
 
    for (byte i = 0; i < 6; i++) {
        key.keyByte[i] = 0xFF;
    }
 
    //Serial.println(F("扫描卡开始进行读或者写"));
    //Serial.print(F("使用A和B作为键"));
    //dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
    //Serial.println();
    
    Serial.println(F("开始读卡"));
}
 
 
void loop() {
    // 寻找新卡
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;
 
    // 选择一张卡
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;
 
    // 显示卡片的详细信息
//    Serial.print(F("卡片 UID:"));
//    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
//    Serial.println();
//    Serial.print(F("卡片类型: "));
    MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
//    Serial.println(mfrc522.PICC_GetTypeName(piccType));
 
    // 检查兼容性
    if (    piccType != MFRC522::PICC_TYPE_MIFARE_MINI
        &&  piccType != MFRC522::PICC_TYPE_MIFARE_1K
        &&  piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
        Serial.println(F("仅仅适合Mifare Classic卡的读写"));
        return;
    }
 
    // 我们只使用第二个扇区
    // IC卡中的扇区4
    byte sector         = 1;
    byte blockAddr      = 4;
    byte dataBlock[]    = {
        0x42, 0xBB, 0xF5, 0xCE, //   41 BB F5 CE         
        0xEF, 0x00, 0x08, 0x02, //   EF 00 08 02
        0x00, 0x00, 0x00, 0x00, //   00 00 00 00
        0x6C, 0x04, 0x01, 0x00  //   6C 04 01 00
    };//定义数据IC卡 作为数据对比使用
    byte trailerBlock   = 7;
    MFRC522::StatusCode status;
    byte buffer[18];
    byte size = sizeof(buffer);
    
    // 原来的数据
    //Serial.println(F("显示原本的数据..."));
    status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("身份验证失败?或者是卡链接失败"));
        Serial.println(mfrc522.GetStatusCodeName(status));
        return;
    }
 
    // 显示整个扇区
//    Serial.println(F("显示所有扇区的数据"));
//    mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);// 显示整个扇区函数
//    Serial.println();
 
    // 从块儿读取数据
    //Serial.print(F("读取块儿的数据在:")); Serial.print(blockAddr);
    //Serial.println(F("块 ..."));
    status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("读卡失败,没有连接上 "));
        Serial.println(mfrc522.GetStatusCodeName(status));
    }
    //Serial.print(F("数据内容在第 ")); Serial.print(blockAddr); Serial.println(F(" 块:"));
//    dump_byte_array(buffer, 16); // 块儿读取数据值并打印端口
//    Serial.println();
//    Serial.println();
     
    // 停止 PICC  使放置在读卡区的IC卡进入休眠状态,不再重复读卡
    mfrc522.PICC_HaltA();
    //停止加密PCD 停止读卡模块编码
    mfrc522.PCD_StopCrypto1();

    // 验证数据,保证前后数据是相等
    // 通过计算块中的字节数量
    //Serial.println(F("等待验证结果..."));
    byte count = 0;
    for (byte i = 0; i < 16; i++) {
        // 比较一下缓存中的数据(我们读出来的数据) = (我们写的数据)
        if (buffer[i] == dataBlock[i])
        //Serial.println(F("验证成功 :"));
            count++;
    }
    //Serial.print(F("匹配的字节数量 = ")); Serial.println(count);
    if (count == 16) {
        Serial.println(F("B"));//数据验证成功,数据匹配
        delay(1000);
        tuigan();
    } else {
        Serial.println(F("Z"));//数据验证失败,数据不匹配
        
    }
    
}




/*========================================================*/ 
/**
 * 将字节数组转储为串行的十六进制值
 */
void dump_byte_array(byte *buffer, byte bufferSize) {
    for (byte i = 0; i < bufferSize; i++) {
        Serial.print(buffer[i] < 0x10 ? " 0" : " ");
        Serial.print(buffer[i], HEX);
        
    }
}

void tuigan()//推杆分拣
{
  digitalWrite(motor_A, LOW); //初始化引脚为高电平
  digitalWrite(motor_B, HIGH);
  delay(2000);
  
  do {
    limit_ONOFF_NUM = digitalRead(limit_ONOFF);
    if (limit_ONOFF_NUM == 0)
    {
      delay(50);
      limit_ONOFF_NUM = digitalRead(limit_ONOFF);
      if (limit_ONOFF_NUM == 0)
      {
        digitalWrite(motor_A, LOW); //初始化引脚为高电平
        digitalWrite(motor_B, LOW);
        delay(500);
        Serial.println(F("X"));//分捡完成 上传完成信息
       
      }
    }
  } while (limit_ONOFF_NUM);
}

3.2 ESP8266

扫卡通过发送扫卡信息到传送收到信息停止,分捡完成继续运行传送。

3.2.1ESP8266_tcpclient

将arduino信息上传至8266服务端

示例

/*
   把8266作为TCPcleint,加入手机创建的tcpServer中
*/
#include<ESP8266WiFi.h>

//WIFI名字和密码
const char* ssid = "iCloud_TP";
const char* password = "icloud_TP";

const char *host = "192.168.1.181"; //修改为手机的的tcpServer服务端的IP地址,即手机在路由器上的ip
const int tcpPort = 8088;//sfq  修改为你建立的Server服务端的端口号

WiFiClient client;

//连接标识
int a = 0;

void setup()
{
  Serial.begin(9600);
  ConnectWIFI();

  pinMode(16, INPUT);//   D0
  pinMode(5, INPUT);//    D1
  pinMode(4, INPUT);//    D2
  pinMode(0, INPUT);//    D3

  pinMode(2, OUTPUT);//     D4
  pinMode(14, OUTPUT);//    D5
  pinMode(12, OUTPUT);//    D6
  pinMode(13, OUTPUT);//    D7
  pinMode(15, OUTPUT);//    D8

  digitalWrite(2, HIGH);
  digitalWrite(14, HIGH);
}

void loop()
{
  if (a == 1) {
    //串口数据发送到服务器
    Senddata();
  } else {
    //连接服务端
    ConnectServer();
  }

  //连接服务端并用led灯表示连接状态
  LEDstate();

  //  //接收server数据发送到串口
    Readdata();
}

//连接WIFI
void ConnectWIFI() {
  WiFi.begin(ssid, password);
  //等待连接 
  uint8_t i = 0;
  while (WiFi.status() != WL_CONNECTED && i++ < 200) {
    delay(500);
//    Serial.print(".");
  }

  //连接失败
  if (i == 201) {
//    Serial.println("\nCould not connect WIFI. ");
    while (1) {
      delay(500);
    }
  } else {
//    Serial.println("connect WIFI ok");
  }
}

//led灯连接时常亮,未连接时闪烁
void LEDstate() {
  //连接情况 用led灯的状态显示
  a = 0;
  for (int i = 0; client.connected(); i++) {
    a = 1;
    break;
  }
  if (a == 0) {
    digitalWrite(2, HIGH);
    delay(500);
    digitalWrite(2, LOW);
    delay(500);
  } else {
    digitalWrite(2, LOW);
  }
}

//连接服务端
void ConnectServer() {
  while (!client.connected())
  {
    if (!client.connect(host, tcpPort)) {
      digitalWrite(2, HIGH);
      delay(500);
      digitalWrite(2, LOW);
      delay(500);
    }
  }
}

//串口数据发送到服务器
void Senddata() {
  //串口读取到的转发到wifi,因为串口是一位一位的发送所以在这里缓存完再发送
  while (Serial.available())
  {
    size_t counti = Serial.available();
    uint8_t sbuf[counti];
    Serial.readBytes(sbuf, counti);
    client.write(sbuf, counti);
//    Serial.write(sbuf, counti);
//    Serial.println("send over!");
  }

  //    //直接发送
  //    client.println(String("222222"));
  //    delay(2000);
}

void Readdata() {
  //读取从server返回到响应数据
  String line = client.readStringUntil('\r');
  Serial.println(line);
}

3.2.2 ESP8266_tcpServer

传送带接收,8266作为服务端接收并处理客户端发来传送信息。

/**
   功能:
   1.将客户端发来的数据转发到串口;
   2.串口数据转发给所有客户端
   3.可连接4个客户端
   4.可设置静态IP地址
   5.指示灯闪烁表示无客户端连接,灯亮代表有客户端连接
*/

#include <ESP8266WiFi.h>

//定义最多多少个client可以连接本server
#define MAX_SRV_CLIENTS 5

//路由器WIFI和密码
const char* ssid = "iCloud_TP";
const char* password = "icloud_TP";

//静态地址、网关、子网掩码
IPAddress local_IP(192, 168, 1, 181);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);

//创建server
WiFiServer server(8088);//端口号,随意修改,范围0-65535
//管理clients
WiFiClient serverClients[MAX_SRV_CLIENTS];

int a = 0; //连接状态标识
int i = 0;//用于for循环

void setup() {
  //波特率
  Serial.begin(9600);
  //连接WIFI
  MyconnectWIFI();
  //启动server
  server.begin();
  server.setNoDelay(true);  //加上后才正常些
  //定义输入引脚
  pinMode(16, OUTPUT);//   D0
  pinMode(5, INPUT);//    D1
  pinMode(4, INPUT);//    D2
  pinMode(0, INPUT);//    D3

  //定义输出引脚
  pinMode(2, OUTPUT);//     D4
  pinMode(14, OUTPUT);//    D5
  pinMode(12, OUTPUT);//    D6
  pinMode(13, OUTPUT);//    D7
  pinMode(15, OUTPUT);//    D8

  digitalWrite(2, HIGH);//输出低电平
  digitalWrite(12, LOW);
  digitalWrite(14, HIGH);//输出高电平
  
  digitalWrite(16, LOW);
}

void loop() {
  //检测新的Client
  NewClient();
  
  //LED指示灯
  LEDstate();
  
  //把收到的客户端数据发送到串口
  ReceiveData();
  
  //串口数据发送到客户端
  //SendData();
}

//连接WIFI
void MyconnectWIFI() {

  WiFi.config(local_IP, gateway, subnet);//设置静态IP
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);//路由器的WiFi名称和密码
  //  Serial.print("\nConnecting to ");
  //  Serial.println(ssid);
  
  //等待连接
  while (WiFi.status() != WL_CONNECTED && i++ < 200) {
    delay(500);
    Serial.print(".");
  }
  
  if (i == 201) {
  
    //    Serial.print("\nCould not connect to ");
    //    Serial.println(ssid);
    while (1) {
    }
    
  } else {
    //    Serial.print("\nReady! Use 'telnet ");
    //    Serial.print(WiFi.localIP());
    //    Serial.println(" 8088' to connect");
  }
}

//有客户端连接时常亮,无连接时闪烁
void LEDstate() {
  //连接情况 用led灯的状态显示
  a = 0;
  for (int i = 0; serverClients[i].connected(); i++) {
    a = 1;
  }
  if (a == 0) {
    digitalWrite(16, HIGH);
    delay(500);
    digitalWrite(16, LOW);
    delay(500);
    //    Serial.println("no");
  } else {
    digitalWrite(16, LOW);
  }
}

//检测新的client
void NewClient() {
  //检测是否有新的client请求进来
  if (server.hasClient()) {
    for (i = 0; i < MAX_SRV_CLIENTS; i++) {
      //释放旧无效或者断开的client
      if (!serverClients[i] || !serverClients[i].connected()) {
        if (serverClients[i]) {
          serverClients[i].stop();
        }
        //分配最新的client
        serverClients[i] = server.available();
        //Serial.print("New client: ");
        //Serial.print(i);
        break;
      }
    }
    //当达到最大连接数 无法释放无效的client,需要拒绝连接
    if (i == MAX_SRV_CLIENTS) {
      WiFiClient serverClient = server.available();
      serverClient.stop();
      digitalWrite(2, LOW);
      //      Serial.println("Connection rejected ");
    }else{
      digitalWrite(2, HIGH);
    }
  }
}

//把收到的客户端数据发送到串口
void ReceiveData() {
  for (i = 0; i < MAX_SRV_CLIENTS; i++) {
    if (serverClients[i] && serverClients[i].connected()) {
      while (serverClients[i].available())
      {
        char data = serverClients[i].read();
        Serial.println(data);
        switch (data) {
          case 'A':
          digitalWrite(14, LOW);//输出低电平 
            break;
            case 'B':
          digitalWrite(14, LOW);//输出低电平 
            break;
            case 'C':
          digitalWrite(14, LOW);//输出低电平 
            break;
            case 'D':
          digitalWrite(14, LOW);//输出低电平 
            break;
            case 'X':
          digitalWrite(14, HIGH);//输出高电平 
            break;
            }
      }
    }
  }
}

//把串口数据发送到客户端
//void SendData() {
//  if (Serial.available()) {   //串口读取到的转发到wifi,因为串口是一位一位的发送所以在这里缓存完再发送
//    size_t counti = Serial.available();
//    uint8_t sbuf[counti];
//    Serial.readBytes(sbuf, counti);
//    //Serial.write(sbuf, counti);
//    //将数据发送给客户端
//    for (i = 0; i < MAX_SRV_CLIENTS; i++) {
//      if (serverClients[i] && serverClients[i].connected()) {
//        serverClients[i].write(sbuf, counti);
//        delay(200);
//      }
//    }
//  } else {
//    for (i = 0; i < MAX_SRV_CLIENTS; i++) {
//      //释放旧无效或者断开的client
//      if (serverClients[i].connected()) {
//        //serverClients[i].println("not data");
//        delay(500);
//      }
//    }
//  }
//}

分拣计数

#include <ESP8266WiFi.h>
#define MAX_SRV_CLIENTS 5   //最大同时联接数,即你想要接入的设备数量,8266tcpserver只能接入五个,哎

const char *ssid = "iCloud_TP"; ////这里是我的wifi,你使用时修改为你要连接的wifi ssid
const char *password = "icloud_TP"; //你要连接的wifi密码

IPAddress local_IP(192, 168, 1, 192);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
int infrared=0;
int a;
int i = 0;

WiFiServer server(8092);//你要的端口号,随意修改,范围0-65535
WiFiClient serverClients[MAX_SRV_CLIENTS];

void setup()
{
    Serial.begin(9600);
    delay(10);
    pinMode(16, OUTPUT);
    pinMode(5, INPUT_PULLUP);//    D1
    pinMode(4, INPUT_PULLUP);//    D2
    pinMode(0, INPUT);//    D3
  
    pinMode(2, INPUT);//    D4
    pinMode(14, INPUT_PULLUP);//   D5
    pinMode(12, INPUT_PULLUP);//   D6
    pinMode(13, INPUT_PULLUP);//   D7
    pinMode(15, INPUT_PULLUP);//   D8
  
    digitalWrite(16, 0);
    WiFi.config(local_IP, gateway, subnet);//192.168.0.200
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
    }
    server.begin();
    server.setNoDelay(true);  //加上后才正常些
}

void loop()
{
    blink();

    uint8_t i;
    if (server.hasClient())
    {
        for (i = 0; i < MAX_SRV_CLIENTS; i++)
        {
            if (!serverClients[i] || !serverClients[i].connected())
            {
                if (serverClients[i]) serverClients[i].stop();//未联接,就释放
                serverClients[i] = server.available();//分配新的
                continue;
            }

        }
        WiFiClient serverClient = server.available();
        serverClient.stop();
    }
    for (i = 0; i < MAX_SRV_CLIENTS; i++)
    {
        if (serverClients[i] && serverClients[i].connected())
        {
            digitalWrite(16, 0);//有链接存在,就一直长亮

            if (serverClients[i].available())
            {
                while (serverClients[i].available()) 
                    Serial.write(serverClients[i].read());
            }
        }
    }
    if (Serial.available())
    {
        size_t len = Serial.available();
        uint8_t sbuf[len];
        Serial.readBytes(sbuf, len);
        //push UART data to all connected telnet clients
        for (i = 0; i < MAX_SRV_CLIENTS; i++)
        {
            if (serverClients[i] && serverClients[i].connected())
            {
                serverClients[i].write(sbuf, len);  //向所有客户端发送数据
                delay(1);
            }
        }
    }
    for(i=0;i<4;i++){
      Readinfrared(i);
    }
}


void blink()
{
    static long previousMillis = 0;
    static int currstate = 0;

    if (millis() - previousMillis > 200)  //200ms
    {
        previousMillis = millis();
        currstate = 1 - currstate;
        digitalWrite(16, currstate);
    }
}
void Readinfrared(int ir){

  switch(ir){
    case 0:
      ir=14;break;
    case 1:
      ir=12;break;
    case 2:
      ir=13;break;
    case 3:
      ir=4;break;
  }
  
    //获取信号
    infrared=digitalRead(ir);
//    Serial.println(infrared);
    for (i = 0; i < MAX_SRV_CLIENTS; i++) {
      if (serverClients[i] && serverClients[i].connected()) {

          switch(ir){
            case 14:
            if(infrared == 0){
              serverClients[i].println("a,"+String(infrared));
              }
              delay(300);
              break;
            case 12:
            if(infrared == 0){
              serverClients[i].println("b,"+String(infrared));
            }
              delay(300);
              break;
            case 13:
            if(infrared == 0){
              serverClients[i].println("c,"+String(infrared));
            }
              delay(300);
              break;
            case 4:
            if(infrared == 0){
              serverClients[i].println("d,"+String(infrared));
            }
              delay(300);
              break;
          }

      }
    }
}

posted @ 2020-06-06 21:32  icloudelectron  阅读(514)  评论(0)    收藏  举报