Go Down

Topic: DOIS CODIGOS EM UM (Read 835 times) previous topic - next topic

Flecho

Boas pessoal! obrigado sempre por a ajuda que estao a prestarme,eu ajudo com o que sei que nao e muito,preciso de que me ajudem a juntar dois códigos em um,pois nao sei como fazer .


Obrigado.

código nº1

Code: [Select]
//  04/07/12 Probado y modificado por Guillermo Fernández - Juan Pablo Sánchez
//  para que dia/mes//hora/min/seg aparezca en el LCD con un "0" delante del número
//  en caso que sea menor que 10...


//  Se aceptan sugerencias y/o modificaciones.


#include <LiquidCrystal.h>
#include <Wire.h>
#include "RTClib.h"

// Connección del LCD:
// rs (LCD pin 4) to Arduino pin 12
// rw (LCD pin 5) to Arduino pin 11
// enable (LCD pin 6) to Arduino pin 10
// LCD pin 15 to Arduino pin 13
// LCD pins d4, d5, d6, d7 to Arduino pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

// Conexión del RTC:
// Pin Sda al pin A4 del arduino
// Pin Scl al pin A5 del arduino
// También como en cualquier módulo, se deben conectar VCC y GND.
RTC_DS1307 RTC;

int backLight = 13;    // pin 13 will control the backlight

const int ledA1 = A1;
const int ledA2 = A2;
const int led3 = 4;

int state = 0;

void setup()
{
  Serial.begin(57600);
  Wire.begin();
  RTC.begin();

  pinMode (ledA1,OUTPUT);
  pinMode (ledA2,OUTPUT);
  pinMode (led3,OUTPUT);
  digitalWrite(ledA1,HIGH);
  digitalWrite (ledA2,HIGH);
  digitalWrite (led3,HIGH);

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }

  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, HIGH); // turn backlight on. Replace 'HIGH' with 'LOW' to turn it off.
  lcd.begin(16,2);              // columns, rows.  use 16,2 for a 16x2 LCD, etc.
  lcd.clear();                  // start with a blank screen
}

void loop()
{
  DateTime now = RTC.now();
  int seconds;
  int last_seconds;
  seconds = now.second();

  lcd.clear();
  lcd.setCursor(3,0);
  if(now.day() < 10)
  {   
    lcd.print("0");
  }
  lcd.print(now.day(), DEC);
  lcd.print('/');
  if(now.month() < 10)
  {   
    lcd.print("0");
  }
  lcd.print(now.month(), DEC);
  lcd.print('/');
  lcd.print(now.year(), DEC);
  lcd.setCursor(4,1);
  if(now.hour() < 10)
  {   
    lcd.print("0");
  }
  lcd.print(now.hour(), DEC);
  lcd.print(':');
  if(now.minute() < 10)
  {   
    lcd.print("0");
  }
  lcd.print(now.minute(), DEC);
  lcd.print(':');
  if(now.second() < 10)
  {   
    lcd.print("0");
  }
  lcd.print(now.second(), DEC);

  if (seconds != last_seconds) {
    state = !state;
    last_seconds = seconds;
  }

  if (state == 0) {
    digitalWrite(ledA1,HIGH);
    digitalWrite (ledA2,HIGH);
    digitalWrite (led3,HIGH);
  }
  else {
    digitalWrite(ledA1,LOW);
    digitalWrite (ledA2,LOW);
    digitalWrite (led3,LOW);
  }

  delay(1000);
}



código nº2

Code: [Select]
/*

     En este proyecto movemos un servo de 0 a 180 grados y despues en sentido inverso

     Para hacerlo utilizamos la biblioteca Servo

   */

   #include <Servo.h>   // incluimos la biblioteca Servo

   Servo miservo;       // creamos un objecto servo para controlar el motor

   void setup() {
             miservo.attach(9);  // liga el servo al pin 9
}

   void loop() {
     for(int angulo = 0; angulo < 180; angulo += 1) {   //  un ciclo para mover el servo entre los 0 y los 180 grados 
      miservo.write(angulo);               //  manda al servo la posicion
      delay(250);                        //  espera unos milisegundos para que el servo llegue a su posicion
   }

   for(int angulo = 180; angulo >= 1; angulo -= 1)    {   //  un ciclo para mover el servo entre los 180 y los 0 grados                             
      miservo.write(angulo);                 //  manda al servo la posicion
      delay(250);                          //  espera unos milisegundos para que el servo llegue a su posicion
   }
         }

luisilva

O que pede não dá para fazer, pelo menos da maneira directa (juntando os dois programas). Para isso funcionar bem, a movimentação do servo deveria ser feita com a função millis() e não com o delay(). Fazendo umas contas rápidas:
- em cada iteração do ciclo for faz uma espera de 250ms;
- é percorrido um ângulo de 180º;
- os incrementos do ângulo são de 1º;
- são feitos dois varrimentos (um no sentido crescente e outro no sentido decrescente);
isto quer dizer, que este varrimento feito pelo servo vai demorar: 2 x 180 x 250 ms = 90 000ms = 90s

