Hi,
i'm trying to do a sketch that when receive string with 3 value R,G,B, it put the value on three pwn pin so that i could change the colors of my led strip with any browser. the sketche work like a charm, value is correctly displayed in the serial monitor but as soon as i put in the code
the three analogWrite, it freeze.
i put
analogWrite(redPin, r);
analoWrite(greenPin, g);
analogWrite(bluePin, b
here the partial of the code
EthernetClient client = Ledserver.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
//read char by char HTTP request
if (readString.length() < 100) {
//store characters to string
readString += c;
//Serial.print(c);
}
//if HTTP request has ended
if (c == '\n') {
client.println("HTTP/1.1 200 OK"); //send new page
client.println("Content-Type: text/html");
client.println();
client.println("<HTML>");
client.println("<HEAD>");
client.println("<TITLE>Michael led server</TITLE>");
client.println("</HEAD>");
client.println("<BODY>");
client.println("<H1>Michael test server</H1>");
client.println("<a href=\"/?on\"\">ON</a>");
client.println("<a href=\"/?off\"\">OFF</a>");
client.println("</BODY>");
client.println("</HTML>");
delay(1);
//stopping client
client.stop();
readString = readString.substring(5, readString.length() - 11);
Serial.println(readString); //print to serial monitor for debuging
int commaIndex = readString.indexOf(',');
// Search for the next comma just after the first
int secondCommaIndex = readString.indexOf(',', commaIndex+1);
String firstValue = readString.substring(0, commaIndex);
String secondValue = readString.substring(commaIndex+1, secondCommaIndex);
String thirdValue = readString.substring(secondCommaIndex+1); // To the end of the string
int r = firstValue.toInt();
int g = secondValue.toInt();
int b = thirdValue.toInt();
Serial.println(r);
Serial.println(g);
Serial.println(b);
//clearing string for next read
readString="";
}
}
}
}
}
//Michael sketche
//Arduino server for 8 relay, stove and RGB led strip
//for use with IDE 1.0
//open serial monitor to see what the arduino receives
//address will look like http://192.168.1.102:84 for the ledserver
//address will look like http://192.168.1.102:85 for the relayserver
//for use with W5100 based ethernet shields
#include <SPI.h>
#include <Ethernet.h>
boolean reading = false;
// Debug mode
#define DEBUG true
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 2, 16 }; // ip in lan
EthernetServer Ledserver(84); //Led server port
EthernetServer Relayserver(85); //Relay server port
//For arduino input
#define Doorbelloff "76" //Scene for pin 2 LOW (door bell On)
#define Doorbellon "83" //Scene for pin 2 high (door bell OFF)
#define Phoneon "81" //Scene for pin 3 LOW (telephoe ring On)
#define Phoneoff "82" //Scene for pin 3 high (telephoe ring OFF)
#define Doorbell 2
#define Phone 3
boolean DoorbellState = false;
boolean PhoneState = false;
boolean Phonedelay = false;
//Variable for debonce phone ring
unsigned long pressed;
int pwrtime = 600;
unsigned long time;
unsigned long unpressed;
char serverName[] = "192.168.2.19"; //Vera ip address
EthernetClient client;
String readString;
//RGB led pin
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 11;
//////////////////////
void setup(){
//start Ethernet
Ethernet.begin(mac, ip);
Ledserver.begin();
//Led pin
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
//input
pinMode(Doorbell, INPUT);
pinMode(Phone, INPUT);
//relay pin
pinMode(22, OUTPUT); //output relay pin
pinMode(23, OUTPUT); //output relay pin
pinMode(24, OUTPUT); //output relay pin
pinMode(25, OUTPUT); //output relay pin
pinMode(26, OUTPUT); //output relay pin
pinMode(27, OUTPUT); //output relay pin
pinMode(28, OUTPUT); //output relay pin
pinMode(29, OUTPUT); //output relay pin
pinMode(29, OUTPUT); //output relay pin
Serial.begin(9600);
Serial.println("Arduino starting"); // so I can keep track of what is loaded
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to configure Ethernet using DHCP");
// no point in carrying on, so do nothing forevermore:
while(true);
}
else{
Serial.println("Ethernet ready local IP:");
Serial.println(Ethernet.localIP());
}
// give the Ethernet shield a second to initialize:
delay(1000);
}
void loop(){
Led();
Relay();
DoorbellDetection();
TelephoneDetection();
}
void Led(){
// Create a client connection
EthernetClient client = Ledserver.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
//read char by char HTTP request
if (readString.length() < 100) {
//store characters to string
readString += c;
//Serial.print(c);
}
//if HTTP request has ended
if (c == '\n') {
client.println("HTTP/1.1 200 OK"); //send new page
client.println("Content-Type: text/html");
client.println();
client.println("<HTML>");
client.println("<HEAD>");
client.println("<TITLE>Michael led server</TITLE>");
client.println("</HEAD>");
client.println("<BODY>");
client.println("<H1>Michael test server</H1>");
client.println("<a href=\"/?on\"\">ON</a>");
client.println("<a href=\"/?off\"\">OFF</a>");
client.println("</BODY>");
client.println("</HTML>");
delay(1);
//stopping client
client.stop();
readString = readString.substring(5, readString.length() - 11);
Serial.println(readString); //print to serial monitor for debuging
int commaIndex = readString.indexOf(',');
// Search for the next comma just after the first
int secondCommaIndex = readString.indexOf(',', commaIndex+1);
String firstValue = readString.substring(0, commaIndex);
String secondValue = readString.substring(commaIndex+1, secondCommaIndex);
String thirdValue = readString.substring(secondCommaIndex+1); // To the end of the string
int r = firstValue.toInt();
int g = secondValue.toInt();
int b = thirdValue.toInt();
Serial.println(r);
Serial.println(g);
Serial.println(b);
//clearing string for next read
readString="";
}
}
}
}
}
}
yes i'm able to compile it, as soon as i send a http request and i compile it with the analogwrite, it freeze. but if the analogwrite isn't there, it's ok and i'm able to see the three value r,g,b in the serial. the rest of the sketches work like charm.
You maybe running out of RAM. Insert the following code into the sketch and print (Serial.println()) the result of StackCount(). Also, what board are you using?
Yes i use the ethernet shield, Don't know how to extract the rgb value without using the string, cause when the server receive a data, it look like
(get/ 255,255,255 / HTTP1.1) So could you point me on how to extrat 255,255,255 and put them individually to r = 255 g = 255 b = 255 without using string.
You can use a string. What you can't use is the String class.
If the data will look basically the same every time, then store it in a char array and then do the same thing you're doing now, find the commas and the numbers in between.
smallpoul:
So could you point me on how to extrat 255,255,255 and put them individually to r = 255 g = 255 b = 255 without using string.
Use c-strings (not Strings) and the standard 'C' runtime library functions to manipulate them. The Arduino runtime environment includes a reasonably complete AVR 'C' runtime library and the Arduino reference section contains a link to the AVR documentation for it. The functions you want are declared in string.h. Since these standard 'C' runtime library functions are common to a huge number of platforms, there is an enormous quantity of documentation and tutorials on the internet explaining how to use them. To give you a start, the strtok() function lets you divide a string into tokens separated by defined characters, and there are many functions such as atoi() to parse a numeric string into the corresponding number.
Solution was so simple, everything was correct except for the pin i use for the led,ethernet shield use pin 10 and maybe 11, not sure. A big thanks to PaulS.