黄金会员
主题
帖子
积分5115
阅读权限40
注册时间2010-6-27
最后登录1970-1-1
在线时间 小时
|
经过几天摸索,调通了ENC28J60的UDP传输代码,用ATMEGA8L最小系统搭建了个基于UDP传输和两位数码管显示的温湿度监控下位机,可以用PC作为上位机组建多机房的远程温湿度和设备状态监控系统。ATMEGA8L熔丝设定为8MHz,用内部RC振荡器,USB端口取电,经2个二极管串接降压到3.5V左右为ATMEGA8L和ENC28J60供电,电路组装在洞洞板上,预留了ISP编程接口(兼连接ENC28J60模块的接口),用了一个ADSL线路分离器的外壳做模块的外壳,成本不到30元。
附上代码和烧录文件、VB编的上位机测试程序。
- /*
- 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 28 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.h>
- 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);
- }
-
-
- 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);
-
- Serial.println(humd);
- Serial.println(temp);
-
- udpPayload.data[0] =humd;
- udpPayload.data[1] =temp;
- broadcastData() ;
- Serial.println("Data send over UDP.");
-
- //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
复制代码
upper_computer.zip
(6.92 KB, 下载次数: 788)
DHT11_7segLED_ok_IDE023_ok_noser_ino.cpp.zip
(4.12 KB, 下载次数: 731)
DHT11_7segLED_ok_IDE023_ok_conv_ino.cpp.zip
(5.76 KB, 下载次数: 755)
|
评分
-
查看全部评分
|