【雕爷学编程】Arduino动手做(136)---0.91寸OLED液晶屏模块5

news2024/12/23 12:23:36

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

项目十九:OLED屏显示时钟

实验开源代码

/*

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

 项目十九:OLED屏显示时钟

 实验接线: 

 oled模块  Ardunio Uno

 GND---------GND接地线

 VCC---------5V 接电源

 SDA---------A4

 SCL ------- A5

*/



#include "ssd1306.h"

uint32_t lastMillis;

uint8_t hours = 10;

uint8_t minutes = 02;

uint8_t seconds = 0;

void printSeconds() {

 if (seconds & 1) {

  ssd1306_printFixed(54, 2, ":", STYLE_NORMAL);

 }

 else {

  ssd1306_printFixed(54, 2, " ", STYLE_NORMAL);

 }

}

void printMinutes() {

 char minutesStr[3] = "00";

 minutesStr[0] = '0' + minutes / 10;

 minutesStr[1] = '0' + minutes % 10;

 ssd1306_printFixed(78, 2, minutesStr, STYLE_NORMAL);

}

void printHours() {

 char hoursStr[3] = "00";

 hoursStr[0] = '0' + hours / 10;

 hoursStr[1] = '0' + hours % 10;

 ssd1306_printFixed(6, 2, hoursStr, STYLE_NORMAL);

}

void setup() {

 //如果您需要使用 128x32 显示,请将下面的行替换为 ssd1306_128x32_i2c_init()

 ssd1306_128x32_i2c_init();

 ssd1306_fillScreen(0x00);

 ssd1306_setFixedFont(comic_sans_font24x32_123);

 lastMillis = millis();

 printHours();

 printMinutes();

}

void loop() {

 if ((uint32_t)(millis() - lastMillis) >= 1000) {

  lastMillis += 1000;

  if (++seconds > 59)

  {

   seconds = 0;

   if (++minutes > 59)

   {

    minutes = 0;

    if (++hours > 23)

    {

     hours = 0;

    }

    printHours();

   }

   printMinutes();

  }

  printSeconds();

 }

}

Arduino实验场景图

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

项目二十:OLED屏显示自动翻滚文本字符

实验开源代码

/*

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

 项目二十:OLED屏显示自动翻滚文本字符

 实验接线: 

 oled模块  Ardunio Uno

 GND---------GND接地线

 VCC---------5V 接电源

 SDA---------A4

 SCL ------- A5

*/



#include "ssd1306.h"

#include "ssd1306_console.h"

void setup() {

 /* Replace the line below with the display initialization function, you want to use */

 ssd1306_128x32_i2c_init();

 ssd1306_clearScreen();

 /* Set font to use with console */

 ssd1306_setFixedFont(ssd1306xled_font6x8);

}

void loop() {

 ssd1306_print( "Hello World\n" );

 delay(500);

 ssd1306_print( "Life is toss\n" );

 delay(500);

}

Arduino实验场景图
在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

项目二十一:自动计数器

实验开源代码

/*

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

   实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

 项目二十一:自动计数器

 实验接线: 

 oled模块  Ardunio Uno

 GND---------GND接地线

 VCC---------5V 接电源

 SDA---------A4

 SCL ------- A5

*/



#include "ssd1306.h"

#include "ssd1306_console.h"

Ssd1306Console console;

void setup(){

  /* Replace the line below with the display initialization function, you want to use */

  ssd1306_128x32_i2c_init();

  ssd1306_clearScreen();

  /* Set font to use with console */

  ssd1306_setFixedFont(ssd1306xled_font6x8);

}

void loop(){

  static uint8_t i = 0;

  /* Here use any methods, provided by Arduino Print class */

  console.print("Line ");

  console.print( i );

  i++;

  delay(500);

  console.println("");

}

Arduino实验场景图

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

项目二十二:OLED屏显示进度条

实验开源代码

/*

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

   实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

 项目二十二:OLED屏显示进度条

 实验接线: 

 oled模块  Ardunio Uno

 GND---------GND接地线

 VCC---------5V 接电源

 SDA---------A4

 SCL ------- A5

*/



