/*
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