Ou seja, o relógio vai mostrar a hora e vai iniciar o varrimento. O varrimento demora 1m30s e só depois é que é novamente actualizado o relógio.

Dê uma vista de olhos ao exemplo "Blink Without Delay", é essa filosofia que precisa para fazer os varrimentos com o servo.

Flecho

Muito obrigado luisilva,mas eu de programaçao noa sei nada os projetos que eu ja fiz sao copiados de outras web,aprendo poco a poco como as variantes e pouco mais,sao ja 50 anos e isto custa a minha idade aprender.



Novamente obrigado.



Flecho.

luisilva

Deveria ser qualquer coisa deste género:
Code: [Select]

//  04/07/12 Probado y modificado por Guillermo Fernández - Juan Pablo Sánchez
//  para que dia/mes//hora/min/seg aparezca en el LCD con un "0" delante del número
//  en caso que sea menor que 10...


//  Se aceptan sugerencias y/o modificaciones.


#include <LiquidCrystal.h>
#include <Wire.h>
#include "RTClib.h"

#include <Servo.h>   // incluimos la biblioteca Servo

// Connección del LCD:
// rs (LCD pin 4) to Arduino pin 12
// rw (LCD pin 5) to Arduino pin 11
// enable (LCD pin 6) to Arduino pin 10
// LCD pin 15 to Arduino pin 13
// LCD pins d4, d5, d6, d7 to Arduino pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

// Conexión del RTC:
// Pin Sda al pin A4 del arduino
// Pin Scl al pin A5 del arduino
// También como en cualquier módulo, se deben conectar VCC y GND.
RTC_DS1307 RTC;

int backLight = 13;    // pin 13 will control the backlight

const int ledA1 = A1;
const int ledA2 = A2;
const int led3 = 4;

int state = 0;

Servo miservo;       // creamos un objecto servo para controlar el motor
int angulo = 0;
int direccion = 0;

////////////////////////
unsigned long currentMillis;
unsigned long previousMillis_clock = 0;
unsigned long previousMillis_servo = 0;
const unsigned long interval_clock = 1000;
const unsigned long interval_servo = 250;

void setup()
{
  Serial.begin(57600);
  Wire.begin();
  RTC.begin();

  pinMode (ledA1,OUTPUT);
  pinMode (ledA2,OUTPUT);
  pinMode (led3,OUTPUT);
  digitalWrite(ledA1,HIGH);
  digitalWrite (ledA2,HIGH);
  digitalWrite (led3,HIGH);

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }

  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, HIGH); // turn backlight on. Replace 'HIGH' with 'LOW' to turn it off.
  lcd.begin(16,2);              // columns, rows.  use 16,2 for a 16x2 LCD, etc.
  lcd.clear();                  // start with a blank screen
 
  miservo.attach(9);  // liga el servo al pin 9
}

void loop()
{
  currentMillis = millis();

  if(currentMillis - previousMillis_clock > interval_clock) {

    previousMillis_clock = currentMillis;   

    DateTime now = RTC.now();
    int seconds;
    int last_seconds;
    seconds = now.second();

    lcd.clear();
    lcd.setCursor(3,0);
    if(now.day() < 10)
    {   
      lcd.print("0");
    }
    lcd.print(now.day(), DEC);
    lcd.print('/');
    if(now.month() < 10)
    {   
      lcd.print("0");
    }
    lcd.print(now.month(), DEC);
    lcd.print('/');
    lcd.print(now.year(), DEC);
    lcd.setCursor(4,1);
    if(now.hour() < 10)
    {   
      lcd.print("0");
    }
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    if(now.minute() < 10)
    {   
      lcd.print("0");
    }
    lcd.print(now.minute(), DEC);
    lcd.print(':');
    if(now.second() < 10)
    {   
      lcd.print("0");
    }
    lcd.print(now.second(), DEC);

    if (seconds != last_seconds) {
      state = !state;
      last_seconds = seconds;
    }

    if (state == 0) {
      digitalWrite(ledA1,HIGH);
      digitalWrite (ledA2,HIGH);
      digitalWrite (led3,HIGH);
    }
    else {
      digitalWrite(ledA1,LOW);
      digitalWrite (ledA2,LOW);
      digitalWrite (led3,LOW);
    }
  }
 
  if(currentMillis - previousMillis_servo > interval_servo) {
    previousMillis_servo = currentMillis;   
   
    miservo.write(angulo);               //  manda al servo la posicion
    if (direccion == 0) {
      if (++angulo >= 180) {
        angulo = 180;
        direccion = 1;
      }
    }
    else if (direccion == 1) {
      if (--angulo <= 0) {
        angulo = 0;
        direccion = 0;
      }
    }
  }
}