#include "ssd1306.h"

void setup(){

  /* Replace the line below with ssd1306_128x32_i2c_init() if you need to use 128x32 display */

  ssd1306_128x32_i2c_init();

  ssd1306_fillScreen(0x00);

  ssd1306_setFixedFont(ssd1306xled_font6x8);

}

int progress = 0;

void loop(){

  ssd1306_drawProgressBar( progress );

  progress++;

  if ( progress > 100 )

  {

    progress = 0;

    delay( 1000 );

  }

  else

  {

    delay( 30 );

  }

}

Arduino实验场景图

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

项目二十三:黄色屏声音可视化器

实验开源代码

/*

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

 项目二十三:黄色屏声音可视化器

 实验接线: max9814接A0

 oled模块  Ardunio Uno

 GND---------GND接地线

 VCC---------5V 接电源

 SDA---------A4

 SCL ------- A5

*/

#include "arduinoFFT.h"

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

#define SAMPLES 64 // power of 2

#define SAMPLING_FREQ 8000 // 12 kHz Fmax = sampleF /2 

#define AMPLITUDE 100 // 灵敏度

#define FREQUENCY_BANDS 14

#define SCREEN_WIDTH 128

#define SCREEN_HEIGHT 32

#define BARWIDTH 11

#define BARS 11

#define ANALOG_PIN A0

#define OLED_RESET   -1 // 重置引脚 #(如果共享 Arduino 重置引脚,则为 -1)

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

double vImag[SAMPLES];

double vReal[SAMPLES];

unsigned long sampling_period_us;

arduinoFFT fft = arduinoFFT(vReal, vImag, SAMPLES, SAMPLING_FREQ);

//调整参考以去除背景噪声

float reference = log10(60.0);

double coutoffFrequencies[FREQUENCY_BANDS];

void setup() {

 // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally

 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32

  for (;;); // Don't proceed, loop forever

 }

 // Setup display

 display.clearDisplay();

 display.display();

 display.setRotation(0);

 display.invertDisplay(false);

 sampling_period_us = (1.0 / SAMPLING_FREQ ) * pow(10.0, 6);

 // 计算截止频率,以对数标度为基数 POt

 double basePot = pow(SAMPLING_FREQ / 2.0, 1.0 / FREQUENCY_BANDS);

 coutoffFrequencies[0] = basePot;

 for (int i = 1 ; i < FREQUENCY_BANDS; i++ ) {

  coutoffFrequencies[i] = basePot * coutoffFrequencies[i - 1];

 }

 // 绘制虚线以分离频段

 for (int i = 0; i < BARS - 1 ; i++) {

  for (int j = 0; j < SCREEN_HEIGHT ; j += 4) {

   display.writePixel((i + 1)*BARWIDTH + 2 , j, SSD1306_WHITE );

  }

 }

 display.drawRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, SSD1306_WHITE);

}

int oldHeight[20];

int oldMax[20];

double maxInFreq;

void loop() {

 // 采样

 for (int i = 0; i < SAMPLES; i++) {

  unsigned long newTime = micros();

  int value = analogRead(ANALOG_PIN);

  vReal[i] = value;

  vImag[i] = 0;

  while (micros() < (newTime + sampling_period_us)) {

   yield();

  }

 }

 // 计算 FFT

 fft.DCRemoval();

 fft.Windowing(FFT_WIN_TYP_HAMMING, FFT_FORWARD);

 fft.Compute(FFT_FORWARD);

 fft.ComplexToMagnitude();

 double median[20];

 double max[20];

 int index = 0;

 double hzPerSample = (1.0 * SAMPLING_FREQ) / SAMPLES; //

 double hz = 0;

 double maxinband = 0;

 double sum = 0;

 int count = 0;

 for (int i = 2; i < (SAMPLES / 2) ; i++) {

  count++;

  sum += vReal[i];

  if (vReal[i] > max[index] ) {

   max[index] = vReal[i];

  }

  if (hz > coutoffFrequencies[index]) {

   median[index] = sum / count;

   sum = 0.0;

   count = 0;

   index++;

   max[index] = 0;

   median[index] = 0;

  }

  hz += hzPerSample;

 }

 // 计算每个频段的中值和最大值

 if ( sum > 0.0) {

  median[index] = sum / count;

  if (median[index] > maxinband) {

   maxinband = median[index];

  }

 }

 int bar = 0;

 for (int i = FREQUENCY_BANDS - 1; i >= 3; i--) {

  int newHeight = 0;

  int newMax = 0;

  // 计算实际分贝

  if (median[i] > 0 && max[i] > 0 ) {

   newHeight = 20.0 * (log10(median[i] ) - reference);

   newMax = 20.0 * (log10(max[i] ) - reference);

  }

  // 调整最小和最大级别

  if (newHeight < 0 || newMax < 0) {

   newHeight = 1;

   newMax = 1;

  }

  if (newHeight >= SCREEN_HEIGHT - 2) {

   newHeight = SCREEN_HEIGHT - 3;

  }

  if (newMax >= SCREEN_HEIGHT - 2) {

   newMax = SCREEN_HEIGHT - 3;

  }

  int barX = bar * BARWIDTH + 5;

  // 删除旧水平中位数

  if (oldHeight[i] > newHeight) {

   display.fillRect(barX, newHeight + 1, 7, oldHeight[i], SSD1306_BLACK);

  }

  // 删除旧的最大级别

  if ( oldMax[i] > newHeight) {

   for (int j = oldMax[i]; j > newHeight; j -= 2) {

    display.drawFastHLine(barX , j, 7, SSD1306_BLACK);

   }

  }

  // 绘制新的最大级别

  for (int j = newMax; j > newHeight; j -= 2) {

   display.drawFastHLine(barX , j, 7, SSD1306_WHITE);

  }

  // 绘制新的级别中位数

  display.fillRect(barX , 1, 7, newHeight, SSD1306_WHITE);

  oldMax[i] = newMax;

  oldHeight[i] = newHeight;

  bar++;

 }

 display.drawFastHLine(0 , SCREEN_HEIGHT - 1, SCREEN_WIDTH, SSD1306_WHITE);

 display.display();

}

Arduino实验场景图

在这里插入图片描述
在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

项目二十三:黄色屏声音可视化器

实验视频剪辑

https://v.youku.com/v_show/id_XNTgwODkzMzY3Mg==.html?spm=a2hcb.playlsit.page.1

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

项目二十四:Arduino OLED 频谱分析仪

实验开源代码

/*

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

 项目二十四:Arduino OLED 频谱分析仪

 实验接线: 

 oled模块  Ardunio Uno

 GND---------GND接地线

 VCC---------5V 接电源

 SDA---------A4

 SCL ------- A5

*/

#include <fix_fft.h>          

#include <ssd1306.h>          

#include <nano_engine.h>        

// These are user-adjustable

#define LOG_OUTPUT         // Uncomment to enable logarithmic output (exchanges absolute resoluton for more readable output; may require different below params)

#define SAMPLING_FREQUENCY 15000 // Sampling frequency (Actual max measured frequency captured is half)

#define TIME_FACTOR 2       // Smoothing factor (lower is more dynamic, higher is smoother) ranging from 1 to 10+

#define SCALE_FACTOR 13      // Direct scaling factor (raise for higher bars, lower for shorter bars)

#ifdef LOG_OUTPUT

const float log_scale = 64. / log(64. / SCALE_FACTOR + 1.);  // Attempts to create an equivalent to SCALE_FACTOR for log function

#endif

const float coeff = 1. / TIME_FACTOR;             // Time smoothing coefficients (used to factor in previous data)

const float anti_coeff = (TIME_FACTOR - 1.) / TIME_FACTOR;

const unsigned int sampling_period_us = round(1000000 * (2.0 / SAMPLING_FREQUENCY)); // Sampling period (doubled to account for overclock)

int8_t data[64], buff[32];                   // used to store FFT input/output and past data

unsigned long microseconds;                  // used for timekeeping

int summ, avg;                         // used for DC bias elimination

NanoEngine<TILE_32x32_MONO> engine;              // declares nanoengine

void setup()

{

 OSCCAL = 240; // Overclocks the MCU to around 30 MHz, set lower if this causes instability, raise if you can/want

 ADCSRA &= ~(bit (ADPS0) | bit (ADPS1) | bit (ADPS2));    // clear ADC prescaler bits

 ADCSRA |= bit (ADPS2);                   // sets ADC clock in excess of 10kHz

 ADCSRA |= bit (ADPS0);

 ssd1306_128x64_i2c_init();                 // initializes OLED

 ssd1306_clearScreen();                   // clears OLED

 engine.begin();                       // inititalizes nanoengine

};

void loop()

{

 summ = 0;

 for (int i = 0; i < 64; i++) {

  microseconds = micros();

  data[i] = ((analogRead(A0)) >> 2) - 128;            // Fitting analogRead data (range:0 - 1023) to int8_t array (range:-128 - 127)

  summ += data[i];

  while (micros() < (microseconds + sampling_period_us)) {    // Timing out uC ADC to fulfill sampling frequency requirement

  }

 }

 // Eliminating remaining DC component (produces usable data in FFT bin #0, which is usually swamped by DC bias)

 avg = summ / 64;

 for (int i = 0; i < 64; i++) {

  data[i] -= avg;

 }

 fix_fftr(data, 6, 0);               // Performing real FFT

 // Time smoothing by user-determined factor and user-determined scaling

 for (int count = 0; count < 32; count++) {

  if (data[count] < 0) data[count] = 0;                     // Eliminating negative output of fix_fftr

#ifdef LOG_OUTPUT

  else data[count] = log_scale * log((float)(data[count] + 1));         // Logarithmic function equivalent to SCALING_FACTOR*log2(x+1)

#else

  else data[count] *= SCALE_FACTOR;                       // Linear scaling up according to SCALE_FACTOR

#endif

  data[count] = (float)buff[count] * anti_coeff + (float)data[count] * coeff;  // Smoothing by factoring in past data

  buff[count] = data[count];                          // Storing current output as next frame's past data

  if (data[count] > 63) data[count] = 63;                    // Capping output at screen height

 }

 // Output to SSD1306 using nanoengine canvas from library

 engine.refresh();                        // Mark entire screen to be refreshed

 engine.canvas.clear();                     // Clear canvas as previous data

 for (int i = 0; i < 8; i++) {

  engine.canvas.drawVLine(i * 4, 31 - (data[i] + 1), 31); // Draw to canvas data for lower-leftest sector (FFT bins 0 - 7, lower half)

 }

 engine.canvas.blt(0, 32);                    // Outputs canvas to OLED with an offset (x pixels, y pixels)

 engine.canvas.clear();

 for (int i = 0; i < 8; i++) {

  if (data[i] > 31) engine.canvas.drawVLine(i * 4, 31 - (data[i] - 31), 31); // Draw to canvas data for upper-leftest sector (FFT bins 0 - 7, upper half)

 }

 engine.canvas.blt(0, 0);

 engine.canvas.clear();

 for (int i = 8; i < 16; i++) {

  engine.canvas.drawVLine((i - 8) * 4, 31 - (data[i] + 1), 31); // FFT bins 8 - 15, lower half

 }

 engine.canvas.blt(32, 32);

 engine.canvas.clear();

 for (int i = 8; i < 16; i++) {

  if (data[i] > 31) engine.canvas.drawVLine((i - 8) * 4, 31 - (data[i] - 31), 31); // FFT bins 9 - 15, upper half

 }

 engine.canvas.blt(32, 0);

 engine.canvas.clear();

 for (int i = 16; i < 24; i++) {

  engine.canvas.drawVLine((i - 16) * 4, 31 - (data[i] + 1), 31); // FFT bins 16 - 23, lower half

 }

 engine.canvas.blt(64, 32);

 engine.canvas.clear();

 for (int i = 16; i < 24; i++) {

  if (data[i] > 31) engine.canvas.drawVLine((i - 16) * 4, 31 - (data[i] - 31), 31); // FFT bins 16 - 23, upper half

 }

 engine.canvas.blt(64, 0);

 engine.canvas.clear();

 for (int i = 24; i < 32; i++) {

  engine.canvas.drawVLine((i - 24) * 4, 31 - (data[i] + 1), 31); // FFT bins 24 - 31, lower half

 }

 engine.canvas.blt(96, 32);

 engine.canvas.clear();

 for (int i = 24; i < 32; i++) {

  if (data[i] > 31) engine.canvas.drawVLine((i - 24) * 4, 31 - (data[i] - 31), 31); // FFT bins 24 - 31, upper half

 }

 engine.canvas.blt(96, 0);

}

