Estoy intentando conectar el PSOC5 LP097 con el sensor PIR para activar el motor paso a paso para mi sistema de comedero para mascotas. Además, cada vez que el sensor PIR detecta un movimiento, trato de enviar un correo usando PySerial.
El problema al que me estoy enfrentando actualmente es que la salida del sensor PIR siempre es alta cuando intento leerlo a través del software. Intenté conectar un LED a la salida del sensor PIR y se activa solo cuando hay un movimiento en frente del sensor. Sin embargo, no entiendo por qué el software lo lee como HIGH
siempre y sigue activando el motor paso a paso
Debajo está mi código:
#define MaxCountForTurns 300 //count for 2 rotations of the motor
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
uint16 onCount = 0x00;
uint16 offCount = 0x00;
uint8 gateClose = 0x00;
uint8 motorON = 0x00;
uint8 pirValue = 0x00;
UART_Start();
for(;;)
{
if (gateClose == 0x00) {
pirValue |= pirInput_Read();
}
if ((pirValue & 0x01) && (motorON == 0)) {
motorON = 0x01;
UART_PutString("Pet movement detected : Motor will be turned ON\n");
CyDelay(10);
}
if(motorON) {
onCount++;
Control_Reg_Write(0x0c);
CyDelay(10);
Control_Reg_Write(0x06);
CyDelay(10);
Control_Reg_Write(0x03);
CyDelay(10);
Control_Reg_Write(0x09);
CyDelay(10);
}
if (gateClose) {
offCount++;
Control_Reg_Write(0x09);
CyDelay(10);
Control_Reg_Write(0x03);
CyDelay(10);
Control_Reg_Write(0x06);
CyDelay(10);
Control_Reg_Write(0x0c);
CyDelay(10);
}
// turns in fwd direction
if(onCount > MaxCountForTurns) {
motorON = 0x00;
onCount = 0x00;
pirValue = 0x00;
CyDelay(50);
gateClose = 0x01;
}
// turns in reverse direction
if(offCount > MaxCountForTurns) {
gateClose &= 0x00;
}
}
}
El código de Python para enviar el correo:
import time
import serial
import smtplib
TO = '[email protected]'
GMAIL_USER = '[email protected]'
GMAIL_PASS = 'psoc_pir_pet_feeder'
SUBJECT = 'Pet Feeder System Alert!!'
TEXT = 'PIR sensor detected pet movement, Motor will be turned ON'
ser = serial.Serial('COM2', 9600)
def send_email():
print("Sending Email")
smtpserver = smtplib.SMTP("smtp.gmail.com",587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo
smtpserver.login(GMAIL_USER, GMAIL_PASS)
header = 'To:' + TO + '\n' + 'From: ' + GMAIL_USER
header = header + '\n' + 'Subject:' + SUBJECT + '\n'
print header
msg = header + '\n' + TEXT + ' \n\n'
smtpserver.sendmail(GMAIL_USER, TO, msg)
smtpserver.close()
while True:
message = ser.readline()
print(message)
if message[0] == 'P' :
send_email()
time.sleep(0.5)
He intentado hacer el mismo proyecto con arduino UNO y funcionó perfectamente. Sin embargo aquí veo las siguientes observaciones:
-
El motor gira en dirección fwd una vez e invierte la dirección una vez.
-
Más adelante, el motor sigue girando en la dirección de fwd.
-
en PySerial:
Pet movement detected : Motor will be turned ON
el mensaje se muestra continuamente. El correo no se está enviando a la identificación del correo electrónico.
Me doy cuenta de que la lectura PIR que intento hacer no es correcta. Sin embargo, no me doy cuenta de cómo hacerlo de manera eficiente. La segunda pregunta está relacionada con el piserial. Supongo que el puerto serie está ocupado con la respuesta recibida de PSOC5 y, por lo tanto, no procede a enviar un correo electrónico a la dirección especificada. ¿Podría alguno de ustedes ayudar?
Editar: He solucionado los problemas de giro del motor, un error simple en la implementación relacionada con el offCount
. Sin embargo, todavía estoy atascado en la parte pyserial del proyecto. No se envía ningún correo electrónico a la dirección de correo electrónico. Las sugerencias son muy apreciadas.