Não testei, por isso não sei se funciona como é pretendido.

Flecho

#4
Jun 06, 2015, 08:53 pm Last Edit: Jun 06, 2015, 09:04 pm by Flecho
Fico muito agradecido ;) ,de momento o código nao da erro algum,logo eu au montar o projeto ja vou vendo,mas de momento era o que eu quería.


Obrigado.

Flecho.

moohsjc

Olá sou novo no forum e necessito juntar dois projetos em um único Arduino alguem poderia  me ajudar? obrigado.

moohsjc

Olá sou novo no forum e necessito juntar dois projetos em um único Arduino alguem poderia  me ajudar? obrigado.

bubulindo

Que é que já fizeste e que é que precisas fazer?
This... is a hobby.

moohsjc

Estou pesquisando sobre a função Threads, tudo na tentativa de simular uma multitarefa! será que este é o caminho a ser seguido? agradeço desde já pela atenção de todos!

1º Código RF 433mhz

#include <RFremote.h>

const char *cmd = "here goes your command captured from RFrecvDemo";

RFrecv rfrecv;

void setup()
{
  Serial.begin(9600);
  delay(500);
  Serial.println("INICIADO!");
 
  rfrecv.begin();
}

void loop() {
 
  if (rfrecv.available())
 
    if (strncmp((char*)rfrecv.cmd, cmd, CMD_SIZE) == 0)
   
      Serial.println("COMANDO CORRETO!");
   
    else
   
      Serial.println("ERRO!");
   
  }

//==========================================


2º Código RFID 13,56mhz

#include <SPI.h>   
#include <MFRC522.h> 

#define greenLed 7     
#define redLed   5     
#define yellowLed 6   
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);   

byte myCards[] = {0xEE,0x29,0x43,0x14,   //Metropolitando
                  0x58,0x79,0x83,0x10};  //Llavero azul
                 
int successRead;     

byte dummy = 0x00;

byte readCard[4];     




void setup() {
 
  pinMode(greenLed,OUTPUT); 
  pinMode(redLed,OUTPUT);
  pinMode(yellowLed,OUTPUT);
 
  //Initializing everingthing
 
  Serial.begin(9600);                            
  SPI.begin();                                  //Iniciamos protocolo SPI
  mfrc522.PCD_Init();                             
  mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
   Serial.println("IDENTIFIQUESE...");
}


void loop () {
  do{
   
    digitalWrite(yellowLed,HIGH);
    delay(500);
    digitalWrite(yellowLed,LOW);
    delay(500);
    successRead = getID();
  }
 
 
  while (!successRead);    //Esperando que haya una comunicación con la tarjeta
 
  if (readCard[0] == myCards[4] && readCard[1] == myCards[5]
  && readCard[2] == myCards[6] && readCard[3] == myCards[7])              //checking for blue card
  {   
   
    Serial.println("Liberado, bem vindo!");
   
   Success();
   
   for(int i = 0; i<4; i++) dummy = readCard;   // removing previous stored value from the readCard variable
   
   successRead = 0;
  }else if(readCard[0] == myCards[0] && readCard[1] == myCards[1]
  && readCard[2] == myCards[2] && readCard[3] == myCards[3])            //checking for white card
  {
    Serial.println("Bienvenido al Metropolitano");
   
    Success();     
   
    for(int i = 0; i<4; i++) dummy = readCard
  }
  else {
 
    Error();      //calling the error function
  }
}

int getID() {
  // Getting ready for Reading PICCs
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return 0;
  }

  Serial.println("");
  for (int i = 0; i < 4; i++) {  //
    readCard = mfrc522.uid.uidByte;
    Serial.print(readCard, HEX);
  }
 
  Serial.println("");
  mfrc522.PICC_HaltA();
  return 1;
}

void Success(){
  digitalWrite(greenLed,HIGH);
  delay(2000);
  digitalWrite(greenLed,LOW);
  delay(500);
}

void Error(){
  Serial.println("USUARIO NO IDENTIFICADO");
 
    digitalWrite(redLed,HIGH);
    delay(2000);
    digitalWrite(redLed,LOW);
    delay(500);
 
 
}


bubulindo

O que pretendes fazer? Que requisitos em termos de tempos de resposta é que a tua aplicação vai ter para necessitares de multi tarefa?
This... is a hobby.

moohsjc

Olá bubulindo eu chequei unir os dois códigos porém o programa não passa pelo codigo do Rf433 pois ele fica preso no loop do 13,56mhz, como estou aprendendo programar não achei uma solução para isso então andei pesquisando sobre multi tarefa na tentativa de organizar e melhorar o código do projeto final, seria possível o codigo correr entre os dois processo a cada 1 segundo? obrigado pela ajuda!

bubulindo

A maneira de obteres ajuda é colocares aqui o que já fizeste e explicar qual é o erro ou que funcionalidade ao certo é que não está a acontecer.

This... is a hobby.

Go Up