Pages: 1 [2]   Go Down
Author Topic: Ajuda com código: String to Char and Others for Fake Paintball Bomb  (Read 1397 times)
0 Members and 1 Guest are viewing this topic.
Portugal
Offline Offline
Edison Member
*
Karma: 27
Posts: 1411
Tomorrow I will know a BIT more than yesterday
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
void teste(valor_A,tipo_A){

 [valor_A]=String(tipo_A);

}
Nao vejo um motivo bom para quereres fazer isso, penso que te vais meter num molho de espinhos.
Vejo que nos teus posts insistes em usar Strings.Secalhar vou ser um pouco radical mas esquece que no arduino existem Strings porque elas provavelmente vao te causar mais problemas que soluçoes.Strings sao objectos e elas devoram a RAM do arduino.Como vens do Java acredito que isso te faça confusao mas tudo que fazes com Strings consegues fazer com array de chars(99% dos casos).So tens de entender a mecanica.
Quanto a tua funçao porque queres fazer açoes dependendo do tipo de dados?
Quanto a mim isso nao faz muito sentido.Explica o que pretendes na pratica
Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Terminei:

https://code.google.com/p/arduino-fake-regressive-paintball-or-airsoft-bomb/

O código é esse:

/*Airsoft and Paintball TIMER Bomb
 Version 1.2
 Creators:
Roberto Santos Reis
Turned into usable code, 12/09/2013:
Aracaju/ Brazil
*/

#include <LiquidCrystal.h>
#include <PS2Keyboard.h>
#include <stdlib.h>

PS2Keyboard keyboard;
LiquidCrystal lcd(22, 25, 26, 27, 28, 29); // START LCD

// Definições
#define LED_RED 7
#define LED_GREEN 6

//Strings
String key;
String password;
// Chars
char entered[15];
char confirma[1] = {};
char pwd[15] = {};
char tmp[15] = {};
char digitado[15] = {};
char startTime[15] = {};
char verifica[15] = {};
char digito;
// Ints
int i = 0;
int loops = 0;
int situacao = 0;
unsigned int timerSeconds;
const int DataPin = 4;
const int IRQpin =  3;
int currentLength = 0;
int qntErros=1;
//long
long interval=1000;
long present;
long previousMillis = 0;







void setup() {

  Serial.begin(9600);
  pinMode(45, OUTPUT); // bg display
  analogWrite(45, 100);
  lcd.begin(16, 2);
  lcd.print(">NOVO CODIGO:");
  lcd.cursor();
  lcd.setCursor(0, 1);
  keyboard.begin(DataPin, IRQpin);
  Serial.begin(9600);
  pinMode(LED_RED, OUTPUT); // sets the digital pin as output
  pinMode(LED_GREEN, OUTPUT); // sets the digital pin as output
  //  CONFIGURAÇÃO DO PASSWORD

  while (situacao == 0) {
    if (keyboard.available()) {
      digito = char(keyboard.read());
      pwd = char(digito);


      if (digito == PS2_ENTER)
      {
        pwd = '\0';
        Serial.println(pwd);
        key = String(pwd);
        Serial.println("pwd=");
        Serial.print(pwd);
        lcd.clear();
        situacao = 1;
      }
      if (digito != '13') {
        lcd.print(digito);
      }
      i++;
    }
    else delay(10);
  }

  lcd.noCursor();
  lcd.clear();
  lcd.print("PWD DEFINIDO");
  lcd.setCursor(0, 1);
  lcd.print(pwd);
  delay(2000);
  lcd.clear();
  lcd.print("DEFINIR MINUTOS");
  lcd.setCursor(0, 1);
  i = 0;
  //  CONFIGURAÇÃO DO TEMPO

  while (situacao == 1) {
    if (keyboard.available()) {
      digito = char(keyboard.read());
      tmp = digito;
      Serial.print("tempo=");
      Serial.println(tmp);

      if (digito == PS2_ENTER)
      {
        tmp = '\0';
        Serial.print(tmp);
        lcd.print(tmp);
        timerSeconds = ((String(tmp).toInt()) * 60);
        lcd.clear();
        situacao = 2;
      }
      if (digito != '13') {
        lcd.print(digito);
      }
      i++;
    }
    else {
      delay(10);
    }
  }

  lcd.noCursor();
  lcd.clear();
  lcd.print("TEMPO DEFINIDO");
  lcd.setCursor(0, 1);
  lcd.print(timerSeconds / 60);
  lcd.print(" minutos");
  delay(2000);
  lcd.noCursor();
  lcd.clear();
  // Contagem Regressiva para começar o jogo
  for (loops = 10; loops > 0; loops--) {
    lcd.setCursor(0, 0);
    lcd.print("Iniciando em:");
    lcd.setCursor(14, 0);
    lcd.print(loops);
    delay(1000);
    lcd.clear();
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("DIGITE O CODIGO");
  lcd.cursor();
  lcd.setCursor(0, 0);
  i=0;
}
void loop() {
  if (keyboard.available()) {
      lcd.setCursor(0, 0);
      Serial.print("               ");

    digito = char(keyboard.read());
    entered[currentLength] = char(digito);

    if (digito != PS2_ENTER) {
      lcd.setCursor(i, 0);
      lcd.print("*              ");
//      lcd.print(digito);
      i++;
      currentLength++;
      
    }else if (digito == PS2_ENTER)    {
      lcd.setCursor(0, 0);
      entered[currentLength] = '\0';
      Serial.println(entered);
      key = entered;
      lcd.clear();
      i = 0;// Reiniciando posicionamento (para o loop)
      currentLength=0; //Reiniciando a coleta de dados do teclado para a variável
    
      if (String(entered) == String(pwd)) { // shortcut to compare an array of bytes, use memcmp(A, B, length), will return 0 if match.

        lcd.noCursor();
        lcd.clear();
        lcd.setCursor(5, 0);
        lcd.print("BOMBA");
        lcd.setCursor(3, 0);
        lcd.print("DESARMADA!");
        
        tone(9, 1200, 4000); //
        delay(10000);
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("REINICIANDO");
        delay(5000);
        lcd.setCursor(0, 1 );
        lcd.print("OK! BOM DIA!");
        currentLength = 0;
        delay(4000); // hold that on screen for 2.5 seconds
        lcd.clear();
        currentLength = 0;
        software_Reset();

      } else if (entered != pwd) {
        if(qntErros<1){
          msgErro();
          lcd.print("PENALIDADE-2:00"); // Display time penalty
          if (timerSeconds > 120) timerSeconds -= 120;
          else timerSeconds = 1; // will trigger BOOM next cycle
          currentLength = 0;
          delay(2500); // hold that on screen for 2.5 seconds
          lcd.clear();
          situacao = 3;
          lcd.setCursor(0,0);
          lcd.print("DIGITE O CODIGO");
        }else if(qntErros==1){
         msgErro();
         interval=50;
         situacao = 3;
         lcd.clear();
         lcd.setCursor(0,0);
         lcd.print("DIGITE O CODIGO");
        }else if(qntErros==2){
          timerSeconds=1;
        }
        qntErros+=1;
      }

    }

  }
 timer();
}
void msgErro(){
   lcd.noCursor();
   lcd.clear();
   lcd.print(" ERRO! ");
   tone(9, 110, 2500);
   lcd.setCursor(0, 1);
}
void presentTime(void){ // registra o tempo presente quando solicitado
    present = millis()/1000;
    return;
}

void timer() {
  long tempoAtual=millis();
  
  if(tempoAtual - previousMillis > interval) {
     previousMillis = tempoAtual;
      
  lcd.setCursor(0, 1); // sets cursor to 2nd line
  lcd.print(" Tempo: ");
  lcd.print(timerSeconds / 60); // integer number of minutes on clock
  lcd.print("m");
  lcd.print(timerSeconds % 60); // mod 60; gives us number of seconds outside of 60sec/min
  lcd.print("s        ");
  long tempoAtual=millis();
 // delay(950); // hold us here for 0.950 seconds
  {
    digitalWrite(LED_RED, !digitalRead(LED_RED)); // toggle the green LED once a second
  }
  tone(9, 800, 250); // play bleep for 50ms
  delay(10); // and there's the rest of that 1 second (not counting LCD delay)
  timerSeconds--;
  if (timerSeconds == 0) explodeBomb();
    }
}

void explodeBomb() {
  // routine for making ze BOMB GOEZ OFF!!!1 smiley-grin
  lcd.noCursor();
  lcd.clear();
  lcd.print(" *-BoOo0o0o0oMm-* ");
  lcd.setCursor(0, 1);
  lcd.print(" SOLDADO MORTO!");
  tone(9, 110, 100);
  digitalWrite(LED_RED, HIGH); // sets the red LED on
  delay(500); // waits half a second
  tone(9, 110, 100);
  delay(500); // waits half a second
  digitalWrite(LED_RED, LOW); // sets the red LED off
  digitalWrite(LED_GREEN, HIGH); // sets the green LED on
  tone(9, 110, 100);
  delay(500); // waits half a second
  digitalWrite(LED_RED, HIGH); // sets the red LED on
  digitalWrite(LED_GREEN, LOW); // sets the green LED off
  tone(9, 110, 100);
  delay(500); // waits half a second
  digitalWrite(LED_RED, LOW); // sets the red LED off
  digitalWrite(LED_GREEN, HIGH); // sets the green LED on
  tone(9, 110, 100);
  delay(500); // waits half a second

  key = ""; // enter the while() loop, otherwise it'll skip. i could use do { } while();, but I'm lazy.
  {
    while (key==""){
      if (key=="#")
      {
        lcd.clear();
        lcd.print("Reiniciando:");
        lcd.setCursor(6, 1);
        lcd.print("a bomba!");
        delay(3000); //  3 sec delay
        void (*softReset) (void) = 0; //declare reset function @ address 0
        softReset();
        //timerSeconds = 300; // put 5 minutes on the clock
        // and we break the loop and go back to timer.
      }
      else  key = ""; // continue looking for pound key
    }
  }
}
void software_Reset() // Reinicia o software para o primeiro estágio, mas não reinicia os periféricos nem registros
{
  asm volatile ("  jmp 0");
}
void tecladoIn() {
  if (keyboard.available()) {
    digito = char(keyboard.read());
    verifica = char(digito);
    Serial.print("verifica=");
    Serial.println(verifica);

    if (digito == PS2_ENTER)
    {
      verifica = '\0';
      Serial.println(verifica);
      key = String(verifica);
      Serial.println("verifica=");
      Serial.println(verifica);
      lcd.clear();
      situacao = 4;

    }
    if (digito != '13') {
      lcd.print(digito);
    }
    i++;
  }
}

Quanto a função, estava querendo colocar uma coisa mais "dinâmica" para reduzir o código a depender do que a pessoa tente fazer. Vou deixar isso para uma versão 2.0

Acabei utilizando o milis(); para fazer comparativo de tempo e não precisar ficar dando lag durante a digitação do teclado
« Last Edit: December 10, 2013, 12:50:29 pm by designermx2 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bem, acho que é isso ai. as atualizações do código estão sendo colocadas no

svn checkout http://arduino-fake-regressive-paintball-or-airsoft-bomb.googlecode.com/svn/ arduino-fake-regressive-paintball-or-airsoft-bomb-read-only

Em breve posto um vídeo de como ficou o projeto.

Agradecer a HugoPT. Assim que terminado, estarei colocando um agradecimento dentro do código para que possa ser visto quando baixado.

Abraços.
Logged

Pages: 1 [2]   Go Up
Jump to: