SSブログ

OLEDをArduinoとAndroidでコントロールしてみた! [Arduino]

OLEDをせっかくESP-WROOM-02で制御できるようにしたので、WiFi経由でAndroidスマホでコントロールしてみることにしました。


OLED with ESP8266 controlled by Android.JPG


ESP-WROOM-02側の配線は前回と同じです。


OLED+ESP-WROOM02.png


AndroidのプログラムはESP-WROOM-02でWiFiでLチカしたプログラムを流用しました。画像は3種類用意をしていてボタンで切り替えます。


AndroidImage.png


プログラムを下記に示します。長いのでAsyncSocketは省略しました。詳しくはこちらを参照してください。


public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private EditText mEditText = null;
    private TextView mText = null;
    private Button mOledLaugh = null;
    private Button mOledCry = null;
    private Button mOledAngry = null;

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

        mEditText = (EditText)findViewById(R.id.edittext);
        mText = (TextView)findViewById(R.id.result);
        mOledLaugh = (Button)findViewById(R.id.laugh);
        mOledCry = (Button)findViewById(R.id.cry);
        mOledAngry = (Button)findViewById(R.id.angry);

        mOledLaugh.setOnClickListener(this);
        mOledCry.setOnClickListener(this);
        mOledAngry.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.laugh:
            sendOperation("LAUGH");
            Log.v("OLED" ,"LAUGH");
            break;
        case R.id.cry:
            sendOperation("CRY");
            Log.v("OLED", "CRY");
            break;
        case R.id.angry:
            sendOperation("ANGRY");
            Log.v("OLED", "ANGRY");
            break;
        default:
        }
    }

    private void sendOperation(String OnOff) {
        String editText = mEditText.getText().toString();
        String ip_and_port[] = editText.split(":");
        AsyncSocket socket = new AsyncSocket(ip_and_port[0], ip_and_port[1], mText);
        socket.execute(OnOff);
        socket = null;
    }
}



ESP-WROOM-02のスケッチを示します。画像データや一部コードは長いので省略をしています。
詳しくはこちらを参照してください。

#include <Wire.h>
#include <ESP8266WiFi.h>

const int OLED_ADDR = 0x3C;
const int RESET_pin = 2;

const char* ssid = "your ssid";
const char* password = "your password";

WiFiServer server(8080);
WiFiClient client;

void connectWiFi(const char* ssid ,const char* password) {
   
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid ,password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void WriteCommand(byte cmd) {
  Wire.write(0x80);
  Wire.write(cmd);
}

void resetOLED() {

  digitalWrite(RESET_pin, HIGH);
  delay(1);
  digitalWrite(RESET_pin, LOW);
  delay(2); // reset 2msec
  digitalWrite(RESET_pin, HIGH);

}

void initOLED() {
  // 長いので省略   
}

void clearScreen() {
  // 長いので省略…
}

void drawNyaha(const unsigned char data[]) {

  int i,j,k,n;
  for (i = 0; i < 8; ++i) {
    Wire.beginTransmission(OLED_ADDR);
    WriteCommand(0xB0 + i);
    WriteCommand(0x10);
    WriteCommand(0x00);
    Wire.endTransmission();

    // Need to consider the Wire library limitation of sending data up to 32 bytes.
    for (j = 0; j < 8; ++j) {
      Wire.beginTransmission(OLED_ADDR);
      Wire.write(0x40);
      for (k = 0; k < 16; ++k) {
        n = i*128+j*16+k;
        Wire.write(data[n]);
      }
      Wire.endTransmission();
    }
  }
}

const unsigned char laugh [] = {
  // 長いので省略…
};

const unsigned char cry [] = {
  // 長いので省略…
};


const unsigned char angry [] = {
  // 長いので省略…
};


void setup() {
  pinMode(RESET_pin, OUTPUT);

  Wire.begin(12, 14); // SDA is pin12, SCK is pin14  
  Serial.begin(115200);

  Serial.println("Reset OLED");
  resetOLED();
  
  Serial.println("\nInit OLED");
  initOLED();
  clearScreen();
  delay(2);
  drawNyaha(laugh);
  
  // Setup WiFi
  connectWiFi(ssid ,password);
  server.begin();
  client = server.available();

}

void loop() {
  
  while ((WiFi.status() != WL_CONNECTED)) {
    connectWiFi(ssid ,password);
  }

  while (!client) {
    client = server.available();
    delay(1);
  }
  
  while (!client.available()) {
    delay(1);
  }

  Serial.println("client connected");
  String res = client.readStringUntil('\n');
  Serial.println(res);
  client.flush();
  client.stop();
  
  if (res.equals("LAUGH")) {
    drawNyaha(laugh);
  }
  else if (res.equals("CRY")) {
    drawNyaha(cry);
  }
  else if (res.equals("ANGRY")) {
    drawNyaha(angry);
  }
  else {
    Serial.println("ERROR");
  }
}



ESP-WROOM-02 はメモリ容量が意外に大きいので画像データを3種類準備してもなんなく格納できてしまいました。それでは実際に動かしてみましょう。





こうやって動きがあると楽しいものですね。OLEDでやりたいことは大体出来たので次はカメラモジュールにチャレンジしてみようかな。
(^_^)/~








ESP-WROOM-02実装済みmikroBUS(R)対応ブレークアウトボード

ESP-WROOM-02実装済みmikroBUS(R)対応ブレークアウトボード

  • 出版社/メーカー: マイクロテクニカ
  • メディア: おもちゃ&ホビー



FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)

FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)

  • 出版社/メーカー: スイッチサイエンス
  • メディア: エレクトロニクス




nice!(31)  コメント(0)  トラックバック(0) 
共通テーマ:趣味・カルチャー

nice! 31

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。