PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Общение с машиной (http://pccar.ru/forumdisplay.php?f=14)
-   -   CITROEN-ARDUINO (http://pccar.ru/showthread.php?t=23275)

xmetal 04.11.2015 05:13

Цитата:

Сообщение от T_r_D (Сообщение 342187)
но поторопился!

Согласен, фигня получается.

T_r_D 12.11.2015 22:29

Короче, я в стопоре.
С программированием под андроид чо-то как-то совсем уныло. Ни фига понять не могу, да и время нету почти.
Заказал модуль приёмника Fm. Догружу своё устройство им до полного счастья.

Raikkonen 15.11.2015 12:01

терпение и труд!

T_r_D 06.12.2015 16:34

Вот тут я описал написание программы под Android.
Почти месяц мучений.
http://www.pccar.ru/showthread.php?t=23635
Она пока пустая, просто принимает данные и выводит их, но это не надолго :)

T_r_D 23.12.2015 02:59

Итак, с USB коннектом и pro micro не сложилось.
Был докуплен модуль HC 05 bluetooth
И при помощи него реализован коннект.
Всё работает хорошо, но есть проблема в обнаружение подключения.

Ни чего путного в инете не нашёл, а пробовать каждый раз коннектится к устройству очень долго.

Тоесть получается:
Зажигание выключилось и переферия отключилась.
Планшет ушёл спать.
Зажигание включилось, переферия включилась, планшет проснулся, но поскольку программа не выключалась, то коннекта нет.
Нужно или как-то научить программу видеть уход в сон и возвращение из него или при помощи кондёров делать задержку отключения переферии чтоб она могла на последнем издыхании гавкнуть что питания нет и тем самым прогу вообще завершить.
Тогда вопрос как при выходе из сна её запустить?

Не знаю куда код программы для андройда выкидывать. Сюда или в программы.

T_r_D 23.12.2015 21:30

Итак, допилил прогу под ВТ для андройда.
манифест
PHP код:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.oho.bt" >

    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar" >

            <receiver android:name=".MyReceiver"
                android:enabled="true"
                android:exported="false">
                <intent-filter>
                    <action android:name="android.intent.action.SCREEN_ON"/>
                    <action android:name="android.intent.action.SCREEN_OFF"/>
                </intent-filter>
            </receiver>

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Ява
PHP код:

package com.example.oho.bt;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.os.Handler;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class 
MainActivity extends Activity {

    
Button btnOnbtnOff;
    
TextView txtArduino;

    
Handler h;
    private static final 
int REQUEST_ENABLE_BT 1;
    private 
BluetoothAdapter btAdapter null;
    private 
ConnectedThread mConnectedThread;
    private 
StringBuilder sb = new StringBuilder();
    final 
int RECIEVE_MESSAGE 1;        // Статус для Handler
    
Integer btconnectingst 0//Проверяем активно ли соединение

    
@Override
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        
setContentView(R.layout.activity_main);
        
btnOn = (ButtonfindViewById(R.id.btnOn);
        
btnOff = (ButtonfindViewById(R.id.btnOff);

        
txtArduino = (TextViewfindViewById(R.id.txtArduino);
        
btAdapter BluetoothAdapter.getDefaultAdapter();
        
registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_ON));
        
registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_OFF));

        
btnOn.setOnClickListener(new OnClickListener() {
            public 
void onClick(View v) {
                if (
btconnectingst.equals(1)) {
                    
mConnectedThread.write("1"); // Отправляем через Bluetooth цифру 1
                
}
            }
        });

        
btnOff.setOnClickListener(new OnClickListener() {
            public 
void onClick(View v) {
                if (
btconnectingst.equals(1)) {
                    
mConnectedThread.write("0");    // Отправляем через Bluetooth цифру 0
                
}
            }
        });

        
= new Handler() {
            public 
void handleMessage(android.os.Message msg) {
                switch (
msg.what) {
                    case 
RECIEVE_MESSAGE:                                                   // если приняли сообщение в Handler
                        
byte[] readBuf = (byte[]) msg.obj;
                        
String strIncom = new String(readBuf0msg.arg1);
                        
sb.append(strIncom);                                                // формируем строку
                        
int endOfLineIndex sb.indexOf("\r\n");                            // определяем символы конца строки
                        
if (endOfLineIndex 0) {                                            // если встречаем конец строки,
                            
String sbprint sb.substring(0endOfLineIndex);               // то извлекаем строку
                            
sb.delete(0sb.length());                                      // и очищаем sb
                            
txtArduino.setText(sbprint);                                   // обновляем TextView
                            
btnOff.setEnabled(true);
                            
btnOn.setEnabled(true);
                        }
                        break;
                }
            }
        };
 }

    
