Приветствую Хабрахабр.
В сети не раз обсуждалась тема спаривания Androida и Arduino через bluetooth, лично меня вдохновила эта статья -.

Немного о том, как всё началось.Дома я использую контролёр Arduino Uno, для управления светом.Возле входной двери в квартиру
в парадной постоянно темно, хоть глас выколи.Решая эту проблему, установил над дверью фонарь, а его управление повесил на Arduino.Всё просто, выходя из дома жмешь кнопку и на три минуты загорается фонарь.Достаточно времени запереть дверь и уйти.А по возвращении, с телефона через bluetooth включаешь фонарь снова.Для меня очень удобно.

И тут пришла мысль, а не усложнить ли эту систему.И повесить на Arduino датчик движения, соорудив таким образом подобие сигнализации.Для этих целей нашёлся старенький смартфон на Android 2.3, который можно использовать как мозг данной конструкции.

Схема проста, сработал датчик движения Arduino через bluetooth шлёт сигнал на Android телефон, а тот шлёт мне смс о сработке.
Но такая последовательность цепочки возможна если на телефоне запущенно наше приложение.По этому добавил в приложение возможность запускать его дистанционно, с помощью смс.И ещё добавил возможность прослушки, что происходит в квартире.Также шлёшь смс с кодовым словом и Android тебе перезванивает.Вышел из дома, отправил смс с кодом и система запустилась.Почему выбрал способ управления по смс, просто в моём тарифе сотовой связи 500 бесплатных смс, решил использовать этот мёртвый груз.

Скетч для Arduino:

#define SENSOR_PIN  5// датчик движения вешаем на пятый пин

boolean inSensor ;

void setup() {
    //Устанавливаем скорость UART
    Serial.begin(9600); 
   //  вход датчика
   pinMode(SENSOR_PIN, INPUT);
  
}
void loop() {

  //проверяем датчик
 if(inSensor==true){
     //шлём сообщение тревоги
    Serial.print("ALARM");
    
        }

}



Для дистанционного запуска приложения пишем класс SmsReceiver наследуем его от BroadcastReceiver.

public class SmsReceiver extends BroadcastReceiver{

@Override
	public void onReceive(Context context, Intent intent) 
	{
        //  получаем смс 
        Bundle bundle = intent.getExtras();        
        SmsMessage[] msgs = null;
        String str = ""; 
        String strBody = ""; 
        if (bundle != null)
        {
           
            Object[] pdus = (Object[]) bundle.get("pdus");
            msgs = new SmsMessage[pdus.length];            
            for (int i=0; i<msgs.length; i++){
                msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);                
                str = msgs[i].getOriginatingAddress();                     
                 strBody= msgs[i].getMessageBody().toString();
                      
            }
           
         // проверяем смс на совпадение с нашим кодовым словам
         // и запускаем приложение

         if( strBody.equals("PUSK")){
            
            Intent intent1 = new Intent(context, MainActivity.class);
            intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             context.startActivity(intent1);
            }

           // запускаем дозвон
          if( strBody.equals("CALL")){
                
                Intent intent1 = new Intent(context, Call.class);
                intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                
                context.startActivity(intent1);
                }
}


Пишем класс для дозвона.

public class Call extends Activity{
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
			
		
		        dialNumber();
                finish();
	   
    }

	// звонок на ваш номер
		public  void dialNumber() {
			Intent intent = new Intent(Intent.ACTION_CALL);
			intent.setData(Uri.parse("tel:" + "ВАШ_НОМЕР"));
			startActivity(intent);
		}
}


В классе MainActivity мы получаем данные с Arduino через механизм Handler.

 h = new Handler() {
            public void handleMessage(android.os.Message msg) {
              switch (msg.what) {
              case ArduinoData:
	        	  byte[] readBuf = (byte[]) msg.obj;
	              String strIncom = new String(readBuf, 0, msg.arg1);                                         
	             
                      // запускаем сирену
                      // воспроизводим музыкальный файл для  эффекта

	              Context appContext = getApplicationContext();
	              @SuppressWarnings("unused")
	                MediaPlayer resourcePlayer = MediaPlayer.create(appContext,R.raw.sirena);
	                resourcePlayer.start();
             
              
	             // разрываем связь с Arduino шлём смс и убиваем Activity
	              try {
	      	        btSocket.close();
	      	      setTitle("***Разрыв***");
	      	      } catch (IOException e2) {
	      	        
	      
	      	      }
	              
	              sendSms("ВАШ_НОМЕР", "***ALARM***ALARM***ALARM***");
	           
	              finish();
        
	              break;
              }
            };
          };


Метод для отправки смс.

// Отсылка смс
	    public synchronized void sendSms(String numphone, String txt) {
	        try {            
	            if (smsWait) {
	                return;
	            }
	            smsWait=true;
	            PendingIntent sendResult = createPendingResult(ReqCodeSms, 
	            getIntent(), 0);
	            SmsManager.getDefault().sendTextMessage(numphone, null, txt, 
	            sendResult, null);
	            setTitle("***Смс ушло***");
	            
	            
	        } catch (Exception e) {
	            e.printStackTrace();
	            setTitle("***Смс не отправлено***");
	        }
       }


Пока всё.Получилась забавная игрушка и полезная вещь.

Комментарии (3)


  1. forcewake
    29.01.2016 12:52
    +8

    Вроде не первый день на хабре (судя поrecovery mode)
    Посту под катом было бы уютнее, а коду, скорее всего, на гитхабе было бы приятнее.


    1. ragimovich
      29.01.2016 14:58
      +4

      > Вроде не первый день на хабре

      Не первый, а второй. Карму он успел слить вчера за «браузер для андроид».


  1. m0sk1t
    29.01.2016 15:22
    +1

    Крепкий орешек оказался))) второй пост минусуют а парень не сдаётся!