0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

LovyanGFXAdvent Calendar 2022

Day 10

LogyanGFXでグラフィックを横スクロールする

Last updated at Posted at 2022-12-16

はじめに

この記事では、LogyanGFXを使ってグラフィックスの横スクロールについて記載します。
ADコンバータで計測した電圧をオシロスコープのような波形表示を行う場合等に応用できます。

  • ソースの修正
  • Windows環境でのビルド・デバッグ
  • 実機での動作確認

LovyanGFX for Windowsの環境構築

LovyanGFX for Windowsを使ってみた(https://qiita.com/pokibon/items/4f6f9b1f733ad60c708a )を参考にPC上に環境を構築します。

グラフィックスの横スクロール

以下の例では、M5Stackの画面の一部にグラフを横スクロール表示を実現しています。PC側でデバッグするために、本来ADCで電圧を取得する部分をSINカーブを表示するようにしています。
スプライト上にプロット点が画面上に収まる間は左から順にプロットし、画面の右端まで達した時には、graph.scroll(-1.0);で1ドットスクロールして、空いた右端に新しい値をプロットしています。スプライトの画像が完成後、描画エリアにpushSprite()で描画を繰り返すことにより横スクロールを実現しています。

void adc_get()
{
	char buf[128];
	static uint16_t volt_discharge = 0;
	static uint16_t volt_charge = 0;
	float  ohm_battery = 0.0;
	float  current = 0.0;

	if (etime % time_span == 0) {
		if (discharge == false) {
			//Serial.println("Start Discharge");
			//startDischarge();
			discharge = true;
			time_span = RECOVERY_TIME;
		}
		else {
			//Serial.println("Stop Discharge");
			//stopDischarge();
			discharge = false;
			time_span = DISCHARGE_TIME;
		}
	}

	//voltage = analogReadMilliVolts(ADC_PIN) * 2L;
	float rad = etime * 6 * -0.0174532925;
	voltage = sin(rad) *  1000 + 3000;
	plot_y = map(voltage - 2000, 0, 2000, GRAPH_HEIGHT - 2, 0);

	if (discharge == false) {			// charge state
		if (old_discharge == true) {
			volt_discharge = (count_discharge) ? volt_discharge_total / count_discharge : 0;
			current_discharge_total += volt_discharge / DISCHARGE_REG * (DISCHARGE_TIME / 3600.0);
			//Serial.printf("volt = %d, dischage = %7.2f\n", volt_discharge, current_discharge_total);
			volt_discharge_total = 0;
			count_discharge = 0;
		}
		ohm_battery = 0.0;
		volt_charge_total += voltage;
		count_charge++;
	}
	else {							// discharge state
		if (old_discharge == false) {
			volt_charge = volt_charge_total / count_charge;
			volt_charge_total = 0;
			count_charge = 0;
		}
		ohm_battery = abs(voltage - volt_charge) * DISCHARGE_REG / voltage;
		volt_discharge_total += voltage;
		count_discharge++;
	}
	old_discharge = discharge;
	if (plot_x >= GRAPH_WIDTH - 1) {
		graph.scroll(-1.0);
		plot_x--;
		graph.drawPixel(plot_x - 1, GRAPH_HEIGHT / 2 - 1, TFT_DARKGRAY);
		graph.drawLine(old_plot_x - 1, old_plot_y, plot_x - 1, plot_y, TFT_RED);
	}
	else {
		graph.drawLine(old_plot_x, old_plot_y, plot_x, plot_y, TFT_RED);
	}
	old_plot_x = plot_x;
	old_plot_y = plot_y;
	plot_x++;
	graph.pushSprite(&lcd, GRAPH_START_X + 1, GRAPH_START_Y + 1);

	current = voltage / DISCHARGE_REG;
	current = (discharge) ? current : 0.0;
	sprintf(buf, "%8u, %4u, %7.2f, %7.2f, %7.2f\n", etime, voltage, current, current_discharge_total, ohm_battery);
	disp_value(voltage, current, ohm_battery, current_discharge_total, etime);
	etime++;
}

まとめ

LovyanGFX for Windowsを使うことにより、組込みデバイス書き込み前にPC上で動作確認、デバッグができるようになった。
LovyanGFXのスプライトを使うことにより、グラフィックの横スクロールをちらつきなしに実現できた。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?