ethercard php_ethercard用于UDP发送的奇怪问题

/*

This sketch receives humidity and temperature from sensor DHT11,

display on two digits seven-segment LED and send UDP message to remote server, prints them to the serial port.

The code can only compily by IDE 002X

Created 10 Feb 2013, by Chen JW. [email]superid888@gmail.com[/email]

*/

#include "EtherShield.h"

static uint8_t mymac[6] = { 0x54,0x55,0x58,0x10,0x00,0x25};

static uint8_t myip[4] = { 192,168,2,23};

static uint8_t broadcastip[4] = { 192,168,2,255};

// DestPort 1001, SrcPort 1000

#define DEST_PORT_L  0xE9

#define DEST_PORT_H  0x03

#define SRC_PORT_L  0xE8

#define SRC_PORT_H  0x03

const char iphdr[] PROGMEM ={ 0x45,0,0,0x82,0,0,0x40,0,0x20}; // 0x82 is the total

struct UDPPayload {

uint8_t data[2];

};

UDPPayload udpPayload;

// Packet buffer, must be big enough to packet and payload

#define BUFFER_SIZE 150

static uint8_t buf[BUFFER_SIZE+1];

EtherShield es=EtherShield();

// bits representing segments A through G (and decimal point) for numerals 0-9

const int numeral[10] = {

//ABCDEFG /dp

B11111100, // 0

B01100000, // 1

B11011010, // 2

B11110010, // 3

B01100110, // 4

B10110110, // 5

B10111110, // 6

B11100000, // 7

B11111110, // 8

B11110110, // 9

};

// pins for decimal point and each segment

// dp,G,F,E,D,C,B,A

const int segmentPins[] = { 9,8,7,6,5,4,3,2};

const int nbrDigits= 2; // the number of digits in the LED display

//dig 1 2

const int digitPins[nbrDigits] = { A4,A5};

int dppin=A3; //set the decimal point link to PIN A3

#include

dht11 DHT11;

#define DHT11PIN A0 //DHT11 PIN 3 == UNO A0

char string1[2];//Humd

char string2[2];//Temp

void setup(){

Serial.begin(19200);

es.ES_enc28j60Init(mymac);

//init the ethernet/ip layer:

es.ES_init_ip_arp_udp_tcp(mymac,myip,80);

for(int i=0; i < 8; i++)

pinMode(segmentPins[i], OUTPUT); // set segment and DP pins to output

for(int i=0; i < nbrDigits; i++)

pinMode(digitPins[i], OUTPUT);

//  delay(1000);

}

void loop(){

int chk = DHT11.read(DHT11PIN);

Serial.print("Read sensor: ");

switch (chk)

{

case DHTLIB_OK:

Serial.println("OK");

break;

case DHTLIB_ERROR_CHECKSUM:

Serial.println("Checksum error");

break;

case DHTLIB_ERROR_TIMEOUT:

Serial.println("Time out error");

break;

default:

Serial.println("Unknown error");

break;

}

int humd=int(DHT11.humidity);

int temp=int(DHT11.temperature-2);

//itoa(humd,string1,10);

//itoa(temp,string2,10);

//byte babb = 0x45;

//string ass = ((char)babb).ToString();

Serial.println(humd);

Serial.println(temp);

udpPayload.data[0] =humd;

udpPayload.data[1] =temp;

//udpPayload.data[0] =string1;

//udpPayload.data[1] =string2;

broadcastData() ;

//Display on 7segment

int counter1=200;

while(counter1)

{

counter1--;

//    showNumber(DHT11.humidity);

showNumber(humd);

}

counter1=200;

while(counter1)

{

counter1--;

analogWrite(dppin,0);

//    showNumber(DHT11.temperature-2);

showNumber(temp);

analogWrite(dppin,200);

}

}

// Broadcast the data in the udpPayload structure

void broadcastData( void ) {

uint8_t i=0;

uint16_t ck;

// Setup the MAC addresses for ethernet header

while(i<6){

buf[ETH_DST_MAC +i]= 0xff; // Broadcsat address

buf[ETH_SRC_MAC +i]=mymac[i];

i++;

}

buf[ETH_TYPE_H_P] = ETHTYPE_IP_H_V;

buf[ETH_TYPE_L_P] = ETHTYPE_IP_L_V;

es.ES_fill_buf_p(&buf[IP_P],9,iphdr);

// IP Header

buf[IP_TOTLEN_L_P]=28+sizeof(UDPPayload);

buf[IP_PROTO_P]=IP_PROTO_UDP_V;

i=0;

while(i<4){

buf[IP_DST_P+i]=broadcastip[i];

buf[IP_SRC_P+i]=myip[i];

i++;

}

es.ES_fill_ip_hdr_checksum(buf);

buf[UDP_DST_PORT_H_P]=DEST_PORT_H;

buf[UDP_DST_PORT_L_P]=DEST_PORT_L;

buf[UDP_SRC_PORT_H_P]=SRC_PORT_H;

buf[UDP_SRC_PORT_L_P]=SRC_PORT_L; // lower 8 bit of src port

buf[UDP_LEN_H_P]=0;

buf[UDP_LEN_L_P]=8+sizeof(UDPPayload); // fixed len

// zero the checksum

buf[UDP_CHECKSUM_H_P]=0;

buf[UDP_CHECKSUM_L_P]=0;

// copy the data:

i=0;

// most fields are zero, here we zero everything and fill later

uint8_t* b = (uint8_t*)&udpPayload;

while(i< sizeof( UDPPayload ) ){

buf[UDP_DATA_P+i]=*b++;

i++;

}

// Create correct checksum

ck=es.ES_checksum(&buf[IP_SRC_P], 16 + sizeof( UDPPayload ),1);

buf[UDP_CHECKSUM_H_P]=ck>>8;

buf[UDP_CHECKSUM_L_P]=ck& 0xff;

es.ES_enc28j60PacketSend(42 + sizeof( UDPPayload ), buf);

}

void showNumber( int number)

{

if(number == 0)

showDigit( 0, nbrDigits-1) ; // display 0 in the rightmost digit

else

{

// display the value corresponding to each digit

// leftmost digit is 0, rightmost is one less than the number of places

for( int digit = nbrDigits-1; digit >= 0; digit--)

{

if(number > 0)

{

showDigit( number % 10, digit) ;

number = number / 10;

}

}

}

}

// Displays given number on a 7-segment display at the given digit position

void showDigit( int segnumber, int digit)

{

digitalWrite( digitPins[digit], HIGH );

for(int segment = 1; segment <8; segment++)

{

boolean isBitSet = bitRead(numeral[segnumber], segment);

// isBitSet will be true if given bit is 1

//isBitSet = ! isBitSet; // remove this line if common cathode display

digitalWrite( segmentPins[segment], isBitSet);

}

delay(5);

digitalWrite( digitPins[digit], LOW );

}

// End

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值