BroadcastReceiver mybroadcast = new BroadcastReceiver() {
        @
Override
        
public void onReceive(Context contextIntent intent) {
            if(
intent.getAction().equals(Intent.ACTION_SCREEN_ON)){
                
checkBTState();
            }
            else if(
intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
                if (
btconnectingst.equals(1)){
                    
btconnectingst 0;
                    
mConnectedThread.cancel();
                }
            }

        }
    };


    private 
void errorExit(String titleString message){
        
Toast.makeText(getBaseContext(), title " - " messageToast.LENGTH_LONG).show();
    }



    private 
void checkBTState() {
        if(
btAdapter==null) {
        } else {
            if (
btAdapter.isEnabled()) {
                
ConnectBT();
                
btconnectingst 1;
            } else {
                
Intent enableBtIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE);
                
startActivityForResult(enableBtIntentREQUEST_ENABLE_BT);
            }
        }
    }

    @
Override
    
protected void onActivityResult(int requestCodeint resultCodeIntent data) {
        if(
requestCode == REQUEST_ENABLE_BT){
            if (
resultCode == RESULT_OK){
                
ConnectBT();
                
btconnectingst 1;
            }
            if(
resultCode == RESULT_CANCELED){
                
finish();
            }
        }
    }

    @
Override
    
public void onResume() {
        
super.onResume();
        
checkBTState();
    }

    @
Override
    
public void onPause() {
        
//тут возникает проблема если ВТ выключен!
        //Видимо из за того, что пытамся закрыть несуществующий сокет.
        //Нужно записывать в переменную статус адаптера!
        
super.onPause();
        if (
btconnectingst.equals(1)) {
            
btconnectingst 0;
            
mConnectedThread.cancel();
        }
    }

    public 
void ConnectBT() {
        
btAdapter.cancelDiscovery();
        for (
BluetoothDevice device btAdapter.getBondedDevices()) {
            try {
                try {
                    
Method m device.getClass().getMethod("createRfcommSocket",new Class[] { int.class });
                    try {
                        
BluetoothSocket btSocket = (BluetoothSocket)  m.invoke(device,Integer.valueOf(1));
                        
btSocket.connect();
                        
mConnectedThread = new ConnectedThread(btSocket);
                        
mConnectedThread.start();
                        break;
                    } catch (
IOException e) {}
                }
                catch (
IllegalArgumentException e) {}
                catch (
IllegalAccessException e) {}
                catch (
InvocationTargetException e) {}
            } catch (
SecurityException e) {}
            catch (
NoSuchMethodException e) {}
        }
    }

    private class 
ConnectedThread extends Thread {
        private final 
BluetoothSocket mmSocket;
        private final 
InputStream mmInStream;
        private final 
OutputStream mmOutStream;

        public 
ConnectedThread(BluetoothSocket socket) {
            
mmSocket socket;
            
InputStream tmpIn null;
            
OutputStream tmpOut null;

            
// Get the input and output streams, using temp objects because
            // member streams are final
            
try {
                
tmpIn socket.getInputStream();
                
tmpOut socket.getOutputStream();
            } catch (
IOException e) { }

            
mmInStream tmpIn;
            
mmOutStream tmpOut;
        }

        public 
void run() {
            
byte[] buffer = new byte[256];  // buffer store for the stream
            
int bytes// bytes returned from read()

            // Keep listening to the InputStream until an exception occurs
            
while (true) {
                try {
                    
// Read from the InputStream
                    
bytes mmInStream.read(buffer);        // Получаем кол-во байт и само собщение в байтовый массив "buffer"
                    
h.obtainMessage(RECIEVE_MESSAGEbytes, -1buffer).sendToTarget();     // Отправляем в очередь сообщений Handler
                
} catch (IOException e) {
                    break;
                }
            }
        }

        
/* Call this from the main activity to send data to the remote device */
        
public void write(String message) {
            
byte[] msgBuffer message.getBytes();
            try {
                
mmOutStream.write(msgBuffer);
            } catch (
IOException e) {
            }
        }

        
/* Call this from the main activity to shutdown the connection */
        
public void cancel() {
            try {
                
mmSocket.close();
            } catch (
IOException e) { }
        }
    }


