У меня есть код Python, который отправляет шаблон, в котором должен мигать индикатор. (Скажем, например, 101010. Шаблон может меняться при каждом запуске кода). когда он выполняет это бесконечно, я хочу, чтобы прерывание (снова посылаемое кодом Python) сохраняло текущие условия источников света (скажем, он запускает 1 из последовательности) и выполняло определенную задачу, такую как выключение источников света на 10 секунд и затем возобновите последовательность.
Один из способов сделать это - прервать программу, установив высокий уровень на выводе прерывания. Вопрос в том, может ли это сделать высокий / низкий уровень, контролируемый писериалом.
Таким образом, простой псевдокод будет:
PYTHON часть кода:
Read the sequence:
Send the sequence to the arduino board using pyserial.
while(1)
{
Run a timer for 15 second.
When the timer overflows interrupt the arduino.
}
ARDUINO часть кода:
Read the sequence
while (1)
{
keep repeating the sequence on the LED.
}
// if interrupted on pin2 // assuming pin2 has the interrupt procedure
// Pyserial has to enable the interrupt WITHOUT using a switch for enabling the pin.
ISR
{
Save the present state of execution.
Turn off the LED.
}
ДЛЯ ЛУЧШЕГО ПОНИМАНИЯ:
Я создал небольшие коды, чтобы показать мои сомнения:
Код для ARDUINO:
int ledpin1 = 13;
int speedy;
int patterns;
void setup()
{
Serial.begin(9600);
Serial.print("Program Initiated: \n");
pinMode(ledpin1,OUTPUT);
//activate the blackout ISR when a interrupt is achieved at a certain pin. In this case pin2 of the arduino
attachInterrupt(0,blackout,CHANGE);
}
void loop()
{
if (Serial.available()>1)
{
Serial.print("starting loop \n");
patterns = Serial.read();
patterns = patterns-48;
speedy = Serial.read();
speedy = (speedy-48)*1000;
while(1)
{
patterns = !(patterns);
Serial.print(patterns);
digitalWrite(ledpin1,patterns);
delay(speedy);
}
}
}
/*
void blackout()
{
// ***Save the present state of the LED(on pin13)***
Serial.print ("The turning off LED's for performing the python code\n");
digitalWrite(ledpin,LOW);
//wait for the Python code to complete the task it wants to perform,
//so got to dealy the completion of the ISR
delay(2000);// delay the whole thing by 2 seconds
//***Continue with the while loop by setting the condition of the light to the saved condition.***
}
*/
=============================================== ===================================
КОД ДЛЯ ФАСАДА ПИТОНА:
import serial
import time
patterns=1
speedy=1
ser = serial.Serial()
ser.setPort("COM4")
ser.baudrate = 9600
ser.open()
def main():
if (ser.isOpen()):
#while(1):
ser.write(patterns)
ser.write(speedy)
blackoutfunc()
#ser.close()
def blackoutfunc():
while(1):
time.sleep(2)
print "Performing operations as required"
=============================================== ================================
Теперь у меня возникли вопросы:
1) Существует ли способ активировать «отключение ISR» в зависимости от состояния вывода (в данном случае это вывод 2, который является выводом INT0) без использования физического переключателя, присутствующего на выводе. Следовательно, программное обеспечение должно управлять состоянием контакта.
2) Можно ли выполнять операции, указанные в комментариях к функциям затемнения?
3) В коде Python возможно только один раз отправить данные (т. Е. Шаблоны, быстро) и заставить arduino выполнять шаблон бесконечным образом без повторной отправки данных командой serial.write
. Следовательно, избегая цикла while(1)
после ser.isOpen()
.