Arduino实验场景图

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

项目二十四:Arduino OLED 频谱分析仪

实验视频剪辑

https://v.youku.com/v_show/id_XNTgwOTAzMzIxNg==.html?spm=a2hcb.playlsit.page.1

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

项目二十五:简单的文本反转

实验开源代码

/*

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

 项目二十五:简单的文本反转

 实验接线:

 oled模块  Ardunio Uno

 GND---------GND接地线

 VCC---------5V 接电源

 SDA---------A4

 SCL ------- A5

*/

#include <Wire.h>

#include "SSD1306Ascii.h"

#include "SSD1306AsciiWire.h"

// 0X3C+SA0 - 0x3C or 0x3D

#define I2C_ADDRESS 0x3C

// Define proper RST_PIN if required.

#define RST_PIN -1

SSD1306AsciiWire oled;

//------------------------------------------------------------------------------

void setup() {

 Wire.begin();

 Wire.setClock(400000L);

#if RST_PIN >= 0

 oled.begin(&Adafruit128x32, I2C_ADDRESS, RST_PIN);

#else // RST_PIN >= 0

 oled.begin(&Adafruit128x32, I2C_ADDRESS);

#endif // RST_PIN >= 0

 oled.setFont(System5x7);

 oled.clear();

 oled.println("normal");

 oled.println();

}

//------------------------------------------------------------------------------

void loop() {

 for (int i = 0; i < 4; i++) {

  // Toggle invert mode for next line of text.

  oled.setInvertMode(i % 2);

  oled.print("\rinvert");

  delay(500);

 }

 for (int i = 0; i < 4; i++) {

  // Invert all text on screen.

  oled.invertDisplay(!(i % 2));

  delay(1000);

 }

}

Arduino实验场景图

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

项目二十六:股票行情通过显示器上的一行字段移动文本(横向滚动)

实验开源代码

/*

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

 项目二十六:股票行情通过显示器上的一行字段移动文本(横向滚动)

 实验接线:

 oled模块  Ardunio Uno

 GND---------GND接地线

 VCC---------5V 接电源

 SDA---------A4

 SCL ------- A5

*/

#define RTN_CHECK 1

#include <Wire.h>

#include "SSD1306Ascii.h"

#include "SSD1306AsciiWire.h"

// 0X3C+SA0 - 0x3C or 0x3D

#define I2C_ADDRESS 0x3C

// Define proper RST_PIN if required.

#define RST_PIN -1

SSD1306AsciiWire oled;

// Ticker state. Maintains text pointer queue and current ticker state.

TickerState state;

// Use two strings to avoid modifying string being displayed.

String str[2];

//------------------------------------------------------------------------------

void setup() {

 Wire.begin();

 Wire.setClock(400000L);

#if RST_PIN >= 0

 oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);

#else // RST_PIN >= 0

 oled.begin(&Adafruit128x64, I2C_ADDRESS);

#endif // RST_PIN >= 0

 // Use Adafruit5x7, field at row 2, set2X, columns 16 through 100.

 oled.tickerInit(&state, Adafruit5x7, 2, true, 16, 100);

}

uint16_t count;

uint32_t tickTime = 0;

void loop() {

 if (tickTime <= millis()) {

  tickTime = millis() + 30;

  // Should check for error. rtn < 0 indicates error.

  int8_t rtn = oled.tickerTick(&state);

  // See above for definition of RTN_CHECK.

  if (rtn <= RTN_CHECK) {

   uint8_t pin = count%4;

   // ping-pong string selection so displayed string is not modified.

   uint8_t n = count%2;

   str[n] = "ADC" + String(pin) + ": " + analogRead(pin) + ", ";

   // Should check for error. Return of false indicates error.

   oled.tickerText(&state, str[n]);

   count++;

  }

 }

}

