ArduinoDroid not for android 14 ?

I tried to install ArduinoDroid from google store. I get a message that the app is not available for android 14.
Any tips on how to go about it ?

I see that the most recent release of the app was apparently over 3.5 years ago:

The ArduinoDroid repository was last updated 7 years ago.

You may have to roll your own. One option is to use App Inventor.

If you are comfortable with Python, you can build an Android app using flet. I have a GitHub project that controls an Arduino UNO R4 WiFI over TCP/IP.

I was able to create the app, test it on my PC, and then build an Android APK that runs on my tablet.

Here is the code to give you an idea of what is involved.

import asyncio

import flet as ft
from telemetrix_uno_r4.wifi.telemetrix_uno_r4_wifi_aio import telemetrix_uno_r4_wifi_aio

"""
Demo: Control an Arduino UNO R4 WiFi over Wifi using Flet and Telemetrix
      using asyncio.
"""


async def main(page: ft.Page):
    # ###################### Telemetrix callback functions
    async def pot_callback(data):
        """
        Process the report for a potentiometer value change

        :param data: data[2] contains the reported potentiometer value
        """

        # if the latest value is different then the last
        # save the value, calculate the new servo position
        # and move the servo.
        if data[2] != page.session.get('last_pot_reading'):
            page.session.set('last_pot_reading', data[2])
            servo_angle = int(((data[2] * 180) / 1023))
            await page.session.get('board').servo_write(page.session.get('servo_pin'),
                                                        servo_angle)
            # angle value is a text control
            angle_value.value = str(servo_angle)
            angle_value.update()

    async def slide_switch_callback(data):
        """
        Process the report for a slide switch value change

        :param data: data[2] contains the reported potentiometer value
        """

        # The state of the slide switch is represented by an
        # icon control
        slide_sw_icon = page.session.get('slide_switch_icon')

        if data[2] == 0:
            slide_sw_icon.name = ft.icons.ARROW_LEFT_SHARP
            slide_sw_icon.color = ft.colors.RED
        else:
            slide_sw_icon.name = ft.icons.ARROW_RIGHT_SHARP
            slide_sw_icon.color = ft.colors.GREEN
        slide_sw_icon.update()

    # ################# flet control event handlers

    async def ip_connect_button_clicked(ev):
        """
        Process the IP connect button being pressed.
        Instantiate telemetrix-uno-r4 and connect to the
        Uno R4 Wi-Fi.

        :param ev: connect elevated button event

        """
        if ip_uno.value:
            ev.control.text = "Connecting..."
            ev.control.bgcolor = 'amber'
            connect_button.update()
            try:
                board = telemetrix_uno_r4_wifi_aio.TelemetrixUnoR4WiFiAio(
                    autostart=False,
                    close_loop_on_shutdown=False, transport_address=ip_uno.value)
                await board.start_aio()
                # save the telemetrix instantiation object
                page.session.set('board', board)
            except (OSError, RuntimeError):
                # Invalid IP detected
                dlg = ft.AlertDialog(
                    title=ft.Text("Invalid IP Address"))
                page.dialog = dlg
                dlg.open = True
                connect_button.text = "Connect"
                connect_button.color = "white"
                connect_button.bgcolor = "red"
                page.update()

                return

            # the arduino is connected and ready to participate
            page.session.set('connected', True)
        else:
            # user did not fill in ip address
            dlg = ft.AlertDialog(
                title=ft.Text("No IP Address entered"))
            page.dialog = dlg
            dlg.open = True
            page.update()

    async def led_button_clicked(ev):
        """
        Toggle the LED button text and toggle the LED
        :param ev: event
        """

        # toggle the text and LED
        if ev.control.text == "Click To Turn LED On":
            ev.control.text = "Click to Turn LED Off"
            await page.session.get('board').digital_write(page.session.get(
                'blue_led_pin'), 1)
        else:
            ev.control.text = "Click To Turn LED On"
            await page.session.get('board').digital_write(page.session.get(
                'blue_led_pin'), 0)

        # update the page to display change
        ev.control.update()

    # event handler to set white led intensity level
    async def white_led_slider_change(ev):
        """
        Process a slider change. Adjust intensity of white LED based
        on slider position.
        :param ev: event
        """

        await page.session.get('board').analog_write(page.session.get('white_led_pin'),
                                                     int(ev.control.value))

    async def window_event(ev):
        """
        Gracefully shutdown when user closes window
        :param ev:
        """
        if ev.data == "close":
            if page.session.get('connected'):
                await page.session.get('board').shutdown()
            page.window_destroy()
    """
    ******************************************************
    ******************  MAIN PROGRAM *********************
    ******************************************************
    """

    # layout spacing
    page.padding = 50
    page.spacing = 50

    # needed to gracefully shutdown
    page.window_prevent_close = True
    page.on_window_event = window_event

    # ********** Set up session storage to avoid using globals

    # telemetrix instance - initially set to None
    page.session.set('board', None)

    # arduino pin numbers for connected devices
    page.session.set('blue_led_pin', 9)
    page.session.set('white_led_pin', 6)
    page.session.set('potentiometer_pin', 2)
    page.session.set('servo_pin', 5)
    page.session.set('slide_switch_pin', 13)

    # last potentiometer reading
    page.session.set('last_pot_reading', 0)

    # state of Wi-Fi connection to Arduino
    page.session.set('connected', False)

    # create a page title
    page.title = "Flet With Arduino UNO R4 WIFI Asyncio Demo"

    # ###################create and display controls on the page

    # create a text field to capture user input for the IP address
    # of the Arduino.
    #
    # create a button for the user to submit the address.

    header = ft.Text("Arduino UNO R4 WiFi Asyncio Demo",
                     theme_style=ft.TextThemeStyle.HEADLINE_MEDIUM,
                     weight=ft.FontWeight.BOLD)

    page.add(header)

    ip_uno = ft.TextField(label="Enter IP Arduino Address", autofocus=True)
    connect_button = ft.ElevatedButton(text="Connect", color="white", bgcolor="red",
                                       on_click=ip_connect_button_clicked)

    # do a little page layout magic
    ip_container = ft.Container(content=ip_uno)
    connect_row = ft.Row(spacing=5, controls=[ip_container, connect_button])

    page.add(connect_row)
    page.update()

    # get the current connection state
    # initially it will be False
    connected = page.session.get('connected')

    # connected will be set to True in the ip_connect_button_clicked
    # event handler. Wait for connection.
    while not connected:
        connected = page.session.get('connected')
        await asyncio.sleep(.00002)

    # we are now connected, so replace the connect button with a connected message.
    connect_row.controls = [ip_container, ft.Text("CONNECTED!", color="green", size=20,
                                                  weight=ft.FontWeight.BOLD)]

    connect_row.update()

    # ##### Add the rest of the controls to the page

    # add the led toggle button
    led_button = ft.ElevatedButton(text="Click To Turn LED On", color="white",
                                   bgcolor="blue",
                                   on_click=led_button_clicked)

    # add a slider to fade the white LED
    white_led_slider = ft.Slider(min=0, max=255, divisions=255, label="{value}",
                                 on_change=white_led_slider_change)
    white_led_slider_legend = ft.Text('Set White LED Intensity')
    white_led_slider_legend.weight = ft.FontWeight.BOLD
    white_led_slider_legend.size = 16

    led_fade_row = ft.Row(spacing=10,
                          controls=[white_led_slider_legend, white_led_slider])

    # add a text control to display the current servo angle that is
    # set by manipulating a physical potentiometer
    angle_legend = ft.Text('Adjust Pot To Set Servo Angle:', size=16,
                           weight=ft.FontWeight.BOLD)
    angle_value = ft.Text('0', size=16,
                          weight=ft.FontWeight.BOLD)

    servo_row = ft.Row(spacing=10, controls=[angle_legend, angle_value])

    # Display the state of the slide switch on the arduino with
    # arrow icons.

    slide_switch_legend = ft.Text('Slide Switch Position:', size=16,
                                  weight=ft.FontWeight.BOLD)

    slide_switch_icon = ft.Icon(name=ft.icons.ARROW_LEFT_SHARP,
                                size=60, color=ft.colors.RED)

    page.session.set('slide_switch_icon', slide_switch_icon)

    slide_switch_row = ft.Row(spacing=10,
                              controls=[slide_switch_legend, slide_switch_icon])

    page.add(ft.Column(spacing=60, alignment=ft.alignment.bottom_left,
                                   controls=[
                                       led_button,
                                       led_fade_row,
                                       servo_row,
                                       slide_switch_row]))

    # set pin modes for devices in use
    await page.session.get('board').set_pin_mode_digital_output(
        page.session.get('blue_led_pin'))
    await page.session.get('board').set_pin_mode_digital_output(
        page.session.get('white_led_pin'))
    await page.session.get('board').set_pin_mode_digital_input(
        page.session.get('slide_switch_pin'),
        callback=slide_switch_callback)
    await page.session.get('board').set_pin_mode_analog_input(
        page.session.get('potentiometer_pin'),
        differential=4, callback=pot_callback)
    await page.session.get('board').set_pin_mode_servo(page.session.get('servo_pin'))
    # set servo position to 0 degrees
    await page.session.get('board').servo_write(page.session.get('servo_pin'), 0)

    page.update()

try:
    ft.app(target=main)
except Exception as e:
    print('Exception occurred: {}'.format(e))

Big thanks. I will buy a pc :slight_smile:

Use an .apk from Uptodown.

Use an .apk from Uptodown.


You can see it is working.

What version?

The latest version on Uptodown , Android 11( presume it works on Android 14 as well).

I see a new version is now out:

So if you are still interested in this App and haven't already found a solution for installing it, it would be worth another try.