Italian Interfaccia bluetooth arduino/android

Luciano Veneziano

Active Member
Licensed User
Longtime User
Salve a tutti.
Costruisco delle macchine per diversi scopi, come tirare una membrana o comandare dei motori.
Attualmente utilizzo con arduino, per ogni macchina, un display ed un tastierino.

Mi è venuto in mente di creare un sistema di menu in JSON da inserire in arduino che venga trasmesso
al momento della connessione ad un device android che fungerebbe quindi da display e da tastiera.

comandi Android/Arduino

Qualcuno si è cimentato in questo? magari per scambiarci informazioni.

Questo permetterebbe di avere solo un bluetooth collegato. Il vantaggio sarebbe anche quello
di avere un'unica app per gestire (separatamente) diverse macchine.
Grazie a tutti.
 

amorosik

Expert
Licensed User
Mi interessa molto la comunicazione tra pc/android e schede arduino o simili
Non ho ancora realizzato niente di simile
Se posso essere di qualche aiuto, spara qualche idea e vediamo cosa salta fuori
 

Luciano Veneziano

Active Member
Licensed User
Longtime User
Possiamo andare in tandem.
La prima cosa è creare lato arduino anche solo con serial in piccolo interprete di token
Input "option" restituisce una struttura che sia JSON o altro con la lista dei comandi eseguibili
e del token associato. il problema comincia ad essere serio quando trovare un modo di cambiare
un parametro di arduino e memorizzarlo.
In linea di massima si potrebbe prevedere una parte dello schermo per i menu items ed una parte
dove compare la risposta di arduino.
Per il momento sono fermo qui.
 

amorosik

Expert
Licensed User
Possiamo andare in tandem.
La prima cosa è creare lato arduino anche solo con serial in piccolo interprete di token
Input "option" restituisce una struttura che sia JSON o altro con la lista dei comandi eseguibili
e del token associato. il problema comincia ad essere serio quando trovare un modo di cambiare
un parametro di arduino e memorizzarlo.
In linea di massima si potrebbe prevedere una parte dello schermo per i menu items ed una parte
dove compare la risposta di arduino.
Per il momento sono fermo qui.

Abbi pazienza ma non ho capito niente
"..anche solo con serial.." cosa intendi, forse di usare una linea seriale al posto del bt per comunicare?
"..input 'option' restituisce una struttura.." per option intendi forse il comando/comandi inviato da android verso arduino?
 

Luciano Veneziano

Active Member
Licensed User
Longtime User
Solo per cominciare a provare anche senza BT, ovviamente dopo serve.
L'idea è, lato arduino, questa: una struttura dati ed una. visuale in JSON
quando viene invocato "OPTIONS" arduino restituisce la struttura JSON
che a runtime deve essere trasformata in un menù, lato android.
con in tap si esegue precarico o carico.
con un tap lungo si apre un dialog con i dati impostati.
quindi nel caso di precarico "i_" ci dice che è un intero e ci mostrerà un dialogo
con un campo di edit chiamato "precarico" senza la "i_" e un campo di edit "senza la"f_"
chiamato "latenza" che alla fine sarà inviato ad arduino che aggiusterà il valore nella struttura TDati.

B4X:
struct TDati {
  int precarico;
  float latenza;
  int carico;
} Dati;

'Struttura menu JSON
String Mainmenu = "
{
   precarico:{i_precarico=10, f_latenza=3.5},
   carico: {i_carico=30}
}
";


loop {     //loop di arduino
  String cmd
  if (Serial.available()) {
    cmd = Serial.read();
    if(cmd=="OPTIONS") Serial.write(Mainmenu);

    if(cmd=="carico=")  Dati.carico = cmd.ToInt();               //ovviamente occorre fare un parse carico=50
    if(cmd=="precarico=")  Dati.precarico = cmd.ToInt();     //ovviamente occorre fare un parse precarico=11
    if(cmd=="latenza=")  Dati.latenza = cmd.ToFloat();       //ovviamente occorre fare un parse latenza=4.2

    if(cmd=="carico?")  Serial.write(Dati.carico)  ;                //ovviamente occorre fare un parse carico?
    if(cmd=="precarico?")  Serial.write(Dati.precarico)  ;     //ovviamente occorre fare un parse precarico?
    if(cmd=="latenza?")  Serial.write(Dati.latenza) ;              //ovviamente occorre fare un parse latenza=4.2  }
}

Pressappoco l'idea è questa.
Come dicevo prima possiamo discuterne.
 
Last edited:

Luciano Veneziano

Active Member
Licensed User
Longtime User
OK.
Sono riuscito a creare un "skeleton"
volendo fare un porting su B4XPages come modifico le righe 47 e 67

"Activity.AddView(ButtonX,x*30%x,y*10%y,30%x,10%y)"?


file json:
{
"App": [
      {"Versione": 10.1},
      {"autore": "Luciano Venenziano"}
    ],

"Scatola": [
      {"Altezza": 50},
      {"Larghezza": 200},
      {"count": 5}
    ],
 
  "Cerchio": [
      {"Raggio": 250},
      {"Diametro": 250},
      {"Area": 250}
    ]
}


Codice B4A:
Sub Activity_Create(FirstTime As Boolean)
 
    buildMenu("options.json")

End Sub


Sub buildMenu(fn As String)
 
    Dim JSON As JSONParser
    Dim Map1 As Map
    Dim List As List

    Dim x As Int
 
    x = 0
 
    JSON.Initialize(File.ReadString(File.DirAssets, fn))
 
    Map1 = JSON.NextObject
 
    For Each key As String In Map1.Keys
        If x = 0 Then
            Log("applicazione:" & key)
        Else
            Log(key)
            Button(0,x,key)
        End If
        List = Map1.Get(key)
        For Each link As String In List
            Log(link)
            Edit(1,x,link)
        Next
        x = x + 1
    Next
End Sub


Sub Button(x As Int, y As Int, txt As String)
    Dim ButtonX As Button

    ButtonX.Initialize("Button")
    ButtonX.Text = txt
    Activity.AddView(ButtonX,x*30%x,y*10%y,30%x,10%y)
End Sub


Sub Edit(x As Int, y As Int, ctrli As String) As Int
 
    Dim c As ColorDrawable
    c.Initialize2(Colors.White,5dip,3dip,Colors.White)
 
    Dim ed As EditText
    Dim PosX As Pos
 
    PosX.x = x
    PosX.y = y
    ed.Initialize("EditText")
    ed.Background = c
    ed.Color = Colors.White
    ed.Text = ctrli
    ed.Tag =  ctrli
    ed.Color = 400
    Activity.AddView(ed,x*30%x,y*10%y,30%x,10%y)
End Sub
 
Last edited:

Sagenut

Expert
Licensed User
Longtime User
volendo fare un porting su B4XPages come modifico le righe 47 e 67

"Activity.AddView(ButtonX,x*30%x,y*10%y,30%x,10%y)"
Metti Root al posto di Activity
Per il size in percentuale puoi usare
B4X:
Dim MyX as Double = Root.Width / 100
Dim MyY as Double = Root.Height / 100
Root.AddView(ButtonX,x*(MyX * 30),y*(MyY * 10),MyX * 30, MyY * 10)
 
Last edited:

Luciano Veneziano

Active Member
Licensed User
Longtime User
Metti Root al posto di Activity
Per il size in percentuale puoi usare
B4X:
Dim MyX as Double = Root.Width / 100
Dim MyY as Double = Root.Height / 100
Root.AddView(ButtonX,x*(MyX * 30),y*(MyY * 10),MyX * 30, MyY * 10)
Thanks!
 
Top