Spanish Eventos externos

Saludos a todos, tengo un proyecto electrónico donde cuando ocurre un determinado evento en el circuito, manda un pulso a un contador que va, valga la redundancia, contando en un display.

Tengo una duda, valiéndose del puerto USB del dispositivo (este tiene 4 pines, 2 de corriente y me parece que 2 de datos), habrá alguna forma de enviar el pulso eléctrico del circuito a través de el y que un programa (debidamente estructurado) pudiese reconocer estos pulsos e ir los contabilizando?? (Algo así como si se pusiese un programa que cada vez que se apriete el botón del manos libres vaya sumando 1 a un label por ejemplo).

Esto me hace pensar igual que si no pudiese reconocer este pulso como si fuese apretar el botón del manos libres (podría ser otra opción).

Por último ya que ando con esto, alguien sabe de que forma puedo asignar un evento al toque del manos libres??.

Gracias por leerme y de antemano por sus respuestas.

Besos!!!
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Alexasthar

habrá alguna forma de enviar el pulso eléctrico del circuito a través de el y que un programa (debidamente estructurado) pudiese reconocer estos pulsos
Formas de comunicar un dispositivo movil con el mundo exterior hay muchas, quizas te has ido a una de las mas complicadas :D que es puerto USB, por que no deja de ser un puerto serie.
En el mercado hay infinidad de tarjetas baratas que llevan modulos, serie, bluetooth, etc , para comunicarse y controlar cosas (de los mas conocidos Arduino)

Para lo que quieres hacer se me ocurre una solucion facil y barata, convierte tu salida de ese pulso eléctrico en una señal libre de potencial (con un relé) , corta la alimentación del dispositivo con el relé (contacto normalmente abierto) asi cuando envies ese pulso electrico alimentaras al dispositivo, y con el evento Nombre_BatteryChanged (... ) PhoneEvents (libreria Phone), podras saber cuando te llegó un impulso, claro, siempre que no sea algo muy rapido.

Si no sabes como hacerlo, abre un nuevo post preguntando como saber que un dispositivo esta alimentado y seguro que te responderemos. Si lo haces desde aqui seria una pregunta diferente.

Por último ya que ando con esto, alguien sabe de que forma puedo asignar un evento al toque del manos libres??.
Para esto tendrias que hacer un enlace bluetooth manualmente con el manos libres, saber el protocolo de comunicación de este para saber cuando pulsan que trama envia, y tu programa actuar en consecuencia.


Saludos
 
Para esto tendrias que hacer un enlace bluetooth manualmente con el manos libres, saber el protocolo de comunicación de este para saber cuando pulsan que trama envia, y tu programa actuar en consecuencia.

Hola, antes que nada gracias por la respuesta... Yo pensaba en un manos libres cableado, he visto varios programas donde se permite mapear los controles físicos (botones volumen, cámara y botón del manos libres), la idea seria preestablecer la acción de ese botón (algo así como los reproductores de audio).

En cuanto a lo del puerto USB, ciertamente es algo un poco complicado, pensé que como tiene dos puertos de datos tal vez por allí habría forma de enviar los pulsos (como cuando se conecta a la pc y se pone en modo de almacenamiento masivo), la idea precisamente sería no prescrindir de una llaca arduino (la idea del relé me gusta pero seria bueno que se pudiese hacer a la inversa, o sea, que se interrumpa la corriente con cada pulso, ya que los pulsos son en ocasiones cada segundo uno tras otro).

Gracias de nuevo.

Besos!!
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Alexasthar

Hola, antes que nada gracias por la respuesta... Yo pensaba en un manos libres cableado, he visto varios programas donde se permite mapear los controles físicos (botones volumen, cámara y botón del manos libres), la idea seria preestablecer la acción de ese botón (algo así como los reproductores de audio).
Seguiras estando en el mismo problema, tendras que saber que envia el manos libres cuando pulsas el boton.

(la idea del relé me gusta pero seria bueno que se pudiese hacer a la inversa, o sea, que se interrumpa la corriente con cada pulso, ya que los pulsos son en ocasiones cada segundo uno tras otro).

El evento NombreEvento_BatteryChanged (... ) , salta tanto cuando pones alimentacion que cuando la quitas, asi que te valdria igual para saberlo, es simplemente mirar el valor de Plugged
B4X:
Sub NombreEvento_BatteryChanged (Level As Int, Scale As Int, Plugged As Boolean, Intent As Intent)
   
  if Plugged Then 
    ' conectada alimentación
  Else
    ' desconectada alimentación
  EndIf

