日々の記録

ほどよく書いてきます。

メモ S8100Bを使った温度計

2023年09月17日 00時00分53秒 | Arduino

S-8100Bというセイコーエプソンの温度計がある。出力インピーダンスが高いので出力を1MΩでプルアップせよとあるが、オープンコレクタ出力なのだろうか。1MΩでプルアップしないと直接マイコン端子に接続ではうまく温度測定できなかった。

小数点表示はおいといて、ダイナミック点灯で表示できるところまではいった。

校正してないが、28.7℃ほどの気温のようだ。あつい。

ノイズが大きいのかADCの読み取り値が大きく変動するので、平均化をガッツリしてみた。15000回ほど・・・
150回のADC変換で0.99倍しながらADCの値を加算するので、150x100=15000回平均値となる。

 

Arduinoで作ったProMicroのコードをメモがてら載せておく。
======以下コード======

//使うデジタルピンの番号を入れておく。
//DDRx, PINx, PORTxレジスタで操作したかったが、ピン足りなかった

uint8_t Channels[]={2,3,4,5,6,7,8}; //ドットは別で定義しておこう
//        /-a-/
//       f   b
//      /-g-/0
//     e   c
//    /-d-/ .
//Channels 23456789
//7segment abcdefg.
//       0 11111100
//       1 01100000
//       2 11011010
//       3 11110010
//       4 01100110
//       5 10110110
//       6 10111110
//       7 11100100
//       8 11111110
//       9 11110110


//7セグの配列を入れてある
uint8_t SegmentArray[10][7]=
    {
        {1,1,1,1,1,1,0},
        {0,1,1,0,0,0,0},
        {1,1,0,1,1,0,1},
        {1,1,1,1,0,0,1},
        {0,1,1,0,0,1,1},
        {1,0,1,1,0,1,1},
        {1,0,1,1,1,1,1},
        {1,1,1,0,0,1,0},
        {1,1,1,1,1,1,1},
        {1,1,1,1,0,1,1},
    };

// 0を表示したい場合、次のように値を入れるのがいいだろう
// for(i=0,i<8,i++){
//   digitalWrite(Channels[i],Segment[0][i]);
// }

long ADCValue;
long LN2;
long tempVal;
uint8_t A;
uint8_t B;
uint8_t C;

void ShowNone(){
  //7セグLED消灯
  for(uint8_t i=0;i<sizeof(Channels);i++){
    digitalWrite(Channels[i],0);
  }  
}
void ShowNum(uint8_t X) {
  if(X>9){
    ShowNone();
  }
  else{
    //7セグLEDに数字を表示する
    for(uint8_t i=0;i<sizeof(Channels);i++){
      digitalWrite(Channels[i],SegmentArray[X][i]);
    }  
  }
}


void setup() {
  // put your setup code here, to run once:
  // Serial port setting
  Serial.begin(9600);

  //pinMode Setting for a to g LEDs
  for(unsigned char i=0;i<sizeof(Channels);i++){
    pinMode(Channels[i],OUTPUT);
  }

  //Digit Position
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(16,OUTPUT);

  // 7セグLEDの点灯テスト
  for(unsigned char i=0;i<sizeof(Channels);i++){
    digitalWrite(Channels[i],HIGH);
    delay(100);
    Serial.println(Channels[i]);
    digitalWrite(Channels[i],LOW);
  }

  //0から9までの数字表示の確認をする
  for(uint8_t j=0;j<10;j++){
    ShowNum(j);
    delay(100);
  }
  ShowNone();
  
  ADCValue=0;
  for(int i=0;i<15000;i++){
    ADCValue += analogRead(A0);
  }
}

void loop() { 
  // put your main code here, to run repeatedly:
  //ADCで電圧を読んでくる
  // 1V-5Vを0-99%に割り付けた値をXとする(100%表示はしない)
  // Xを10で割った商Aが10の位、余りBが1の位になる。
  // Aを表示,Bを表示,ブランク表示を繰り返す。

  LN2 = map(ADCValue,3363900,5861400,800,-200);  //1-5Vを0-99に割付
  A = LN2 / 100;  //10の位
  tempVal = LN2 % 100;  //1の位
  B = tempVal /10;
  C = tempVal % 10;

  //シリアル通信で計算している中身を送信
//  Serial.print(millis());
  Serial.print("ADC Value:");
  Serial.print(ADCValue);
  Serial.print(",AR:");
  Serial.println(analogRead(A0));
//  Serial.print(",ABC:");
//  Serial.print(A);
//  Serial.print(",");
//  Serial.print(B);
//  Serial.print(",");
//  Serial.println(C);

  digitalWrite(9,HIGH);
  digitalWrite(10,HIGH);  
  digitalWrite(16,HIGH);  
  if(A>0){
    ShowNum(A); //100の位を表示
  }
  else{
    ShowNone();
  }
  digitalWrite(9,LOW);

  ADCValue=ADCValue-ADCValue/100;

  //delayの代わりにADC変換する
  for(uint8_t i=0;i<50;i++){
    ADCValue += analogRead(A0);
  }
  digitalWrite(9,HIGH);

  ShowNum(B); //10の位を表示
  digitalWrite(10,LOW);  //点灯
  
  //delayの代わりにADC変換する
  for(uint8_t i=0;i<50;i++){
    ADCValue += analogRead(A0);
  }
  digitalWrite(10,HIGH);  

  ShowNum(C);
  digitalWrite(16,LOW);
  //delayの代わりにADC変換する
  for(uint8_t i=0;i<50;i++){
    ADCValue += analogRead(A0);
  }
  digitalWrite(16,HIGH);
}

 

コメント (1)
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

メモ(7セグLEDの点灯)

2023年09月10日 15時10分43秒 | Arduino

SpartkFun ProMicroで読み取った電圧を表示するプログラムができた。
ポートの8bitのレジスタを直接いじろうかなとも思ったが、Arduinoのプログラムでは各ボードにデジタルピンなどが割り振られているのでdigitalWrite(pinNo, Bool)のほうが移植性が良いらしいとか。

作って思った、表示桁数は必要な分だけ確保するべきであった。

 

uint8_t Channels[]={2,3,4,5,6,7,8}; //デジタル出力ピンの設定。ドットは別で定義しておこう
//        /-a-/
//       f   b
//      /-g-/
//     e   c
//    /-d-/ .
//Channels 23456789
//7segment abcdefg.
//7セグの配列を入れてある
uint8_t SegmentArray[10][7]=
    {
        {1,1,1,1,1,1,0},
        {0,1,1,0,0,0,0},
        {1,1,0,1,1,0,1},
        {1,1,1,1,0,0,1},
        {0,1,1,0,0,1,1},
        {1,0,1,1,0,1,1},
        {1,0,1,1,1,1,1},
        {1,1,1,0,0,1,0},
        {1,1,1,1,1,1,1},
        {1,1,1,1,0,1,1},
    };

int ADCValue;
int LN2;
uint8_t A;
uint8_t B;

void ShowNum(uint8_t X) {
  //7セグLEDに数字を表示する
  for(uint8_t i=0;i<sizeof(Channels);i++){
    digitalWrite(Channels[i],SegmentArray[X][i]);
  }  
}
void ShowNone(){
  //7セグLED消灯
  for(uint8_t i=0;i<sizeof(Channels);i++){
    digitalWrite(Channels[i],0);
  }  
}

void setup() {
  // put your setup code here, to run once:
  // Serial port setting
  Serial.begin(9600);
//  delay(3000);
  Serial.println("Hello World!");

  //pinMode Setting for a to g LEDs
  for(unsigned char i=0;i<sizeof(Channels);i++){
    pinMode(Channels[i],OUTPUT);
  }

  //Dot Position
  pinMode(9,OUTPUT);

  // 7セグLEDの点灯テスト
  for(unsigned char i=0;i<sizeof(Channels);i++){
    digitalWrite(Channels[i],HIGH);
    delay(100);
    Serial.println(Channels[i]);
    digitalWrite(Channels[i],LOW);
  }

  //0から9までの数字表示の確認をする
  for(uint8_t j=0;j<10;j++){
    ShowNum(j);
    delay(100);
  }
  ShowNone();
  delay(1000);
}

void loop() { 
  // put your main code here, to run repeatedly:
  //ADCで電圧を読んでくる
  // 1V-5Vを0-99%に割り付けた値をXとする(100%表示はしない)
  // Xを10で割った商Aが10の位、余りBが1の位になる。
  // Aを表示,Bを表示,ブランク表示を繰り返す。

  ADCValue = analogRead(A0);          //電圧読み取り
  LN2 = map(ADCValue,205,1023,0,99);  //1-5Vを0-99に割付
  A = LN2 / 10;  //10の位
  B = LN2 % 10;  //1の位

  //debug zone
  Serial.print(millis());
  Serial.print(",ADC Value:");
  Serial.print(ADCValue);
  Serial.print(",LN2 Level:");
  Serial.print(LN2);
  Serial.print(",AandB:");
  Serial.print(A);
  Serial.print(",");
  Serial.println(B);

  ShowNum(A);
  delay(600);
  ShowNone();
  delay(50);
  ShowNum(B);
  delay(400);
  ShowNone();
  delay(300);
}

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

USB HIDデバイス、マウス編

2023年08月27日 19時31分06秒 | Arduino

後輩が出張ででかけた先のPCは操作をしないと勝手にスリープに入る設定で、連続数時間とかの解析計算をしようとPCがスリープになってしまうらしい。この設定は組織の設定でユーザーからは変更できない。

マウス操作があればスリープに入らないので、USBマウスを模して操作をしてあげればスリープは回避できるだろうと。

じゃ、作ってみるかと作ってみた。マウスを5ピクセルの正方形をひたすら移動させ続けるだけという簡単なもの。
マイコンはRP2040Zeroというもので、Aliexpressで540円ほどで購入したもの。

 

#include <Mouse.h>
int responseDelay = 500; 
int movingStep = 5;

void setup() {
  Mouse.begin(); //Mouse mode start
}
void loop() {
  Mouse.move(movingStep,0,0);
  delay(responseDelay);
  Mouse.move(0,movingStep,0);
  delay(responseDelay);
  Mouse.move(-movingStep,0,0);
  delay(responseDelay);
  Mouse.move(0,-movingStep,0);
  delay(responseDelay);  
}

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする