Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 4304|回復: 2
打印 上一主題 下一主題

arduino ethernet 問題

[複製鏈接]
跳轉到指定樓層
1#
發表於 2012-12-26 21:11:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
大家好我的arduino ethernet有個很奇怪的問題
我在測試的時候 arduino連usb2.0 serial board連電腦
送出http request 是沒有問題(server可以接收到)
等我要上線時 我把usb2.0 serial board拔掉
改採用adapter提供的電源
這時候arduino 似乎就不會送出request 給server端
明明我甚麼都沒變壓
請問大家知道這是為什麼嗎
2#
發表於 2012-12-28 10:09:20 | 只看該作者
usb2.0 serial board 是什麼?

「送出http request 是沒有問題(server可以接收到)」
「Arduino 似乎就不會送出request 給server端」
上列兩項你是如何驗證的呢?有沒有什麼輸出結果或畫面?

How about posting your code?
3#
 樓主| 發表於 2013-1-1 19:58:18 | 只看該作者
Hi Coopermaa 大大你好:
那個應該是叫 USB 2 Serial Light.
負責arduino Ethernet 接電腦的板子

回復一下:
我arduino送出http request , server端接收到 server會有log出來(我是用java servlet)

問題在於我只要接電腦 Arduino會乖乖地送出訊號給server
但是如果不接電腦 只接網路線 arduino就很像是斷了線 送不出request
實在想不出到底是甚麼原因

以下是arduino的code
#include <SPI.h>
#include <Ethernet.h>
#include <Time.h>
byte mac[] ={
  0x90,0xA2,0xDA,0x00,0xEE,0x50};
byte ip[]={192,168,2,101};
byte gateway[]={192,168,2,1};
byte subnet[]={255,255,255,0};
IPAddress  server(192,168,2,100);
EthernetClient client;
EthernetServer self_server = EthernetServer(8888);//telnet port 23

boolean init_status = false;//初始化

int flashPin=8;//回傳電眼訊號
int counterPin=7;//回傳計數器+1訊號
int resetPin =9;//回傳歸零訊號

int counter=0;//計數器計數
int flash_counter=0;//電眼計數

int line_break_sec=5;//斷線時間

unsigned long wire_break_start=0;//
unsigned long time;//
unsigned long last_time=0;
unsigned long flash_average_time=0;//電眼平均閃爍時間
unsigned long flash_last=0;//上次電眼啟動時間
unsigned long flash_total_period=0;

unsigned long average_take_off_time=0;//平均拿取時間
unsigned long take_off_total_period=0;//平均拿取時間

unsigned long total_period;//電眼總共閃爍時間間隔
unsigned long past_time=0;//生產時間
unsigned long stop_time=0;//停機時間
unsigned long start_time=0;// 開機 時間
unsigned long server_react_time=0;//語SERVER保持SESSION
boolean status4_sent = false;//當在機器在等待= ture  由電眼開始動做再改成 true
boolean status3_sent = false;//當斷線機器在等待= ture  由按下rest開始動做再改成 true

void setup(){
  pinMode(counterPin,INPUT);
  pinMode(flashPin,INPUT);
  pinMode(resetPin,INPUT);
  Serial.begin(9600);
  
  //網路初始化
  Ethernet.begin(mac,ip,gateway,subnet);
  //server init
  self_server.begin();
  Serial.println("self server begin......");
  
  //send_http_request(6,0);//告訴server counter 虛設為0
  if(client.connect(server,8080)){
    Serial.println("connected");
    client.print("GET /MachineRecorder/counter_receive.do");
    client.print("?machine_id=F01");
    client.print("&action=6");// init number 6
    client.print("&time_info=0");//now is zero
    client.print("&counter=0");//counter init is zero
    client.print("&source=arduino");//source = arudio request
    client.print("&ip=192.168.2.101");//ip address F01
    client.println(" HTTP/1.0");   
    client.println("");
    client.stop();
    delay(1000);
    Serial.println("message sent to server");
  }else{
    Serial.println("connection fail");
  }



}
boolean last_step=false;


/*把計數器資料送給主機*/

void send_http_request(int action,int time){
  if(client.connect(server,8080)){
    Serial.println("connected");
    client.print("GET /MachineRecorder/counter_receive.do");
    client.print("?machine_id=F01");
    client.print("&action=");
    client.print(action);//生產時間(秒)
    client.print("&time_info=");
    client.print(time);//拔取時間(秒)
    client.print("&counter=");
    client.print(counter);//拔取時間(秒)
    client.print("&source=arduino");
    client.println(" HTTP/1.0");   
    client.println("");
    client.stop();
    Serial.println("message sent to server");
  }else{
    Serial.println("connection fail");
  }

}
void save_production_time(){
}
unsigned long last_message =0;
void loop(){
  EthernetClient message = self_server.available();
  if(message==true){//如果M1330主機有送資料來
      char a  = message.read();
      //Serial.println(a);
      if(a=='1'){
        unsigned long time = now();
        if(time-last_message>500){//如果超過500秒 <-避免短時間又增加SESSION
          Serial.println("tell server I am alive");
          send_http_request(8,0);
         
        }
        last_message = time;//
      }else{
      counter =0;//代表server 端有更改規格 需要把計數器歸零
      Serial.println("received from Servlet");
      message=false;
      }
  }
  
  //每完成一粒 自動累加 計數模式
  //再啟動
   if(digitalRead(counterPin)==HIGH){
    counter++;//數量+1
   
    Serial.println("status 1 machine stop: waiting taking off the spool..................");
    flash_counter=0;//電眼計數歸零
    flash_total_period=0;//電眼算依次的時間歸零
    Serial.print("counter=");
    Serial.println(counter);
    time=now();//取得停止時間
    if(last_time!=0){//如果有上次停止時間
      past_time = (time-last_time);//算出這次生產時間
      Serial.print("how long it takes to produce one spool=");
      Serial.print(past_time);
      Serial.println("sec");
      last_time=time;//        
      //送計數數量到server
    }
    else{
      last_time =time;
    }
    send_http_request(1,past_time);/*--傳送給server----- 目前狀態  生產時間-*/
    Serial.println("finish and send to server status 1");
   
     delay(5000);    //停止2秒運算 確保機器完全停止

  }
  else if(digitalRead(flashPin)==HIGH){
   
    flash_counter++;// 電眼計數   
    unsigned long flash_this =now();//取得這次電眼時間
    unsigned long flash_period = flash_this-flash_last ;//上次到這次的時間
    flash_total_period+= flash_period;
    flash_average_time =flash_total_period/flash_counter;//電眼跳依次的平均時間
    flash_last = flash_this;

    Serial.print("flash light blink average time=");
    Serial.println(flash_average_time);

    if(flash_counter==1){//如果起始計數為1 表示計數器啟動     
      status3_sent=false;
      unsigned long take_off_period=flash_this-last_time;//得到拿下時間(毫秒)
      if(status4_sent==true&&take_off_period>600){//如果是人員離開 而且離開超過10分鐘
         //平均拔取時間+總區間
         take_off_total_period +=average_take_off_time;
         
      }else{
        take_off_total_period+=take_off_period;
      }
      status4_sent=false;
      average_take_off_time = (take_off_total_period)/counter; //算出平均拿下時間
      
      flash_total_period=0;//電眼跳的總區間
      flash_average_time=0;//電眼跳的平均時間歸零
      last_time = now();//counter start
      Serial.print("average take off time=");
      Serial.println(average_take_off_time);
      send_http_request(2,take_off_period);/*------更改狀態為2開始啟動 送出拿下時間----目前狀態 拿取時間*/
      Serial.print("status 2 machine start running:.........take off period:");
      Serial.println(take_off_period);
      //送起始時間 跟終止 時間  
    }

    Serial.print("flash counter=");
    Serial.println(flash_counter);
    delay(300);//在0.3秒內 不接受任何電眼訊號

  }
  else if(digitalRead(flashPin)==LOW){//電眼在休息狀態
    unsigned long flash_waiting = now();
    if(flash_counter==0){//停機狀態
      if((flash_waiting - flash_last)>average_take_off_time){//如果等待時間 比平均拿取時間長
        if(!status4_sent){
        send_http_request(4,flash_waiting);/*------更改狀態為4等待拿取----目前狀態 停機開始時間*/
        status4_sent = true;
        Serial.println("status 4 machine stop and waiting...................");
        }
      }
    }
    else{//flash counter >0 計數器 運轉狀態 做到一半停下來
      unsigned long waiting_time =flash_waiting - flash_last ;
      unsigned long buffer = flash_average_time + line_break_sec;//flash如果沒有閃 超過5秒
      if(waiting_time >buffer){
        if(!status3_sent){
          status3_sent = true;
          unsigned long break_time=now();
          wire_break_start=flash_waiting;
          send_http_request(3,break_time);/*--更改狀態為3斷線 送回 等待處理時間 */
          Serial.println("status 3 machine hold.....wire break or adjusting..........");
        }
      }
      
      if(digitalRead(resetPin)==HIGH){//作業員按下歸零 表示斷線排除完畢
         flash_counter=0;//感應 歸零
         Serial.println("restPin  activate");
         status3_sent=false;
         unsigned long waiting = now();
         unsigned long break_finish = waiting - wire_break_start;//得到總共斷線時間
         send_http_request(5,break_finish);/*--送出重新啟動訊號-  更改狀態五 重新啟動  回傳斷線處理時間--*/
         Serial.println("status 5 operator rest counter and restart machine.........");
      }
    }
  }


}
// 當電被切掉時...自動歸0
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2025-1-31 19:54 , Processed in 0.151255 second(s), 7 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表