xml
PHP код:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/activity_main" tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Text From Arduino"
        android:id="@+id/txtArduino"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_above="@+id/btnOn"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="1"
        android:id="@+id/btnOn"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginBottom="37dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        android:id="@+id/btnOff"
        android:layout_alignBottom="@+id/btnOn"
        android:layout_toRightOf="@+id/btnOn"
        android:layout_toEndOf="@+id/btnOn" />
</RelativeLayout>


T_r_D 23.12.2015 21:37

Вложений: 1
Условия для работы.
bluetooth устройства должны быть сопряжены.
В списке сопряжонных устройств должно быть только то, которое является модулем hc-05.
Ардуина и модуль должны включаться ДО выхода планшета из слипа или ДО его загрузки в случае автоматического запуска программы при старте.

Концом стороки является \r\n при посылках из ардуины.

События которые происходят в программе.
Запуск
Если БТ включён, то коннектимся.
Если выключен, то просим пользователя включить.
Если включил- коннектимся, если нет- выходим из программы.
Свёртывание программы- дисконнект ВТ.
Развёртывание- коннект.
Уход в слип (потухание экрана)- дисконнект
Возвращение из слипа (включение экрана)- коннект.

Во вложении АПК.

autowp 06.01.2016 21:04

Я тут переписал старую как мир библиотеку под MCP2515 от SeedStudio
https://github.com/Seeed-Studio/CAN_BUS_Shield

Вот что вышло
https://github.com/autowp/CAN_BUS_Shield

А вот пример приложения на базе этой библиотеки:
https://github.com/autowp/can-usb - эмулятор CanHacker'а (lawicel).

Пока не работают только фильтры/маски.

Цель переписывания была в том, чтобы обеспечить безошибочную работу на высоких скоростях. С оригинальной библиотекой очень много потерь было. Переписанная тянет полный загруз UART на 115200 (эффективная скорость данных 87Кбит). Дальше не мерял, потому как это предел для программы, под которую делалось (CanHacker http://www.mictronics.de/projects/usb-can-bus/ )

P.S.
Ах, да, забыл упомянуть, что я всё делаю на Arduino Nano.
На Arduino Uno у меня не заработало, потому что она слишком долго загружается и не успевает принять от CanHacker'а команду на подключение. Возможно с иным бутлоадером и заработает, но мне не очень хочется разбираться

T_r_D 07.01.2016 15:17

А я тут опять в стопоре!
Запутался в трёх соснах.
В скетче указывают delay(100) и всё работает, делаю задержку через millis и не фига не работает!
Тоесть сообщения-то идут, но похоже быстрее чем с делеем и поэтому для андройде это уже каша, а не то что должно быть.
Сколько не смотрел в инете и всё говорят про то, что внутренний таймер считает по микросекундам и соответственно 100 millis должно быть эквивалентом delay(100).
Может это только с промикро такие глюки?

autowp 07.01.2016 19:02

Цитата:

Сообщение от T_r_D (Сообщение 347858)
А я тут опять в стопоре!
Запутался в трёх соснах.
В скетче указывают delay(100) и всё работает, делаю задержку через millis и не фига не работает!
Тоесть сообщения-то идут, но похоже быстрее чем с делеем и поэтому для андройде это уже каша, а не то что должно быть.
Сколько не смотрел в инете и всё говорят про то, что внутренний таймер считает по микросекундам и соответственно 100 millis должно быть эквивалентом delay(100).
Может это только с промикро такие глюки?

millis - это не задержка, а текущее время.
В нормальной программе delay быть не должно.


Часовой пояс GMT +4, время: 09:17.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot