During the winter I decided to purchase a NAS (Network Attached Storage) so I could backup and keep all my work easily in one place between my computers. Over time I noticed that my computer would lose internet connection and connection to my server. With the amount of networking equipment I have running, I tend to have issue finding the source of the error. One afternoon, I decided to think of a quick project to work on. With an Arduino Ethernet board lying on my desk, I decided to make a small device to place on my desk to monitor any device on my local network and also check outgoing internet service.
With a few parts lying around, I began my search in finding a simple method of making this device. I decided to use the easiest method in checking network connections, using the good old “ping” function you could find in Windows when messing around with command prompt. The problem is, Arduino is not Windows and does not come with a “ping” function. Luckily, the Arduino community is large enough to have plenty of libraries available to suit anyone’s needs! I found a library called ICMP Ping, which allows for an Arduino with Ethernet to ping web addresses.
After assembling a quick test using the library’s example, I decided to assemble this circuit into a case. While cleaning the kitchen with my mom, I found some wooden tea boxes which were empty. The boxes were small and had a little sliding piece of wood which allowed you to open the box. The box was a perfect size to put all the components in, so I used a Dremel to make some holes for the Ethernet, LCD, and power. In the end I had a cool working device!
Summary: An ethernet device that pings local and external IPs and displays if they are online or offline.
Parts Used:
- Standard LCD Screen
- 220 Ohm Resistor
- Arduino Ethernet Board (Now replaced by Ethernet Shield)
- 10k OHm Potentiometer
- Wire
- 5 Volt Arduino Power Supply
- Cat 5e Ethernet Cable
Arduino Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | #include <ICMPPing.h> #include <util.h> #include <SPI.h> #include <Ethernet.h> #include <LiquidCrystal.h> //Networking Stuff byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 }; EthernetClient client; SOCKET pingSocket = 0; char buffer [256]; ICMPPing ping(pingSocket, (uint16_t)random(0, 255)); IPAddress NAS(192,168,1,12); IPAddress NAS2(192,168,1,11); IPAddress Gateway(192,168,1,1); IPAddress Google(8,8,8,8); IPAddress Google2(8,8,4,4); IPAddress Verizon(4,2,2,2); IPAddress Test(192,168,1,55); //LCD Stuff LiquidCrystal lcd(9, 8, 6, 5, 3, 2); void setup() { Serial.begin(9600); lcd.begin(16, 2); // start the Ethernet connection: if (Ethernet.begin(mac) == 0) { lcd.print("Failed to connect"); // no point in carrying on, so do nothing forevermore: for(;;) ; } } void loop() { //Display Arduino's IP lcd.clear(); lcd.print("IP Address:"); lcd.setCursor(0, 1); for (byte thisByte = 0; thisByte < 4; thisByte++) { // print the value of each byte of the IP address: lcd.print(Ethernet.localIP()[thisByte], DEC); if(thisByte <3) lcd.print("."); } delay(5000); testNetwork(); delay(5000); testIP(NAS,"NAS"); delay(5000); testIP(NAS2,"NAS 2"); delay(5000); } void testNetwork() { if(checkServer(Google)){ lcd.clear(); lcd.setCursor(0, 0); lcd.print("Internet Online"); } else{ if(checkServer(Google2)){ lcd.clear(); lcd.setCursor(0, 0); lcd.print("Internet Online"); } else{ if(checkServer(Verizon)){ lcd.clear(); lcd.setCursor(0, 0); lcd.print("Internet Online"); } else{ lcd.clear(); lcd.setCursor(0, 0); lcd.print("Internet Offline"); } } } } void testIP(IPAddress a, String IPname){ if(checkServer(a)){ lcd.clear(); lcd.setCursor(0, 0); lcd.print(IPname); lcd.print(" Online: "); lcd.setCursor(0, 1); lcd.print(a); } else{ lcd.clear(); lcd.setCursor(0, 0); lcd.print(IPname); lcd.print(" Offline: "); lcd.setCursor(0, 1); lcd.print(a); } } boolean checkServer(IPAddress a){ ICMPEchoReply echoReply = ping(a, 4); if (echoReply.status == SUCCESS) { return true; } else { return false; } } |
This is not working …
Connected all as described,and used your code …
What is not working? If you provide details I will try to help.
Not working also, no matter which library ICMPPing i used
D:\ARDUINO\libraries\icmp_ping\ICMPPing.cpp: In member function ‘Status ICMPPing::sendEchoRequest(const IPAddress&, const ICMPEcho&)’:
D:\ARDUINO\libraries\icmp_ping\ICMPPing.cpp:184:11: error: ‘class W5100Class’ has no member named ‘send_data_processing’
W5100.send_data_processing(_socket, serialized, sizeof(ICMPEcho));
^
D:\ARDUINO\libraries\icmp_ping\ICMPPing.cpp: In member function ‘void ICMPPing::receiveEchoReply(const ICMPEcho&, const IPAddress&, ICMPEchoReply&)’:
D:\ARDUINO\libraries\icmp_ping\ICMPPing.cpp:207:19: error: ‘class W5100Class’ has no member named ‘getRXReceivedSize’
if (W5100.getRXReceivedSize(_socket) < 1)
^
D:\ARDUINO\libraries\icmp_ping\ICMPPing.cpp:219:9: error: 'class W5100Class' has no member named 'read_data'
W5100.read_data(_socket, (uint16_t) buffer, ipHeader, sizeof(ipHeader));
^
D:\ARDUINO\libraries\icmp_ping\ICMPPing.cpp:229:9: error: 'class W5100Class' has no member named 'read_data'
W5100.read_data(_socket, (uint16_t) buffer, serialized, dataLen);
^
exit status 1
Error compiling for board Arduino/Genuino Uno.
I noticed you are trying to use an Arduino Uno with this, this project was built on an Arduino Ethernet which provides the proper libraries for the Ping Library to work. The uno does not support ethernet unless you use the ethernet shield or other wireless device. Can you provide more info on your set up?