X10, html code not playing nice

Uno with e-net shield. Works fine with html page turning on and off the one LED you see in the code. I altered the code to include the X10 code examples. Color of wires from RJ11 plug are commented in the code to help any troubleshooting. Using an X10 CM11A 2-way controller.

Issue: I can’t get to the point of troubleshooting the actual x10 stuff because something isn’t playing nice in the html code at the bottom where I call the X10 commands. With X10 commands at the bottom lines of code, I can turn on and off my one original LED on the html page UNTIL I try to turn on the other button now linked to the X10 command. If I comment out the if(… statements with the X10 code after it at the bottom, html plays nice and original LED works. So something isn’t working down there.

After trying the button linked to X10 commands, webpage also will crash.

Help is appreciated, I edit “working” code from others and include it to do what I want, I don’t have a lot of html or C++ experience.


  Web Server
 A simple web server that shows the value of the analog input pins.
 using an Arduino Wiznet Ethernet shield. 
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)
 created 18 Dec 2009
 by David A. Mellis
 modified 4 Sep 2010
 by Tom Igoe

#include <SPI.h>
#include <Ethernet.h>
#include <x10.h>

const int rxPin = 3;    // data receive pin,green
const int txPin = 4;    // data transmit pin,yellow
const int zcPin = 2;    // zero crossing pin,black
byte CODE1;

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x7B, 0xD4 };
IPAddress ip(10,0,202, 75);
byte gateway[] = {10,0,200,1};
byte subnet[] = {255,255,252,0};

// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup()
  Serial.begin(9600);    //  open up serial port connection to PC
  pinMode(8, OUTPUT);    //  Set digital pin 8 as output
  pinMode(7, OUTPUT);    //  Set digital pin 7 as output
  digitalWrite(zcPin, HIGH); 
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip,gateway,subnet);
  x10.begin(rxPin, txPin, zcPin);

void loop()
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    String buffer = "";  //  Declare the buffer variable

    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.print(c);  //  Send every character read to serial port 
        buffer+=c;        //  Assign to the buffer

        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("<body background=\"http://i111.photobucket.com/albums/n130/sflemon/ClearBlueBackground.jpg\">");
          client.println("<font color=white><h1 align=center>8204 Shadowstone Ct. Home Command Page</font></h1>");
          client.println("<hr />");
          client.println("<hr />");

          if (digitalRead(8)){  //  1<-- Display LED status
            client.println("<img src=\"http://i111.photobucket.com/albums/n130/sflemon/indicator-green_zps8552e624.png\" width=20 height=20 />");
            client.println("<img src=\"http://i111.photobucket.com/albums/n130/sflemon/indicator-red_zps75caf320.png\" width=20 height=20 />");
          // 2<-- Create a form, control output 8
          client.print("<FORM action=\"\" >");
          client.print("<P> <div align=left><INPUT type=\"radio\" name=\"status\" value=\"1\">ON" "<INPUT type=\"radio\" name=\"status\" value=\"0\">OFF" "<INPUT type=\"submit\" value=\"  Yellow LED \"></div>" "</FORM>");
          if (digitalRead(7)){  //  1<-- Display LED status
            client.println("<img src=\"http://i111.photobucket.com/albums/n130/sflemon/indicator-green_zps8552e624.png\" width=20 height=20 />");
            client.println("<img src=\"http://i111.photobucket.com/albums/n130/sflemon/indicator-red_zps75caf320.png\" width=20 height=20 />");
          // 2<-- Create a form, control output 7
          client.print("<FORM action=\"\" >");
          client.print("<P> <div align=left><INPUT type=\"radio\" name=\"status2\" value=\"1\">ON" "<INPUT type=\"radio\" name=\"status2\" value=\"0\">OFF" "<INPUT type=\"submit\" value=\"  Red LED \"></div>" "</FORM>");
          client.println("<P> <div align=left><img src=\"http://wwwcache.wral.com/asset/weather/doppler5000/2006/08/07/1001059/ice_2011_dd5k_wake-640x480.jpg\" width=480 height=360 />" "<img src=\"http://wwwcache.wral.com/asset/weather/2008/04/22/2774561/ice_2011_forecast_7day_wral_raleigh-600x450.jpg\" width=480 height=360 />");
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
          buffer="";       //  Clear the buffer at end of line
        } else if (c == '\r') {            
          if(buffer.indexOf("GET /?status=1")>=0)
            digitalWrite(8,HIGH);  // Catch ON status and set  Yellow LED
          if(buffer.indexOf("GET /?status=0")>=0)
            digitalWrite(8,LOW);  // Catch OFF status and set Yellow LED
           if(buffer.indexOf("GET /?status2=1")>=0)
          if(buffer.indexOf("GET /?status2=0")>=0)
        else {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
    // give the web browser time to receive the data
    // close the connection:

Moderator edit:
</mark> <mark>[code]</mark> <mark>

</mark> <mark>[/code]</mark> <mark>
tags added.

I find thing seem to work better to send back the web page first and close the connection before actually controlling things on the arduino. Have you gotten the x10 stuff working just using commands from the serial monitor?

Alright, back to basics…I went here: http://www.arduino.cc/en/Tutorial/X10

I downloaded and placed the libraries in that tutorial in the appropriate places and all compiles fine. I have the same issue others had with the sketch getting to print in the serial monitor: lights on and never does anything else.

I have a CM11A. Pin 1 is yellow, Pin 2 is green, Pin 3 is red, Pin 4 is black. I have it hooked up as in the tutorial. It’s not getting past that in the program. The library I used from the tutorial doesn’t have a .O file to delete like some of the other forum topic on this issue. I thought Hogan stated that that tutorial DOES work with that library if wired correctly.

Not sure what I’m doing wrong. I also tried a few other libraries and examples and none worked.

I tried Hogan’s library link on the transmit AND receive he did, but #include <x10constants.h> has a compile error. At this point I would like somebody to essentially point me to EXACTLY the library, example program, and wires for a CM11A.

I have this one hooked up as others say they have, and no dice.

I am using the blink example sketch in the folder with those library files:

  X10 blink
 Blinks an lamp on an X10 lamp module.  
 Example was built using a PL513
 X10 One-Way Interface Module from http://www.smarthome.com 
 as the modem, and a Powerhouse X10 Lamp Module from Smarthome
 to plug the lamp in.
 created 15 June 2007
 modified 6 May 2011
 by Tom Igoe
#include <x10.h>

const int rxPin = 3;    // data receive pin
const int txPin = 4;    // data transmit pin
const int zcPin = 2;    // zero crossing pin

void setup() {
  // initialize serial and X10:
  x10.begin(rxPin, txPin, zcPin);

void loop() {
  // open transmission to house code A:
  Serial.println("Lights on:");
  // send a "lights on" command:

  Serial.println("Lights off:");
  // send a "lights off" command:

Moderator edit:
</mark> <mark>[code]</mark> <mark>

</mark> <mark>[/code]</mark> <mark>
tags added.

Just as a followup on some x10 stuff, I tried the below code with my x10 CM17A “firecracker” and it works with the TM751 transceiver. Just ground and arduino pins 2 and 3 connected to the cm17a.

/* Arduino Interface to the CM17A Wireless X10 dongle. BroHogan 7/19/08
 * The CM17A gets it power and data using only the RTS, CTS, & Gnd lines.
 * A MAX232 is not req. (0/+5V work OK) If MAX232 IS used reverse all HIGHs & LOWS
 * Signal      RTS DTR        Standby | '1' | Wait | '0' | Wait | '1' | Wait...
 * Reset        0   0         _____________________       _____________________
 * Logical '1'  1   0   RTS _|                     |_____|
 * Logical '0'  0   1         ________       ___________________       ________
 * Standby      1   1   DTR _|        |_____|                   |_____|
 * MINIMUM time for the '1', '0' and 'Wait' states is 0.5ms.
 * At least one signal must be high to keep CM17A powered while transmitting.
 * Each xmit is 40 bits -> "Header" 16 bits,  "Data" 16 bits, "Footer" 8 bits
 * CONNECTION: RTS -> DB9 pin 7.  DTR -> DB9 pin 4. Gnd. -> DB9 pin 7.

#define RTS_pin 2                     // RTS line for C17A - DB9 pin 7
#define DTR_pin 3                     // DTR line for C17A - DB9 pin 4
#define BIT_DELAY 1                    // ms delay between bits (0.5ms min.)
#define ON     0                       // command for ON
#define OFF    1                       // command for OFF
#define BRIGHT 2                       // command for 20% brighten
#define DIM    3                       // command for 20% dim

unsigned int houseCode[16] = {
  0x6000,  // A
  0x7000,  // B
  0x4000,  // C
  0x5000,  // D
  0x8000,  // E
  0x9000,  // F
  0xA000,  // G
  0xB000,  // H
  0xE000,  // I
  0xF000,  // J
  0xC000,  // K
  0xD000,  // L
  0x0000,  // M
  0x1000,  // N
  0x2000,  // O
  0x3000,  // P

unsigned int deviceCode[16] = {
  0x0000,  // 1
  0x0010,  // 2
  0x0008,  // 3
  0x0018,  // 4
  0x0040,  // 5
  0x0050,  // 6
  0x0048,  // 7
  0x0058,  // 8
  0x0400,  // 9
  0x0410,  // 10
  0x0408,  // 11
  0x0418,  // 12
  0x0440,  // 13
  0x0450,  // 14
  0x0448,  // 15
  0x0458,  // 16

unsigned int cmndCode[] = {
  0x0000,  // ON
  0x0020,  // OFF
  0x0088,  // 20% BRIGHT (0x00A8=5%)
  0x0098,  // 20% DIM    (0x00B8=5%)

void setup() {
  pinMode(RTS_pin,OUTPUT);             // onboard LED
  pinMode(DTR_pin,OUTPUT);             // output pin of touch sensor

void loop(){   // Sample Commands

void xmitCM17A(char house, byte device, byte cmnd){
  unsigned int dataBuff = 0;
  byte messageBuff[5];

  // Build Message by ORing the parts together. No device if Bright or Dim
  if(cmnd == ON | cmnd == OFF){
    dataBuff = (houseCode[house-'A'] | deviceCode[device-1] | cmndCode[cmnd]);
  else dataBuff = houseCode[house-'A'] | cmndCode[cmnd];

  // Build a string for the whole message . . .
  messageBuff[0] = 0xD5;               // Header byte 0 11010101 = 0xD5 
  messageBuff[1] = 0xAA;               // Header byte 1 10101010 = 0xAA 
  messageBuff[2] = dataBuff >> 8;      // MSB of dataBuff
  messageBuff[3] = dataBuff & 0xFF;    // LSB of dataBuff
  messageBuff[4] = 0xAD;               // Footer byte 10101101 = 0xAD

    // Now send it out to CM17A . . .
  digitalWrite(DTR_pin,LOW);             // reset device - both low is power off

  digitalWrite(DTR_pin,HIGH);             // standby mode - supply power
  delay(35);                           // need extra time for it to settle

  for (byte i=0;i<5;i++){
    for( byte mask = 0x80; mask; mask >>=1){
      if( mask & messageBuff[i]) digitalWrite(DTR_pin,LOW);  // 1 = RTS HIGH/DTR-LOW
      else digitalWrite(RTS_pin,LOW);                        // 0 = DTR-HIGH/RTS-LOW
      delay(BIT_DELAY);                // delay between bits

      digitalWrite(DTR_pin,HIGH);      // wait state between bits
  delay(1000);                         // wait required before next xmit

That probably will work, once the right hardware arrives in the mail. ]:)

I have a CM11A, their computer interface. DOH! Researching online, it doesn't work with the libraries for the TW523 and PSC05 stuff. They don't sell those two new any-longer (or are scalped really expensive) so I bought two of the rf transceivers to work with the CM17 thingie I have.

I have the cm17, just not the transceivers.

So, root cause is incorrect hardware.