Arduino实验场景图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/727542.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

antd——a-tree组件拖拽节点功能——技能提升

之前写过一篇文章关于&#xff1a; antd——使用a-tree组件实现 检索自动展开自定义增删改查功能——技能提升&#xff1a;http://t.csdn.cn/13qT7 现在有个需求&#xff1a;就是要实现节点的拖拽功能。 tree组件节点的拖拽功能实现 tree组件是有拖拽功能的&#xff0c;通过…

flink-conf.yaml的参数

参数 ⚫jobmanager.memory.process.size&#xff1a;对 JobManager 进程可使用到的全部内存进行配置&#xff0c; 包括 JVM元空间和其他开销&#xff0c;默认为 1600M&#xff0c;可以根据集群规模进行适当调整。⚫ taskmanager.memory.process.size&#xff1a;对 TaskManage…

线性代数中基向量变换参照原理

经常需要用到&#xff0c;又记不住&#xff0c;所以这里记录下来方便以后翻阅。 很重要。 截图出自书为&#xff1a;

Spring Boot 中的 MyBatis 是什么,如何使用

Spring Boot 中的 MyBatis 是什么&#xff0c;如何使用 简介 MyBatis 是一种流行的 Java 持久化框架&#xff0c;可以将 SQL 查询映射到对象上&#xff0c;并提供了简单易用的 API 来执行 CRUD 操作。Spring Boot 可以与 MyBatis 集成&#xff0c;提供了简化配置和自动化配置…

基于单片机的智能台灯 灯光控制系统人体感应楼梯灯系统的设计与实现

功能介绍 以STM32单片机作为主控系统&#xff1b;主通过光敏采集当前光线强度&#xff1b;通过PMW灯光调节电路&#xff0c;我们可以根据不同的光线亮度&#xff0c;进行3挡调节&#xff1b;通过人体红外检测当前是否有人&#xff1b;通过不同光线情况下使用PWM脉冲电路进行调节…

Apifox 已上架至 TitanIDE

Apifox 目前已上架至 TitanIDE 模板&#xff0c;为 TitanIDE 用户提供快速使用接口调试工具的入口。 可以通过 TitanIDE 的「创建项目」快速新建 Apifox 模版&#xff0c;开箱即用。TitanIDE 的模板包括开发者常用的 IDE 及周边开发工具&#xff0c;如数据建模用的 PDmaner、数…

【STM32】GPIO

一、GPIO简介 1. 基本介绍 GPIO是通用输入输出端口的简称&#xff0c;STM32芯片通过GPIO与外设连接&#xff0c;从而实现与外设的数据收发。 最基本的输出功能是由STM32控制引脚输出高、低电平&#xff0c;实现开关控制。如把GPIO引脚接入到LED灯控制LED亮灭&#xff0c;或者…

中小企业的必然选择——构建高效、安全的企业网络

在当今技术驱动的商业环境中&#xff0c;可靠且高效的企业网络对中小型企业的成功是至关重要的。随着对数据密集型应用的需求不断增加&#xff0c;无线网络技术随之迅速发展&#xff0c;企业必须构建一个更快、更安全的网络以保证业务安全稳定开展。本文重点讲解中小型企业网络…

常用stream方法记录

目录 过滤filter()获取最大最小值根据条件统计数量list转mapkey值唯一key值不唯一 distinct去重groupingBy分组map遍历取list中某元素组成新的listlist转数组String基本数据类型数组转换 数组转listArrays.asList(&#xff09;Collections.addAll基本数据类型数组转list 源码和…

阿里云绑定域名

在阿里云安全组与宝塔安全放开8081端口 server {listen 8081;server_name www.whxyyds.top;charset utf-8;location / {root /home/ruoyi/projects/ruoyi-ui;try_files $uri $uri/ /index.html;index index.html index.htm;}location /prod-api/ {proxy_set_header …

途乐证券|A股自动驾驶概念“夏日躁动”

进入7月以后&#xff0c;A股智能汽车产业链——尤其是自动驾驶板块&#xff0c;开始逐渐收复去年失地。 香港途乐证券有限公司&#xff08;191883.com&#xff09;是香港最优秀的股票投资平台&#xff0c;平台致力于为投资者提供专业、安全、诚信的股票策略服务&#xff0c;通过…

微信内置h5浏览器 getBrandWCPayRequest支付

目录 getBrandWCPayRequest支付 什么是getBrandWCPayRequest支付&#xff1f; 如何使用getBrandWCPayRequest支付&#xff1f; getBrandWCPayRequest支付的特点和优势 结论 WeixinJSBridge&#xff1a;微信浏览器的JavaScript桥接工具 WeixinJSBridge的作用 WeixinJSBri…

【震惊】Top1清华考研985考研专业课惨遭团灭!

原谅我今天用了个“UC的标题”&#xff0c;只是他真的太令我震惊了&#xff01;&#xff08;请本次事件受影响者&#xff0c;务必看到最后&#xff0c;我会给出我的建议&#xff09; 事情的起因这样的&#xff1a;这周二有同学发我一条通知&#xff0c;清华大学通信考研考试科…

关于DBC文件的创建增加几点补充

上一节说了&#xff1a;DBC文件的简介与创建 这一节补充几点&#xff1a;关于DBC文件的创建增加几点补充 关于节点地址的定义和修改 有些朋友发现新建某个节点的时候&#xff0c;address栏的内容是灰色的&#xff0c;无法进行定义和修改 这个数值的更改不是在这里进行设置的…

18.ADC模数转换

1.STM32ADC简介&#xff1a; ADC(Analog to Digital Converter)即模数转换器&#xff0c;它可以将模拟信号转换成数字信号。按照其转换原理主要分为逐次逼近型、双积分型、电压频率转换型三种。 STM32 ADC主要特性&#xff1a; 12位分辨率&#xff1b;转换结束、注入…

Vue基础 -- 生命周期 数据共享

1 组件的生命周期 1.1 生命周期 & 生命周期函数 生命周期&#xff08;Life Cycle&#xff09;是指一个组件从创建 -> 运行 -> 销毁的整个阶段&#xff0c;强调的是一个时间段。 生命周期函数&#xff1a;是由 vue 框架提供的内置函数&#xff0c;会伴随着组件的生命…

UNI-APP_vmin横屏适配问题

vmax和vmin vmax 相对于视口的宽度或高度中较大的那个。其中最大的那个被均分为100单位的vmax vmin 相对于视口的宽度或高度中较小的那个。其中最小的那个被均分为100单位的vmin当竖屏布局时750rpx是竖屏布局屏幕的宽度 vmin不管横竖屏的情况下&#xff0c;100vmin都是手机屏幕…

Web漏洞-敏感信息泄露-Git操作

实验目的 熟悉常见git常见操作&#xff0c;如上传、回归、修改仓库等操作。 实验环境 git操作服务器&#xff0c;1台 web安全操作机&#xff0c;1台&#xff08;可选&#xff09; 实验内容 1.安装Git&#xff1a;sudo apt-get install git 2.安装Apache&#xff0c;为了模…

机器学习技术(二)——Python科学运算模块(Numpy、Pandas)

机器学习技术&#xff08;二&#xff09;——Python科学运算模块&#xff08;Numpy、Pandas&#xff09; 文章目录 机器学习技术&#xff08;二&#xff09;——Python科学运算模块&#xff08;Numpy、Pandas&#xff09;一、Numpy1、介绍、安装与导入2、Numpy常用操作 二、Pan…

Java面向对象程序开发——多线程开发

文章目录 前言多线程多线程的实现①、继承Thread类Thread常用方法Thread的构造器优缺点 ②、实现Runnable接口优缺点 ③、实现Callable接口Runnable接口和继承Thread类的区别 线程同步机制volatile同步锁 同步方法lock锁 线程池 前言 线程(thread)是一个程序内部的一条执行路径…