ar o comando via controle remoto, ai ele ligaria o pc, tv/monitor e o HT, cheguei nesse codigo.
#include <IRremote.h> //Funcoes de infra vermelho
IRsend irsend; // Para poder enviar o sinal infravermelhor, usa-se a porta 3
int RECV_PIN = 2 ; // Pino que esta recebendo o comando do controle int rele_pin = 10;IRrecv irrecv(RECV_PIN);decode_results results;int ligado =0 ; unsigned int HT[68] ={ 4500, 4450, 550, 1650, 600, 1650, 600, 500, 550, 550, 550, 550, 600, 500, 600, 1650, 550, 550, 550, 1700, 550, 1700, 550, 550, 550, 550, 550, 1650, 600, 550, 550, 1650, 600, 500, 600, 1650, 550, 550, 550, 550, 550, 550, 600, 500, 600, 550, 550, 550, 550, 550, 550, 550, 550, 1650, 600, 1650, 550, 1700, 550, 1700, 550, 1650, 600, 1650, 550, 1700, 550 };unsigned int TV [68] = {4500, 4400, 650, 1600, 600, 1600, 650, 1600, 600, 550, 550, 550, 550, 550, 550, 550, 600, 500, 600, 1650, 550, 1650, 600, 1650, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 1650, 600, 500, 600, 500, 600, 550, 550, 550, 550, 550, 550, 550, 600, 1600, 600, 550, 550, 1650, 600, 1650, 600, 1650, 550, 1650, 600, 1650, 600, 1650, 600};
void setup(){Serial.begin(9600);irrecv.enableIRIn(); //Inicia o receptor infra vermelhopinMode(rele_pin, OUTPUT);digitalWrite(rele_pin,LOW);} void loop() { if (irrecv.decode(&results) ) { long int hexCode = results.value; switch(results.value) { case 16753245 : if(ligado==0){ irsend.sendRaw(HT, 68, 32); delay(200); irsend.sendRaw(TV, 68, 32); delay(200); Serial.println("Ligar pc"); digitalWrite(rele_pin,HIGH); ligado=1; } else if(ligado==1) { digitalWrite(rele_pin,LOW); irsend.sendRaw(HT, 68, 32); delay(200); irsend.sendRaw(TV, 68, 32); delay(200); Serial.println("Desligar pc"); ligado=0; } break; } irrecv.resume(); } delay(500); }
O problema é que eu dou o comando pelo controle ele executa o primeiro if, e faz as instruçoes, porem se eu clicar denovo ele nao responde, parece que depois que ele envia um IR ele nao consegue receber um novo comando pelo receptor Ir dele. Se eu colocar pra ele receber via serial, funciona perfeitamente. Pelo que me pareceu ele nao consegue trabalhar com receber e enviar sinal IR. Deixei algo faltando no codigo? Alguem ja teve alguma experiencia parecida?
Obrigado pela atenção pessoal.
…
duvida de como implementar as partes em Vermelho no Pic16f877a com o Mplab X e o XC8
Deste já agradeço pela atenção. Obrigado
// PPM Encoder Joystick to Futaba Trainer Port // For use with Arduino Mega V1.0 // Ian Johnston 29/04/2010 // Version 1.1 int AI_Pin_AEL = 6; // Ana In - Aeleron potentiometer (Ana In Ch.0 playing up?) int AI_Pin_ELE = 1; // Ana In - Elevator potentiometer int AI_Pin_THR = 2; // Ana In - Throttle potentiometer int AI_Pin_RUD = 3; // Ana In - Rudder potentiometer int AI_Pin_TIpot = 4; // Ana In - TI potentiometer int AI_Raw_AEL; // Ana In raw var - 0->1023 int AI_Raw_ELE; // Ana In raw var - 0->1023 int AI_Raw_THR; // Ana In raw var - 0->1023 int AI_Raw_RUD; // Ana In raw var - 0->1023 int AI_Raw_TIpot; // Ana In raw var - 0->1023 int AI_AEL; // Ana In var - 0->1023 compensated int AI_ELE; // Ana In var - 0->1023 compensated int AI_THR; // Ana In var - 0->1023 compensated int AI_RUD; // Ana In var - 0->1023 compensated int AI_TIpot; // Ana In var - 0->1023 compensated int Aeleron_uS = 750; // Ana In Ch.0 uS var - Aeleron int Elevator_uS = 750; // Ana In Ch.1 uS var - Elevator int Throttle_uS = 750; // Ana In Ch.2 uS var - Throttle int Rudder_uS = 750; // Ana In Ch.3 uS var - Rudder int TI_uS = 750; // Ana In Ch.4 uS var - TI int TIsw_uS = 750; // Ana In Ch.4 uS var - TI Switch int Fixed_uS = 300; // PPM frame fixed LOW phase int pulseMin = 750; // pulse minimum width minus start in uS int pulseMax = 1700; // pulse maximum width in uS float DualrateMultAel = 0.9; // Dual rate mult float DualrateMultEle = 0.9; // Dual rate mult float DualrateMultThr = 0.9; // Dual rate mult float DualrateMultRud = 0.9; // Dual rate mult float DualrateMultTI = 0.9; // Dual rate mult int DualrateAdjAel = 0; // Dual rate mid adjustment int DualrateAdjEle = 0; // Dual rate mid adjustment int DualrateAdjThr = 0; // Dual rate mid adjustment int DualrateAdjRud = 0; // Dual rate mid adjustment int DualrateAdjTI = 0; // Dual rate mid adjustment int outPinPPM = 10; // digital pin 10 int outPinTEST = 8; // digital pin 8 int inPinD6 = 6; // digital pin 6 int inPinD11 = 11; // digital pin 11 ISR(TIMER1_COMPA_vect) { ppmoutput(); // Jump to ppmoutput subroutine } void setup() { // Serial.begin(9600) ; // Test pinMode(outPinPPM, OUTPUT); // sets the digital pin as output pinMode(inPinD6, INPUT); // sets the digital pin as input digitalWrite(inPinD6, HIGH); // turn on pull-up resistor pinMode(inPinD11, INPUT); // sets the digital pin as input digitalWrite(inPinD11, HIGH); // turn on pull-up resistor // Setup timer TCCR1A = B00110001; // Compare register B used in mode '3' TCCR1B = B00010010; // WGM13 and CS11 set to 1 TCCR1C = B00000000; // All set to 0 TIMSK1 = B00000010; // Interrupt on compare B TIFR1 = B00000010; // Interrupt on compare B OCR1A = 22000; // 22mS PPM output refresh OCR1B = 1000; } void ppmoutput() { // PPM output sub // test pulse - used to trigger scope // digitalWrite(outPinTEST, LOW); // delayMicroseconds(100); // Hold // digitalWrite(outPinTEST, HIGH); // Channel 1 - Aeleron digitalWrite(outPinPPM, LOW); delayMicroseconds(Fixed_uS); // Hold digitalWrite(outPinPPM, HIGH); delayMicroseconds(Aeleron_uS); // Hold for Aeleron_uS microseconds // Channel 2 - Elevator digitalWrite(outPinPPM, LOW); delayMicroseconds(Fixed_uS); // Hold digitalWrite(outPinPPM, HIGH); delayMicroseconds(Elevator_uS); // Hold for Elevator_uS microseconds // Channel 3 - Throttle digitalWrite(outPinPPM, LOW); delayMicroseconds(Fixed_uS); // Hold digitalWrite(outPinPPM, HIGH); delayMicroseconds(Throttle_uS); // Hold for Throttle_uS microseconds // Channel 4 - Rudder digitalWrite(outPinPPM, LOW); delayMicroseconds(Fixed_uS); // Hold digitalWrite(outPinPPM, HIGH); delayMicroseconds(Rudder_uS); // Hold for Rudder_uS microseconds // Channel 5 - TI Switch digitalWrite(outPinPPM, LOW); delayMicroseconds(Fixed_uS); // Hold digitalWrite(outPinPPM, HIGH); delayMicroseconds(TIsw_uS); // Hold for TIsw_uS microseconds // Channel 6 - TI pot digitalWrite(outPinPPM, LOW); delayMicroseconds(Fixed_uS); // Hold digitalWrite(outPinPPM, HIGH); delayMicroseconds(TI_uS); // Hold for TI_uS microseconds // Synchro pulse digitalWrite(outPinPPM, LOW); delayMicroseconds(Fixed_uS); // Hold digitalWrite(outPinPPM, HIGH); // Start Synchro pulse } void loop() { // Main loop // Read analogue ports AI_Raw_AEL = analogRead(AI_Pin_AEL); AI_Raw_ELE = analogRead(AI_Pin_ELE); AI_Raw_THR = analogRead(AI_Pin_THR); AI_Raw_RUD = analogRead(AI_Pin_RUD); AI_Raw_TIpot = analogRead(AI_Pin_TIpot); // Compensate for discrepancy in pot inputs including centering offset. // Also use this to invert inputs if necessary (swap x1 & y1) // y=mx+c, x to y scales to x1 to y1 AI_AEL = map(AI_Raw_AEL, 0, 1023, 1200, 0) - 100; // Invert Aeleron pot and slight centre offset AI_ELE = map(AI_Raw_ELE, 0, 1023, 1200, 0) - 120; // Invert Elevator pot and slight centre offset AI_THR = map(AI_Raw_THR, 0, 1023, 0, 1023) + 0; // Throttle AI_RUD = map(AI_Raw_RUD, 0, 1023, 0, 1023) + 0; // Rudder AI_TIpot = map(AI_Raw_TIpot, 0, 1023, 1023, 0) + 0; // Thermal Intelligence pot (TI) // Map analogue inputs to PPM rates for each of the channels Aeleron_uS = (AI_AEL * DualrateMultAel) + pulseMin + DualrateAdjAel; Elevator_uS = (AI_ELE * DualrateMultEle) + pulseMin + DualrateAdjEle; Throttle_uS = (AI_THR * DualrateMultThr) + pulseMin + DualrateAdjThr; Rudder_uS = (AI_RUD * DualrateMultRud) + pulseMin + DualrateAdjRud; TI_uS = (AI_TIpot * DualrateMultTI) + pulseMin + DualrateAdjTI; // Check limits if (Aeleron_uS <= 750) Aeleron_uS = 750; // Min if (Aeleron_uS >= 1700) Aeleron_uS = 1700; // Max if (Elevator_uS <= 750) Elevator_uS = 750; // Min if (Elevator_uS >= 1700) Elevator_uS = 1700; // Max if (Throttle_uS <= 750) Throttle_uS = 750; // Min if (Throttle_uS >= 1700) Throttle_uS = 1700; // Max if (Rudder_uS <= 750) Rudder_uS = 750; // Min if (Rudder_uS >= 1700) Rudder_uS = 1700; // Max if (TI_uS <= 750) TI_uS = 750; // Min if (TI_uS >= 1700) TI_uS = 1700; // Max if (digitalRead(inPinD6) == 0) { // Low rate DualrateMultAel = 0.5; DualrateMultEle = 0.5; DualrateMultThr = 0.9; DualrateMultRud = 0.7; DualrateMultTI = 0.9; DualrateAdjAel = 200; DualrateAdjEle = 200; DualrateAdjThr = 0; DualrateAdjRud = 100; DualrateAdjTI = 0; } if (digitalRead(inPinD6) == 1) { // Normal/high rate DualrateMultAel = 0.9; DualrateMultEle = 0.9; DualrateMultThr = 0.9; DualrateMultRud = 0.9; DualrateMultTI = 0.9; DualrateAdjAel = 0; DualrateAdjEle = 0; DualrateAdjThr = 0; DualrateAdjRud = 0; DualrateAdjTI = 0; } if (digitalRead(inPinD11) == 1) { // TI Switch TIsw_uS = 1700; } else { TIsw_uS = 750; } }…