Pengukur cahaya dari pemain Tiongkok

Saya suka menanam tanaman dan saya ingin tahu tingkat iluminasi, karena ada tingkat iluminasi yang disarankan untuk tanaman. Di aliexpress, sensor BH1750 yang dikalibrasi dibeli. Juga di Internet ada informasi tentang pemutar China, yang memungkinkan Anda untuk mengumpulkan sesuatu darinya, karena sudah ada perpustakaan untuk tampilan. Dan saya ingin melewati mereka: layar, arduino, sensor, dan tentu saja semuanya didukung oleh baterai yang terpasang pada pemain.

Sebenarnya, inilah yang terjadi:



Pengukur cahaya kompak di kasing pemain.

Karakteristik meter cahaya ditentukan oleh sensor, dan dapat mengukur pencahayaan dari 1 hingga 65535 lux.

Seperti yang dapat Anda lihat di foto di layar, tidak ada yang lain selain angka, bahkan satuan pengukuran. Saya tidak melakukannya karena saya tidak melihat perlunya, dan layarnya kecil. Tidak ada kontrol baterai.

Saya membeli pemain di sini . Saya memberikan tautan karena dalam hal ini setidaknya ada 2 opsi untuk papan, dan saya membawa kontak untuk saya sendiri.

Ada komentar pada pemain: karena saya meninggalkan sirkuit pengisian daya asli saya, saya harus berhati-hati dengan itu: dengan mudah mengisi ulang baterai dan membengkak. Lebih baik tidak menggunakannya sama sekali, dalam kasus yang ideal, buat papan Anda sebagai pengontrol biaya, mikrokontroler, dll.

Majelis:

1. Bongkar pemain dengan hati-hati, simpan semua detail! Mereka akan tetap berguna.
2. Baterai tidak terjual sementara. Solder controller asli, jack 3.5mm (untuk headphone), slot kartu memori, senter LED.
3. Saya memerlukan Arduino Pro Mini, saya hanya punya 5V 16MHz, tetapi juga berhasil dari 3.3V. Dan tentu saja Anda membutuhkan adaptor USB-UART ke 3.3V.
4. Butuh kawat tipis. Saya memiliki MGTF, saya tidak ingat diameternya, tetapi yang tebal untuk tugas ini, saya hampir tidak memasukkannya, ambil setipis mungkin segera.

Saya tidak membuat skema, kontak yang diperlukan ditunjukkan dalam gambar:






Karena tidak ada pustaka untuk tampilan yang cocok dengan saya, saya menulis kode saya sendiri, termasuk mengendalikan tampilan berdasarkan salah satunya. Kode ini dibagi menjadi beberapa file, dikompilasi dalam Arduino IDE 1.6.12.

Luxmeter_mod2.ino
#include <avr/pgmspace.h>
#define pgm     pgm_read_byte
#include <Wire.h>
#include <BH1750.h>

BH1750 lightMeter;
unsigned int lux;

#define CS      10
#define Data    11
#define Clock   13
#define DC      A0

#define LCD_X        128
#define LCD_Y        64
#define LCD_String    8
#define swap(a, b) { int t = a; a = b; b = t; }

#define LCD_D         1
#define LCD_C         0

byte LCD_RAM[LCD_X*LCD_String];

#define BLACK 1
#define WHITE 0

#define LCDWIDTH 128
#define LCDHEIGHT 64

#define CMD_DISPLAY_OFF   0xAE
#define CMD_DISPLAY_ON    0xAF

#define CMD_SET_DISP_START_LINE  0x40
#define CMD_SET_PAGE  0xB0

#define CMD_SET_COLUMN_UPPER  0x10
#define CMD_SET_COLUMN_LOWER  0x00

#define CMD_SET_ADC_NORMAL  0xA0
#define CMD_SET_ADC_REVERSE 0xA1

#define CMD_SET_DISP_NORMAL 0xA6
#define CMD_SET_DISP_REVERSE 0xA7

#define CMD_SET_ALLPTS_NORMAL 0xA4
#define CMD_SET_ALLPTS_ON  0xA5
#define CMD_SET_BIAS_9 0xA2 
#define CMD_SET_BIAS_7 0xA3

#define CMD_RMW  0xE0
#define CMD_RMW_CLEAR 0xEE
#define CMD_INTERNAL_RESET  0xE2
#define CMD_SET_COM_NORMAL  0xC0
#define CMD_SET_COM_REVERSE  0xC8
#define CMD_SET_POWER_CONTROL  0x28
#define CMD_SET_RESISTOR_RATIO  0x20
#define CMD_SET_VOLUME_FIRST  0x81
#define  CMD_SET_VOLUME_SECOND  0
#define CMD_SET_STATIC_OFF  0xAC
#define  CMD_SET_STATIC_ON  0xAD
#define CMD_SET_STATIC_REG  0x0
#define CMD_SET_BOOSTER_FIRST  0xF8
#define CMD_SET_BOOSTER_234  0
#define  CMD_SET_BOOSTER_5  1
#define  CMD_SET_BOOSTER_6  3
#define CMD_NOP  0xE3
#define CMD_TEST  



Font.ino
#include <avr/pgmspace.h>
//  1632 
static const char mass16x32 [10][64] PROGMEM ={
{   0xF8, 0xFC, 0xFA, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8, //0
    0x3F, 0x7F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x3F,
    0xFE, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFE,
    0x1F, 0x3F, 0x5F, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F},

{   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0xF8, //1
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x3F,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFE,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x1F},

    {0x00, 0x00, 0x02, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8, //2
    0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xBF, 0x7F, 0x3F,
    0xFE, 0xFF, 0xFE, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
    0x1F, 0x3F, 0x5F, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x40, 0x00, 0x00},

    {0x00, 0x00, 0x02, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8, //3
    0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xBF, 0x7F, 0x3F,
    0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFE, 0xFF, 0xFE,
    0x00, 0x00, 0x40, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F},

    {0xF8, 0xFC, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0xF8, //4
    0x3F, 0x7F, 0xBF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xBF, 0x7F, 0x3F,
    0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFE, 0xFF, 0xFE,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x1F},

    {0xF8, 0xFC, 0xFA, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x02, 0x00, 0x00, //5
    0x3F, 0x7F, 0xBF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFE, 0xFF, 0xFE,
    0x00, 0x00, 0x40, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F},

    {0xF8, 0xFC, 0xFA, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x02, 0x00, 0x00, //6
    0x3F, 0x7F, 0xBF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00,
    0xFE, 0xFF, 0xFE, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFE, 0xFF, 0xFE,
    0x1F, 0x3F, 0x5F, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F},

    {0x00, 0x00, 0x02, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8, //7
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x3F,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFE,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x1F},

    {0xF8, 0xFC, 0xFA, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8, //8
    0x3F, 0x7F, 0xBF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xBF, 0x7F, 0x3F,
    0xFE, 0xFF, 0xFE, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFE, 0xFF, 0xFE,
    0x1F, 0x3F, 0x5F, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F},

    {0xF8, 0xFC, 0xFA, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFA, 0xFC, 0xF8, //9
    0x3F, 0x7F, 0xBF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xBF, 0x7F, 0x3F,
    0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFE, 0xFF, 0xFE,
    0x00, 0x00, 0x40, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x5F, 0x3F, 0x1F}};

<source lang="arduino">


LCD.ino
#include <avr/pgmspace.h>
//====================================================== 
void Clear_LCD() {
  for (int index = 0; index < 864 ; index++) {
    LCD_RAM[index] = (0x00);
  }
}

//======================================================= 
void dWrite(byte pin, byte val) {
  byte bit = digitalPinToBitMask(pin);
  volatile byte *out;
  out = portOutputRegister(digitalPinToPort(pin));
  (val) ? *out |= bit : *out &= ~bit;
}

#define _BV(bit) (1<<(bit))
//========================================================= 8 
void SendByte(byte mode, byte c) {
  dWrite(CS, 0);
  (mode) ? dWrite(DC, 1) : dWrite(DC, 0);
  for (byte i = 0; i <8; i++) {
    dWrite(Clock, 0);
    (c & 0x80) ? dWrite(Data, 1) : dWrite(Data, 0);
    dWrite(Clock, 1);
    c <<= 1;
  }
}

//===================================================== 
void Update() {
  for (byte p = 0; p < 8; p++) {
    //SendByte(LCD_C, CMD_SET_PAGE | pagemap[p]);
    SendByte(LCD_C, CMD_SET_PAGE | p);

    byte col = 0;

    SendByte(LCD_C, CMD_SET_COLUMN_LOWER | (1 & 0xf));
    SendByte(LCD_C, CMD_SET_COLUMN_UPPER | ((1 >> 4) & 0x0F));
    SendByte(LCD_C, CMD_RMW);

    for (byte col = 0; col < LCD_X; col++) {
      SendByte(LCD_D, LCD_RAM[(LCD_X * p) + col]);
    }
  }
}


//=================================================== 
void drawPixel (byte x, byte y, boolean color) {
  if ((x < 0) || (x >= LCD_X) || (y < 0) || (y >= LCD_Y)) return;

  if (color) LCD_RAM[x + (y / 8)*LCD_X] |= _BV(y % 8);
  else       LCD_RAM[x + (y / 8)*LCD_X] &= ~_BV(y % 8);
}

//====================================================== 
void drawBitmap(byte x, byte y, const char *bitmap, byte w, byte h, boolean color) {
  for (int16_t j = 0; j < h; j++) {
    for (int16_t i = 0; i < w; i++ ) {
      if (pgm(bitmap + i + (j / 8)*w) & _BV(j % 8)) {
        drawPixel(x + i, y + j, color);
      }
    }
  }
}

//========================================================================
//                         
//========================================================================




//=================================================== 
void Inicialize() {
  pinMode(CS,    OUTPUT);
  pinMode(Data,  OUTPUT);
  pinMode(Clock, OUTPUT);
  pinMode(DC, OUTPUT);

  //  
  dWrite(CS, 0);
  delay(500);

  SendByte(LCD_C, CMD_SET_BIAS_7);              // LCD bias select
  SendByte(LCD_C, CMD_SET_ADC_NORMAL);          // ADC select
  SendByte(LCD_C, CMD_SET_COM_REVERSE);          // SHL select
  SendByte(LCD_C, CMD_SET_DISP_START_LINE);     // Initial display line
  SendByte(LCD_C, CMD_SET_POWER_CONTROL | 0x4); // turn on voltage converter (VC=1, VR=0, VF=0)
  delay(50);
  SendByte(LCD_C, CMD_SET_POWER_CONTROL | 0x6); // turn on voltage regulator (VC=1, VR=1, VF=0)
  delay(50);
  SendByte(LCD_C, CMD_SET_POWER_CONTROL | 0x7); // turn on voltage follower (VC=1, VR=1, VF=1)
  delay(10);
  SendByte(LCD_C, CMD_SET_RESISTOR_RATIO | 0x6); // set lcd operating voltage (regulator resistor, ref voltage resistor)

  SendByte(LCD_C, CMD_DISPLAY_ON);
  SendByte(LCD_C, CMD_SET_ALLPTS_NORMAL);

  SendByte(LCD_C, CMD_SET_DISP_REVERSE);

  SendByte(LCD_C, CMD_SET_VOLUME_FIRST);
  SendByte(LCD_C, CMD_SET_VOLUME_SECOND | (0 & 0x3f));

  Clear_LCD();
  Update();
}

//=========================  1632    XY
void simb16x32(byte x, byte y, boolean color, byte c) {
  for (byte k = 0; k < 4; k++) {
    for (byte i = 0; i < 16; i++) {
      byte line = pgm(&(mass16x32[c][i + k * 16]));
      for (byte j = 0; j < 8; j++) {
        (line & 0x01) ? drawPixel(x + i, y + j + k * 8, color) : drawPixel(x + i, y + j + k * 8, !color);
        line >>= 1;
      }
    }
  }
}
<source lang="arduino">


Main.ino
#include <avr/pgmspace.h>
void setup(){
  Inicialize();
  lightMeter.begin();
}
+
void loop(){
  lux = lightMeter.readLightLevel();
  simb16x32(95,  17, 1, lux%10);
  lux/=10;
  simb16x32(75,  17, 1, lux%10);
  lux/=10;
  simb16x32(55,  17, 1, lux%10);
  lux/=10;
  simb16x32(35,  17, 1, lux%10);
  lux/=10;
  simb16x32(15,  17, 1, lux%10);

  Update();
  delay(300);
}
<source lang="arduino">


Saya ingin segera mengatakan bahwa ini lebih merupakan indikator daripada alat pengukur, tetapi dapat bermanfaat untuk memiliki indikator seperti itu, apalagi, akan diperlukan satu malam untuk berkumpul jika ada beberapa pengalaman.

Ada juga video, tetapi tidak ada suara. Saya ingin merekamnya secara terpisah, tetapi ternyata tidak satu pun mikrofon saya dapat melakukan ini secara normal.

Source: https://habr.com/ru/post/id400989/


All Articles