Open the part, resetting the Arduino. Immediately send a message, which will be lost as the Arduino isn't ready to receive serial data yet. Sleep for a second, while the Arduino boots up. See if there is any serial data (there may not be any). Then, close the port, resetting the Arduino again.
Still no reply to PHP before executing the python script...
Reboot router > connect Arduino > execute PHP = no reply
Reboot router > connect Arduino > execute python script > execute PHP = got reply from arduino
I forgot to mention that i've uploaded a custom firmware for Atmega8u2 to disable auto reset
http://www.tinkerin.gs/2011/03/arduino-auto-reset-software-fix.htmlHere is my full sketch:
int tempPin = 0;
int ledMode = 1;
int ledArray[] = {
2, 3, 4, 5, 6, 7};
int count = 0;
void setup()
{
analogReference(INTERNAL);
Serial.begin(115200);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
}
void loop()
{
if (ledMode == 1)
ledTemp();
else if (ledMode == 2)
ledKnightRider();
else
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
}
delay(1);
}
void serialEvent()
{
incomingSerial();
}
void ledTemp()
{
float temp = getTemp();
if (temp > 31)
{
arrLed(5);
}
else if (temp > 29)
{
arrLed(4);
}
else if (temp > 27)
{
arrLed(3);
}
else if (temp > 25)
{
arrLed(2);
}
else
{
arrLed(1);
}
}
void ledKnightRider()
{
}
void arrLed(int leds)
{
int idx = 2;
int offset = 2;
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
for (idx = 2; idx < leds+offset; idx++)
digitalWrite(idx, HIGH);
}
int getTemp()
{
int tempC;
int reading;
reading = analogRead(tempPin); //LM35
tempC = reading / 10;
return tempC;
}
int getLedMode()
{
return ledMode;
}
void blinkLed()
{
}
void incomingSerial()
{
int numSerial;
if (Serial.available() > 0)
{
char data = Serial.read();
switch (data)
{
case 'l':
numSerial = incomingSerialNumber();
if (numSerial >= 0)
{
Serial.print("LED Mode: ");
switch (numSerial)
{
case 0:
ledMode = 0;
Serial.print("OFF");
break;
case 1:
ledMode = 1;
Serial.print("TEMP");
break;
case 2:
ledMode = 2;
Serial.print("KR");
break;
}
}
else
Serial.print(ledMode);
break;
case 't':
Serial.print(getTemp());
break;
case 's':
Serial.print(getTemp());
Serial.print("|");
Serial.print(getLedMode());
}
}
}
int incomingSerialNumber()
{
char num[8];
unsigned char index=0;
delay(10);
while(Serial.available() > 0)
{
delay(10);
num[index++] = Serial.read();
if(index > 6)
{
break;
}
}
num[index]=0;
if (index > 0)
return atoi(num);
else
return -1;
}
Updated PHP code:
$serial = new phpSerial;
$serial->deviceSet("/dev/ttyACM0");
$serial->confBaudRate(115200);
$serial->deviceOpen();
sleep(1);
$serial->sendMessage($cmd);
sleep(1);
$read = $serial->readPort();
$serial->deviceClose();
Thanks.