Python Arduino Yun-从.ino脚本调用的进程崩溃
我有一个python脚本在循环中运行。每当它通过桥接器传递值2、3或4时(从.ino脚本触发中继),python脚本就会崩溃 基本上,我看到我的relayValue在串行监视器中打印,然后我多次看到“再次启动.py脚本”,我的继电器从未触发 奇怪的是,我可以使用PuTTY通过SSH连接到Yun中,并手动调用我的python脚本,这样就可以了。当我尝试从arduino自动启动python脚本时,python脚本不起作用 Python脚本:Python Arduino Yun-从.ino脚本调用的进程崩溃,python,arduino-yun,Python,Arduino Yun,我有一个python脚本在循环中运行。每当它通过桥接器传递值2、3或4时(从.ino脚本触发中继),python脚本就会崩溃 基本上,我看到我的relayValue在串行监视器中打印,然后我多次看到“再次启动.py脚本”,我的继电器从未触发 奇怪的是,我可以使用PuTTY通过SSH连接到Yun中,并手动调用我的python脚本,这样就可以了。当我尝试从arduino自动启动python脚本时,python脚本不起作用 Python脚本: from ftplib import FTP import
from ftplib import FTP
import datetime
import sys
sys.path.insert(0, '/usr/lib/python2.7/bridge')
from bridgeclient import BridgeClient as bridgeclient
from time import sleep
# Initialize vars
ftpIP = 'XXXXXXXXXXXXXX' # Internal IP
# ftpIP = 'XXXXXXXXXXXXXXXXX' #External IP
ftpDirectory = '3990548'
value = bridgeclient()
value.put('relay', '0')
status = 'Disarmed'
# Initialize FTP
ftp = FTP(ftpIP)
ftp.login(XXXXXXXXXXXXXXXXXXX)
ftp.cwd(ftpDirectory)
# Loop
while (1):
#Don't eat all CPU cycles
sleep(0.01)
# Define minute and second, each loop iteration
rawTime = datetime.datetime.now()
fmtTime = rawTime.strftime("%m/%d/%Y %H:%M:%S")
date = datetime.date.today()
hour = rawTime.hour
minute = rawTime.minute
second = rawTime.second
month = date.month
day = date.day
year = date.year
fileDate = rawTime.strftime("%m%d%y")
fileName = '{}.txt'.format(fileDate)
filePath = 'tadtest/{}'.format(fileName)
# Keep FTP alive
if (second == 30):
ftp.voidcmd('NOOP')
value.put('relay', '9')
print value.get('relay')
sleep(1)
value.put('relay', '0')
### Alarm System ###
if (second <= 5 and (minute == 0 or minute == 20 or minute == 40)):
# Write to file
with open(filePath, "a+") as myFile:
myFile.write('SensorAlarm, {}\n'.format(fmtTime))
if (status == 'Disarmed'):
# Trigger Keyfob Relay Arm (3)
value.put('relay', '3')
print value.get('relay')
sleep(5)
value.put('relay', '0')
print "Arm"
status = 'Armed'
elif (status == 'Armed'):
# Trigger Contact Sensor Relay
value.put('relay', '2')
print value.get('relay')
sleep(5)
value.put('relay', '0')
print "Alarm"
status = 'Armed'
else:
print "Error in Alarm (Arm) 'if' statement"
# Write to FTP
ftp.storbinary('STOR {}'.format(fileName), open('/mnt/sda1/{}'.format(filePath), 'rb'))
### Disarm System ###
if (second <= 5 and (minute == 5 or minute == 25 or minute == 45)):
# Write to file
with open(filePath, "a+") as myFile:
myFile.write('OpeningReport, {}\n'.format(fmtTime))
# Trigger Keyfob Relay Disarm (4)
value.put('relay', '4')
print value.get('relay')
sleep(5)
value.put('relay', '0')
print "Disarm"
status = 'Disarmed'
# Write to FTP
ftp.storbinary('STOR {}'.format(fileName), open('/mnt/sda1/{}'.format(filePath), 'rb'))
### Arm System ###
if (second <= 5 and (minute == 8 or minute == 30 or minute == 50)):
# Write to file
with open(filePath, "a+") as myFile:
myFile.write('ClosingReport, {}\n'.format(fmtTime))
# Trigger Keyfob Relay Arm (3)
value.put('relay', '3')
print value.get('relay')
sleep(5)
value.put('relay', '0')
print "Arm"
status = 'Armed'
# Write to FTP
ftp.storbinary('STOR {}'.format(fileName), open('/mnt/sda1/{}'.format(filePath), 'rb'))
从ftplib导入FTP
导入日期时间
导入系统
sys.path.insert(0,“/usr/lib/python2.7/bridge”)
从bridgeclient将bridgeclient导入为bridgeclient
从时间上导入睡眠
#初始化变量
ftpIP='XXXXXXXXXXXXX'#内部IP
#ftpIP='XXXXXXXXXXXXXXXXXX'#外部IP
FTP目录='3990548'
value=bridgeclient()
value.put('relay','0')
状态=‘解除防护’
#初始化FTP
ftp=ftp(ftpIP)
ftp.login(xxxxxxxxxxxxxxxx)
ftp.cwd(ftp目录)
#环路
而(一):
#不要吃掉所有的CPU周期
睡眠(0.01)
#定义每一次循环迭代的分钟和秒数
rawTime=datetime.datetime.now()
fmtTime=rawTime.strftime(“%m/%d/%Y%H:%m:%S”)
date=datetime.date.today()
小时=rawTime.hour
分钟=rawTime.minute
秒=rawTime.second
月=date.month
day=日期.day
年份=日期。年份
fileDate=rawTime.strftime(“%m%d%y”)
fileName='{}.txt'。格式(fileDate)
文件路径='tadtest/{}'。格式(文件名)
#保持FTP活动
如果(秒=30):
ftp.voidcmd('NOOP')
value.put('relay','9')
打印值。获取('relay')
睡眠(1)
value.put('relay','0')
###报警系统###
如果(秒),另一件奇怪的事情是,串行监视器打印“0”表示0,而打印“99T”表示99。好的,我发现一个问题是我试图发送“99”-2个字节-从python脚本到arduino脚本中的1个字节字符。但是仍然不起作用。好的,还有更多的信息。这里真正的问题是当调用任何中继时,.py脚本崩溃-但是只有在从arduino端调用脚本时才会发生崩溃。
#include <Bridge.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
//Define LCD variables
#define TFT_CS 7
#define TFT_RST 8
#define TFT_DC 9
#define TFT_SCLK 10
#define TFT_MOSI 11
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
int crsr=0;
uint16_t mcolor=ST7735_RED;
Process p;
//Here we hold values coming from the bridge
char relayValue[2] = {0};
int previousRelayInt = 100;
void setup() {
Bridge.begin();
Serial.begin(9600);
//Relay pins
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(13, OUTPUT);
//Zero out memory used for relay value
memset(relayValue, 0, 2);
//Initialize pins
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(13, LOW);
//Initialize screen to be black
tft.initR(INITR_BLACKTAB);
tft.fillScreen(ST7735_BLACK);
}
void loop() {
if (p.running()==0)
{
p.runShellCommandAsynchronously("python /mnt/sda1/ftp_test.py");
Serial.println("Started .py script again");
}
Bridge.get("relay", relayValue, 2);
int relayInt = atoi(relayValue);
if (relayInt==previousRelayInt)
{
}
else if (relayInt!=previousRelayInt)
{
printTFT(relayValue);
Serial.println(relayValue);
previousRelayInt = relayInt;
}
if (relayInt == 0)
// Do nothing
{
}
else if (relayInt == 2)
//Trigger Contact Sensor - Alarm
{
digitalWrite(2, LOW);
printTFT(relayValue);
delay(4000);
digitalWrite(2, HIGH);
delay(4000);
mediaAlarm();
}
else if (relayInt == 3)
//Trigger Keyfob - Arm
{
digitalWrite(3, HIGH);
printTFT(relayValue);
delay(4000);
digitalWrite(3, LOW);
delay(4000);
mediaArm();
}
else if (relayInt == 4)
//Trigger Keyfob - Disarm
{
digitalWrite(4, HIGH);
printTFT(relayValue);
delay(4000);
digitalWrite(4, LOW);
delay(4000);
mediaDisarm;
}
else if (relayInt == 9)
//Blink LED
{
digitalWrite(13, HIGH);
printTFT(relayValue);
delay(4000);
digitalWrite(13, LOW);
delay(4000);
}
}