Aunque seria mas interesante detectar como tu dices la desconexión pero teniendolo siempre conectado, por que asi de paso alimentas al dispositivo ;) , y para hacerlo , es tan facil como emplear el contacto normalmente cerrado del relé en vez del contacto abierto como te dije

Saludos
 
Hola bgsoft, nuevamente gracias por la ayuda, no he respondido porque he estado tratando de hacer funcionar el codigo... despues de ver lo que me pusiste arriba y estar navegando por el foro, pude hacer algo:

Cuando el telefono se desconecta pone en un textbox "Desconectado" y cuando se conecta (o esta conectado) pone "Conectado"... hasta alli bien, el problema es a la hora de pasar a la accion.

Tengo dos text mas, en uno pongo los "pulsos" (en este caso, cada vez que se desconecta quiero que me sume uno en esa caja) y en la otra se divide este numero entre dos (mi circuito envia un pulso por decir asi de entrada y otro de salida con un tiempo separado, o sea que dos pulsos equivalen a una sola accion por lo que divido entre dos para tener el numero exacto de acciones o eventos), el codigo es este:

B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim pe As PhoneEvents
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    Dim a, c, d, e, f, g As Float
    Dim h As Int
    Dim Label2 As Label
    Dim Label4 As Label
    Dim Label6 As Label
    Dim txt1, txt3, txt5, txt7 As EditText
End Sub

Sub Activity_Create(FirstTime As Boolean)
    If FirstTime Then
        pe.Initialize("pe")
    End If
    Activity.LoadLayout("marco")
End Sub

Sub pe_BatteryChanged (Level As Int, Scale As Int, Plugged As Boolean, Intent As Intent)
    If Plugged Then 
        txt1.Text = "Conectado" ' conectada alimentación
       
    Else
        txt1.Text = "Desconectado" ' desconectada alimentación
    End If

End Sub

Sub Activity_Resume

End Sub


Sub Activity_Pause (UserClosed As Boolean)

End Sub


Sub txt1_TextChanged (Old As String, New As String)
        If txt1.Text = "Desconectado" Then 
        txt7.Text = txt3.Text
       
        a = txt3.Text
        c = txt7.Text
        d = 1
        e = c+ d
               
        txt3.Text= e
        txt7.Text = "0"
       
        Total
    Else
        txt7.Text = "CON"
    End If
End Sub

Sub Total

        g = txt3.Text
        f = 2
        h = g / f
       
        txt5.Text = h
End Sub

El problema es que cuando conecto me añade uno al primer text que lleva la cuenta (el que no divide), y cuando desconecto me añade dos (en ocasiones si conecto y desconecto rapido me añade uno, pero generalmente me añade de dos en dos este evento), para ver que no fuera el cable probe con varios cargadores, incluso puse un swich entre la corriente y el cargador (para asegurarme que no fuese algun falso o que la forma en la que conectaba el cargador al telefono influyera tal vez por ejemplo, por meter el cargador en mal angulo), me da igual que el evento lo ponga para textchanged o que lo ponga directo como en tu ejemplo de arriba (baterry changed), sucede lo mismo (de hecho pense que el problema es que lo tenia en el evento battery changed, como me hizo lo que explico cambie el evento a textchanged esperando que se solucionara el problema pero nada).

Lo que se me hace mas curioso es porque cuando conecto me suma, si no puse en ninguna linea que sumara 1 o que hiciera nada cuando se conectara (salvo cambiar el text1).

Espero me puedas echar una mano con eso que en verdad me tiene desesperada.

Gracias!!

Besos!!
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Alexasthar

Como decia Jack el destripador: "Vayamos por partes" :D

Te ira mejor el inicializar pe.Initialize("pe") en el Sub Activity_Resume , por que asi empezara a funcionar cuando este creado el formulario.

El emplear el cambio del texto en el TextChanged , te obliga a no equivocarte nunca en poner los mismos titulos de conectados y desconectados, si en uno solo cambias que la inicial es mayuscula, no se cumplira la condicion, y hasta que lo veas te volveras loca. Asi que te aconsejo que emplees una variable global, y en este caso un Boolean , y te aconsejo que emplees nombres que te digan algo y sepas que hace esa variable: EstadoConexion, EstadoConexionOFF, ConexionParada, etc, etc . Si te digo esto es por que creo que hace poco te has metido en este "mundillo" y mejor que lo hagas bien desde el principio.

Si pones el evento en un formulario, cuando se te apague el dispositivo, no detectaras nada, asi que deberias hacerlo en un servicio, puedes ver como se hace aqui y veras que es muy facil:
https://www.b4x.com/android/forum/threads/b4a-tutorial-módulos-de-servicio.42689/


El resto de problemas que estas teniendo son lógicos, no has visto el comportamiento del evento y asi cualquiera se puede volver loco, create un nuevo proyecto sin nada, y añade esto:

B4X:
Sub Activity_Resume
   

  Dim PhoneId As PhoneId
  Dim EstadoTelefono As PhoneEvents
  EstadoTelefono.InitializeWithPhoneState("PE",PhoneId)
   
    
End Sub

Sub PE_BatteryChanged (Level As Int, Scale As Int, Plugged As Boolean, Intent As Intent)
   
   If Plugged Then   
     LogColor("Conectado "  & DateTime.time(DateTime.now),Colors.Blue)
   Else
     LogColor("Desconectado "  & DateTime.time(DateTime.now),Colors.Red)
   End If   
  
End Sub

Lo de los colores del LOG es para que veas de un vistazo rápido lo que te interesa y la hora lo veras mas abajo.

Ejecuta el programa con un cable de alimentación que puede ser el mismo USB que emplees para cargar el programa en el dispositivo.
Ahi vas a ver que nada mas hacer el resume entra en el evento, y seguirá entrando cada x segundos (dependerá del dispositivo) .
Desconecta un rato superior a lo que has visto en el log, y veras que tambien entra cuando esta desconectado cada x segundos.
Con esto veras cuales son todos esos problemas que estas teniendo.

Puedes pensar que tu contador con este sistema no vale, pero si, es bastante facil.
Tu dices que estas haciendo un proyecto electronico, te lo explico en esos terminos para que lo entiendas mejor. Habitualmente el dispositivo esta conectado, por lo tanto tu señal seria un flanco de subida activo, me da igual que el evento me diga cien veces que estoy activo, no hago nada. Cuando tu mandas el impulso cortas la alimentacion, estas en tu flanco de bajada, aqui pones activa una variable boolean, y aunque este otras cien veces leyendo que estoy desconectado no hago nada, cuando le quites el pulso y detectes conetado + esa variable activa ya puedes incrementar tu contador (otra variable global) y resetear esa variable hasta que se vuelva a cumplir otro ciclo completo, en definitiva, tu estas creando una onda rectangular que su flanco de bajada es tu impulso de contador.
Con la variable global del contador puedes refrescar el label donde pongas el número contado.
Espero haberme expresado bien.

Te aconsejo que crees ese codigo con el ejemplo que te he pasado y simules tu dispositivo electronico poniendo y quitando la alimentacion del dispositivo.
Cuando todo te vaya perfecto, lo pasas a un servicio.

Saludos
 
Hola otra vez, antes que nada agradezco la ayuda. Sigo con el mismo problema, hice el codigo que me enviaste y me salio esto:

B4X:
LogCat connected to: B4A-Bridge: motorola XT890-
--------- beginning of /dev/log/system
Installing file.
** Activity (main) Pause, UserClosed = false **
PackageAdded: package:b4a.example
** Activity (main) Create, isFirst = true **
** Activity (main) Resume **
Conectado 10:33:34
Desconectado 10:33:36
Desconectado 10:33:37
Desconectado 10:33:37
Desconectado 10:33:38
Desconectado 10:33:38
Desconectado 10:33:39
Desconectado 10:33:39
Desconectado 10:33:40
Desconectado 10:33:41
Desconectado 10:33:41
Desconectado 10:33:41
Conectado 10:33:42
Conectado 10:33:44
Desconectado 10:33:45
Desconectado 10:33:45
Desconectado 10:33:45
Conectado 10:33:46
Conectado 10:33:46
Desconectado 10:33:46
Desconectado 10:33:47
Conectado 10:33:47
Conectado 10:33:48
Desconectado 10:33:48
Desconectado 10:33:49
Conectado 10:33:49
Desconectado 10:33:50
Desconectado 10:33:51
Desconectado 10:33:51
Conectado 10:33:51
Conectado 10:33:51
Desconectado 10:33:51
Desconectado 10:33:51
Desconectado 10:33:52
Conectado 10:33:52
Conectado 10:33:54
Desconectado 10:33:54
Desconectado 10:33:56
Desconectado 10:33:56
Conectado 10:33:56
Conectado 10:33:57
Desconectado 10:33:57
Desconectado 10:34:00
Conectado 10:34:00
Conectado 10:34:01
Desconectado 10:34:01
Desconectado 10:34:01
Desconectado 10:34:03
Conectado 10:34:04
Conectado 10:34:05
Desconectado 10:34:05
Desconectado 10:34:10
Conectado 10:34:10
Conectado 10:34:12
Conectado 10:34:12
Desconectado 10:34:12
Desconectado 10:34:15
Conectado 10:34:15
Conectado 10:34:15
Conectado 10:34:19
Desconectado 10:34:19
** Activity (main) Pause, UserClosed = false **

La verdad no se ya que hacer, lo del text que ponia arriba se supone no tiene que afectar, no entiendo de que forma me pudiese cambiar las letras, ya que solo se utiliza o conectado o desconectado, lo de poner booleanos se me hace hacer lo mismo, el text que puse fue despues de haber probado "directo", es decir, si estaba conectado solo ponia en un label "Conectado" (a modo informativo) y si estaba desconectado ponia "Desconectado" y text3.Text añadia uno a su cuenta y el ultimo text dividia en dos el numero del text 3 (no me basaba en el texto, sino que lo mandaba a calcular directamente), como no me funciono trate de hacer lo del textChange (pense que el THEN me estaba leyendo todo y no me estaba respetando el Else).

Viendo en el foro a alguien que queria ver el nivel de bateria, lei a Erel que la funcion no era necesaria si el programa iba a permanecer abierto (por ello no lo hice a modo de funcion y se lo avente directo, ya que quiero que el programa este siempre abierto cuando se necesite que vaya contabilizando), lo que no se es si al bloquearse la pantalla mate mi proceso (le tengo miedo a las funciones por la politica de android de matar procesos para liberar RAM).

Igual con el Log me quede como estaba, solo veo que me cuenta mas de una vez cuando se desconecta y cuando se conecta (fuera un numero fijo que me arrojara el 100% de las veces podria hacer una operacion matematica para resolverlo, pero asi de inestable no se puede ya que no me calcularia bien).

Alguna idea de que esta saliendo mal?? (Perdon si la posible respuesta esta mas arriba, pero si es asi no he entendido).

De antemano gracias por la ayuda.

Besos!!
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Alexasthar

En el log ya ves lo que te dije, está entrando constantemente casi siempre varias veces en el mismo segundo, asi que con el programa tal y como lo tienes ya te dije que no funcionará.

Te dije que hicieras uno con variables globales y con un metodo de saber cuando se ha cumplido el ciclo completo (tu impulso de contador) para aumentar el contador, partiendo de esa variable que tienes que resetear, si mantienes el mismo programa esta claro que no te funcionará por que como ves esta entrando constantemente, asi que tienes que hacer un filtro para no contar esas entradas o salidas, si no los flancos de cambio.

Viendo en el foro a alguien que queria ver el nivel de bateria, lei a Erel que la funcion no era necesaria si el programa iba a permanecer abierto (por ello no lo hice a modo de funcion y se lo avente directo, ya que quiero que el programa este siempre abierto cuando se necesite que vaya contabilizando)
Si, pero el problema es que o dejas que nunca se apague, o en cualquier momento que por lo que sea se apague o pase a otra aplicacion se acabo el conteo.
Mirate un pequeño tutorial que hice y ya veras que es facil y que hay formas para que Android no te mate la aplicación, alli explico varios metodos, y si ademas existe un evento que se dispara cada x tiempo, sera dificil que Android te mate el servicio, yo tengo un programa que en un servicio mira tambien el nivel de bateria y otros sensores del movil y Android no lo para nunca.
https://www.b4x.com/android/forum/threads/b4a-tutorial-módulos-de-servicio.42689/
Pero eso si, como te dije antes tienes que conseguir que te funcione en el formulario por que asi el seguimiento del programa sera mas facil.

Saludos:
 
Top