Spanningsbron met "Erg" hoge resolutie

benleentje

Golden Member

Kijk hier word ik ook blij van en kan je toch weer een hoop van elkaar leren.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.

Ja, graag gedaan.

Voor de gene die nu weer gaan zeggen, programeer het dan maar in b.v. "C", doe dat maar niet, dit gaat niet gebeuren :-)

Hier moet ik je toch teleurstellen ;). De arduino ide is niet meer dan een dun laagje bovenop de standaard C/C++ compiler voor de atmel avr. Dezelfde compiler die ook in Atmel studio gebruikt wordt. Dus deze code is gewoon C/C++.

Maar de arduino heeft wel een eigen set library funkties toegevoegd. En alle standaard C funkties zijn nog gewoon beschikbaar, ook al worden ze niet genoemd in de arduino documentatie. Ziehier een linkje naar de documentatie : http://www.atmel.com/webdoc/avrlibcreferencemanual/ch20.html dtostrf() zit in stdlib.h

benleentje

Golden Member

Ik vind de documentatie op de arduino site toch al erg vaag en onvolledig. Als ik dan in de library ga kijken dan zie ik vaak meer functie's dan benoemd word.

Maar goed dat er dan mensen zijn om ons verder te helpen, dat help :)
Aan de andere kant als je alle voorgeschoteld krijgt dan leer je het nooit.

[Bericht gewijzigd door benleentje op donderdag 28 december 2017 23:00:28 (14%)

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
blackdog

Golden Member

Hi deKees, :-)

Wat ik wou aangeven, is dat "men" regelmatig hier op CO, met oplossingen, aankomt die ver buiten een simpele/goede oplossing ligt.
Neem het gene wat je zelf hebt aangegeven betreffende de fontmode en het omzetten naar dit: char ADC_Buffer[10];,
dat is een simpel effective manier als oplossing, helemaal goed in mijn ogen.
Natuurlijk ben ik mij bewust dat de Arduino IDE een schil om C is en daardoor ook zijn beperkingen heeft.
Maar ik ben mij ook bewust ervan dat zonder die Arduino IDE ik nooit in korte tijd zo ver zou zijn gekomen.
Dit natuurlijk ook met de goede hulp van CO gebruikers :-)

Dat de Arduino IDE gebasseerd is op C weet ik natuurlijk, beter was geweest dat ik het woord "machinecode" had gebruikt in die opmerking.
Een beetje bewijs dat ik het al wist ;-)
http://www.bramcam.nl/NA/LowCostCal/LowCostCal-82.png

Op de foto is ook te zien dat ik alle text nu aan het aanpassen ben, de fonts zijn nog een beetje rommelig omdat nog niet overal de fontmode bij staat.
1x het fontmode commande "ucg.setFontMode(UCG_FONT_MODE_SOLID);" in de setup werkt niet, dan krijg ik een wit scherm.

Dus nu ben ik de code aan het aanpassen zodat ik dit iedere keer aanbreng bij het schrijven van text of cijgers naar het scherm.
Morgen meer!

Groet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Ja, ik weet het. Er wordt wel gemopperd op de arduino omdat het niet efficient is, en traag en beperkt. En dat klopt ook wel, maar juist daardoor kun je ineens programmeren zonder dat je in de databoeken hoeft te duiken en daardoor komt de techniek ineens voor veel meer mensen binnen bereik. Dus ik heb alle respect voor de arduino mensen.

Als je arduinos op elke middelbare school ineens opduiken, en als ze zelfs by intertoys in de winkel liggen dan hebben ze toch wel iets goed gedaan denk ik.

benleentje

Golden Member

OF het traag en niet efficient is weet ik niet, want dat zou je ook de onderliggende ASM code moeten bekijken nadat het is aangemaakt. In het begin leken me de instuctie's die standaard op de website staan me wel erg beperkt. Dat lijkt dus maar zo omdat je nog heel wat extra functie hebt van onderliggende C code.
En in principe kan je zelfs gewoon de ASM code gebruiken. Echter is dat af te raden omdat je dan gelijk vast zit aan 1 specifieke CPU of board.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.

Neem bijvoorbeeld digitalwrite() uit de arduino libraries. Niet precies de snelste methode om een pin aan te sturen, maar wel makkelijk om te gebruiken:

code:


void digitalWrite(uint8_t pin, uint8_t val)
{
	uint8_t timer = digitalPinToTimer(pin);
	uint8_t bit = digitalPinToBitMask(pin);
	uint8_t port = digitalPinToPort(pin);
	volatile uint8_t *out;

	if (port == NOT_A_PIN) return;

	// If the pin that support PWM output, we need to turn it off
	// before doing a digital write.
	if (timer != NOT_ON_TIMER) turnOffPWM(timer);

	out = portOutputRegister(port);

	uint8_t oldSREG = SREG;
	cli();

	if (val == LOW) {
		*out &= ~bit;
	} else {
		*out |= bit;
	}

	SREG = oldSREG;
}

flash2b

Special Member

Kleine UI bug: Het gele kader is links 1 pixel en boven en onder 3 pixels en rechts 2 pixels.

Links en Rechts waren in een eerdere versie wel gelijk (2 pixels).

Ik zou ze allemaal 2 pixels maken, maar dat is een suggestie. Het kan ook zijn dat je de string 1 pixel te vroeg print.

[Bericht gewijzigd door flash2b op vrijdag 29 december 2017 18:45:35 (11%)

blackdog

Golden Member

Hi flash2b,

Ik neem even aan dat je het tegen mij hebt... :-)
Er wordt door mij nog flink gesleuteld aan de interface.

Na de aanpassingen die deKees voorstelde, zijn ook de fonts veranderd voor sommige teksten.
Dat houd dan weer in, dat ik worstel met de ruimte binnen de kaders, dat is dus allemaal de schuld van deKees *grin*

Deze avond ga ik de indeling weer proberen mooi te maken en zal hiervan een plaatje laten zien als ik zover ben.
Waarschijnlijk wordt het iets minder symetrisch, dus de ADC waarde in het midden zakt denk ik een beetje met zijn kader,
zodat het geheel er nog wat beter uit gaat zien, doordat de objecten dan niet bijna tegen elkaar komen.
Als je omschakeld van zeg een rode tekst naar een witte tekst, heb je altijd een beetje verschil.
Dit ga je dus steeds beter zien als het object steeds dichter bij de pixel grote komt.

Het stukje waar "NoiseAmp" staat krijgt waarschijnluit nog een extra functie, maar eerst de rest van de objecten zo goed mogelijk plaatsen.
Dit goed zetten va nde opjecten kost echt veel tijd, de nieuwste code in de Uno proppen is echt laagzaam, en dat doe ik toch echt met een heel krachtige computer...

De poortinstelling voor COMM7 waar de Arduino aan hang staat al op 115200 als snelheid.
Het blijft een bagger product dat draait op JAVA ;-)
Als iemend weet hoe ik het uploaden in de Arduino snel kan krijgen, dan hoor ik dit graag.

Ik ga nu lekker schuiven met objecten...

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
benleentje

Golden Member

en dat doe ik toch echt met een heel krachtige computer...
staat al op 115200 als snelheid. Als iemend weet hoe ik het uploaden in de Arduino snel kan krijgen,

Met krachtstroom :).
Toch vind ik de arduino uno borden best wel erg snel met uploaden. Ik heb nog een tijdje met de DUE gespeeld, wat een 78Mhz Arm versie van de mega en die is pas traag echt ontzettend traag met uploaden. Ik ben er na 5 a 6 keer uploaden mee gestopt en ben maar een externe DAC gaan gebruiken op de Uno.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
blackdog

Golden Member

Hi!

Niet te geloven hoeveel tijd ik al in het display heb gestopt...
Er zitten wat bug in de library en in mijn Brein *grin*

Voor beide heb ik een oplossing gevonden en ik heb nu een weergave waar ik mee kan leven en de fonts laten geen abberaties meer achter.
Dit kreeg ik alleen voor elkaar door flink door de handleiding te gaan en met experimenteren.
Er zijn nu nog maar 2 font typen in gebruik, de fonts vreten ruimte in de Arduino.
Ik heb omdat ik tegen dat probleem aanliep, ook nog een keer met andere controlers gespeeld, weer meer problemen...

Door consequent het zelfde type font aan te houden blijf ik binen de geheugenruimte van de microcontroler en heb nog een beetje over voor nog wat extra code die er nog in moet.
Ook ben ik bezig geweest met mij een beetje in te lezen wat opmaak betreft,
meestal wordt aangehouden dat je niet meer dan 3 type font moet gebruiken om het geheel rustig te houden.
Met mijn twee type zit ik dus goed.

Er zijn nog kleine positie aanpassingen nodig, meer onderstaand plaatje geeft in ieder geval een goede indruk hoe het nu is.
De waarde van de ADS1115 hier in beeld kan eigenlijk niet, dit omdat "OFF!" in beeld staat, maar dat heb ik zo ingesteld om te laten zien
dat de witte tekst op de rode achtergrond lekker zichtbaar is.
Jullie kunnen hier zien dat de ADS1115 bijna aan zijn volle schaal zit, dat is 1 bit minder dan 2,048V.
De resolutie zo ik nog met 1 cijfer kunnen uitbreiden maar deze waarde is 65uV en dat leest niet lekker af.
Deze resolutie heeft in het geheel niets te maken met de resolutie die ik haal met de twee tien slagen potmeters in dit instrument.
De ADS1115 weergave is een hulpmiddel, niet vergeten, dit meetinstrument is bedoeld om met een 6,5 digit DMM te gebruiken,
als je de maximale resolutie van dit meetinstrument zou willen uitlezen.
http://www.bramcam.nl/NA/LowCostCal/LowCostCal-83.png

Dan nog even de code van deze avond, zeer zeker niet opgeschoond!
Er kunnen nog diverse regels uitgekecheld worden en de opmerkingen moeten nog worden aangepast zodat de goede tekst er weer bij komt.
Het is deze avond erg veel gebruik gemaakt van CTRL+c, CTRL+v en CTRL+x. en dat resulteerde regelmatig in verkeerde beschrijvingen van de code regel.
Het opruimen komt morgen aan de beurt dit samen met mijn poging om singel conversie te gaan doen voor de ADS1115.
Dus aleen een conversie als er zeg 0,3 seconde voorbij is.
Ook de Tempsensor wil ik pa sampelen als de ADS1115 op dat moment niet data aan het ophoesten is.
Dit moet het uitlezen van de toetsen dan wat sneller maken.
Misschien moet ik de enable toets maar aan een interupt ingang hangen zoals pin-2 van de Arduino.
Maar dat is allemaal voor morgen!

De code

c code:


// NoiseAmp Amsterdam
// High Resolution voltage source
// Thanks to: deKees, Olikraus, Arduino, Michael Adams (Buttons), Simon Monk (Timer.h)
// This software controls Bi-Polaire Relay's, Read Buttons and display information on a 128*128 LCD Display
// 
// The LM75 library is used toe readout a SE95 NXP temperature sensor.
// This sensor wil give a impression of the temperature of the potmeters and reference section who are in a appart shielded box
//
//
//
// The part of the software i wrote, is free for personal use :-)


#include <TimeLib.h>
#include <Wire.h>
#include <Button.h>
#include "Timer.h"
#include "Ucglib.h"
#include <LM75.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads;     // Use this for the 16-bit version 
float Voltage = 0;


// initialize an LM75 object
LM75 sensor;


// initialize Display driver object
Ucglib_ST7735_18x128x160_HWSPI ucg(/*cd=*/ 9, /*cs=*/ 10, /*reset=*/ 8);


// Setup variable for temperature measurement
unsigned long currentTime;
unsigned long loopTime;

// Setup Range RangeState used for the Display
byte rangeState = 1;                                // RangeState 1 = 20mV Range, 2 = 2V Range, 3 = 20V Range, used for error detection and Display, Power On Preset = 1 (20mV range)


// Setup variable for timing relais driver puls
byte resetPuls = 5;                                 // Time in mSec for Reset Puls
byte wait_2 = 2;                                    // Get Stable, Delay
byte on_Puls_5 = 5;                                 // Relais timing 5mSec ("On" time for "Set" coil of the relais )


// Setup variable for toggle Relaiy Setup (Output On/Off)
byte enable = 0;                                    // 0 = Output Off, 1 = Output On, Power On Preset = 0
byte Enable_In = A0;                                // Toggle Button Pin Setup
byte Enable_Out = 12;                               // Relais driver output setup, used for indicator light
byte ToggleState = HIGH;                            // Preset Enable Output Set To "Off"
byte reading;                                       // The current reading from the input pin
int previous = LOW;                                 // The previous reading from the input pin
long time = 0;                                      // The last time the output pin was toggled
long debounce = 200;                                // The debounce time, increase if the output flickers


// initialize timer library
Timer t;


// Define Range Buttons connected tot a Arduino Nano
Button button2(A1);                                 // 20mV range
Button button3(A2);                                 // 2V range
Button button4(A3);                                 // 20V range




void setup() {

  Wire.begin();

//Setup Arduino relais outputs
  pinMode(2, OUTPUT);                                // ResetPuls Relay Driver
  pinMode(3, OUTPUT);                                // RE-2 Driver (20/2V)
  pinMode(4, OUTPUT);                                // RE-3 Driver
  pinMode(5, OUTPUT);                                // RE-4 Driver
  pinMode(6, OUTPUT);                                // RE-1 Set driver
  pinMode(7, OUTPUT);                                // RE-1 Reset driver
  pinMode(12, OUTPUT);                               // Output Driver for LED Enable Button )

// Output Enable function setup
  pinMode(A0, INPUT);                                // Set pin-A0 as a input for the enable button

//Setup Arduino range button inputs
  button2.begin();                                   // 20V Range
  button3.begin();                                   // 2V Range
  button4.begin();                                   // 20mV Range


// Timing setup for Temperature measurement samples
  currentTime = millis();
  loopTime = currentTime;


// Setup Display
  ucg.begin(UCG_FONT_MODE_TRANSPARENT);
  ucg.clearScreen();

  
// Place static objects on Display
  ucg.setRotate90(); 
  ucg.setColor(255, 255, 255);
  ucg.drawFrame(0, 0, 128, 128);
  ucg.drawLine(0, 23, 128, 23);
  ucg.setColor(0, 255, 255);
  ucg.drawBox(0, 46, 128, 32);                      // Draw Yellow box
  ucg.setColor(0, 0, 0, 0);
  ucg.drawRBox(4, 49, 120, 26, 4);                  // Draw black box 
  ucg.setColor(255, 255, 255);
  ucg.drawLine(0, 102, 128, 102);


// Set static text on display for temperature
  ucg.setFont(ucg_font_9x15B_mr);                   // Set font type 
  ucg.setColor(0, 255, 255, 255);                   // Switch color to white
  ucg.setPrintPos(4,16);                            // Set position for "Output:" text
  ucg.print("Temp =");                              // Place "Temp:      C" on display


  // Set static text on display for te range
  ucg.setFont(ucg_font_9x15B_mr);                   // Range text for display
  ucg.setColor(0, 255, 255, 255);                   // Switch color to green
  ucg.setPrintPos(4,39);                            // Set position for "Range:" text
  ucg.print("Range =");                             // Place "Range:" on display


// Set static text on display for te output status
  ucg.setFont(ucg_font_9x15B_mr);                   // Set font type
  ucg.setColor(0, 255, 255, 255);                   // Switch color to white
  ucg.setPrintPos(4,95);                            // Set position for "Output:" text
  ucg.print("Output");                              // Place "Output:" on display
  ucg.setPrintPos(62,95);                           // Set position for "=" text
  ucg.print("=");                                   // Place "=" on display


// Set static text on display Produc Name
  ucg.setFont(ucg_font_10x20_mr);                   // Set font type
  ucg.setColor(0, 255, 255, 0);                     // Switch color to ...
  ucg.setPrintPos(25,121);                          // Set position for "NoiseAmp" text
  ucg.print("NoiseAmp");                            // Place "NoiseAmp" on display


// Power On Preset relay
  digitalWrite(5, HIGH);                            // Start reset puls
  delay(resetPuls);                                 // "resetPulse" defines the time how long the relay "reset coil" gets drive current (here 5 mSec)
  digitalWrite(5, LOW);                             // Stop reset puls  


  // Place default range on screen
  ucg.setColor(0, 255, 0, 0);                        // Change color to blue
  ucg.setPrintPos(50,17);                            // Position for drawing black box to erase last value
  ucg.drawRBox(78, 25, 46, 18, 4);                   // Draw blue box
  ucg.setFont(ucg_font_9x15B_mr);                    // Font type
  ucg.setColor(255, 255, 255);                       // Font color
  ucg.setPrintPos(83,40);                            // Font position
  ucg.print("20mV");                                 // V announcer


  // Place mV announcer voor ADC value on screen afther boot
  ucg.setColor(0, 0, 255, 0);                         // Font color
  ucg.setColor(1, 0, 0, 0);                           // Background color, black
  ucg.setFontMode(UCG_FONT_MODE_SOLID);               // Set Fontmode to Solid
  ucg.setFont(ucg_font_profont22_mr);                 // Font type
  ucg.setPrintPos(94,69);                             // Font position
  ucg.print("mV");                                    // mV announcer


// Setup ADC
  ads.setGain(GAIN_TWO);                              // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  ads.begin();
  ads.setSPS(ADS1115_DR_8SPS);                        // for ADS1115 fastest samples per second is 860 (default is 128)
}




void loop() {

// Start to measure temperature
  currentTime = millis();
  if(currentTime >= (loopTime + 5000)){               // Every 5 second sample temperature
  sensor.shutdown(false);                             // Switch on SE95 temp sensor
  char celcius[10];
  dtostrf(sensor.temp(), 6, 2, celcius);
  ucg.setFontMode(UCG_FONT_MODE_SOLID);
  ucg.setFont(ucg_font_9x15B_mr);
  ucg.setColor(0, 255, 255, 255);                     // Font color
  ucg.setColor(1, 0, 0, 0);                           // Background color, black
  ucg.setPrintPos(115,17);                            // Set position "wipe out" text
  ucg.print("C");
  ucg.setPrintPos(57,17);
  ucg.print(celcius);
  sensor.shutdown(true);                              // Switch off SE95 sensor
  loopTime = currentTime;                             // Update loopTime
  }
  else
  ucg.setFontMode(UCG_FONT_MODE_SOLID);
// End measure temperature


// Start reading toggle Enable/Disable button code 
    reading = digitalRead(A0);                       // Read if button is pushed
    if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (ToggleState == HIGH)
    ToggleState = LOW;
    else
    ToggleState = HIGH;
    time = millis();    

    // Toggle RE-1 comparator start
    if(ToggleState==1) {
    digitalWrite(6, HIGH);                           // Makes output-6 High
    delay(on_Puls_5);                                // Time for "On" puls (5 mSec)
    digitalWrite(6, LOW);                            // Makes output-6 low


  // Update display with "ON!" text
  ucg.setColor(0, 255, 0, 0);                        // Change color to blue
  ucg.drawRBox(78, 81, 46, 18, 4);                   // Draw blue box
  ucg.setFontMode(UCG_FONT_MODE_SOLID);              // Set fontmode to solid
  ucg.setFont(ucg_font_9x15B_mr);                    // Font type
  ucg.setColor(0, 255, 255, 255);                    // Font color
  ucg.setColor(1, 255, 0, 0);                        // Set font background color
  ucg.setPrintPos(89,96);                            // Font position
  ucg.print("ON!");                                  // V announcer


  } else if(ToggleState==0) {
  digitalWrite(12, HIGH);                            // Makes output 12 High
  delay(on_Puls_5);                                  // Time for "On" puls (5 mSec)
  digitalWrite(12, LOW);                             // Makes output 12 low


  // Update display with "OFF!" text
  ucg.setColor(0, 0, 0, 255);                        // Change color to blue
  ucg.drawRBox(78, 82, 46, 17, 4);                   // Draw blue box
  ucg.setFontMode(UCG_FONT_MODE_SOLID);              // Set Fontmode to Solid
  ucg.setFont(ucg_font_9x15B_mr);                    // Font type
  ucg.setColor(0, 255, 255, 255);                    // Font color
  ucg.setColor(1, 0, 0, 255);                        // Set font background
  ucg.setPrintPos(85,95);                            // Font position
  ucg.print("OFF!");                                 // V announcer
  } 
  }
  digitalWrite(12, ToggleState);
  previous = reading;
// End toggle Enable/Disable button code



// Start reading 20V range button code
  if (button4.pressed()) {
  // Set announcer to V 
  ucg.setFont(ucg_font_profont22_mr);                // Font type
  ucg.setColor(0, 0, 255, 0);                        // Font color
  ucg.setColor(1, 0, 0, 0);                          // Font background
  ucg.setPrintPos(94,69);                            // Font position
  ucg.print(" V");                                   // V announcer


  // Set announcer 20V
  ucg.setColor(0, 255, 0, 0);                        // Change color to blue
  ucg.drawRBox(78, 25, 46, 17, 4);                   // Draw blue box
  ucg.setFontMode(UCG_FONT_MODE_SOLID);              // Set fontmode toe Solid
  ucg.setFont(ucg_font_9x15B_mr);                    // Font type
  ucg.setColor(0, 255, 255, 255);                    // Font color
  ucg.setColor(1, 255, 0, 0);
  ucg.setPrintPos(88,40);                            // Font position
  ucg.print("20V");                                  // 20V range announcer

 
  // Reset Relais-2, Relais-3, Relais-4
  digitalWrite(5, HIGH);                             // Start reset puls
  delay(resetPuls);                                  // reset Pulse defines the time how long the relay "reset coil" gets current
  digitalWrite(5, LOW);                              // Start reset puls
  delay(wait_2);                                     // Wait a short wile


  // Start On puls Relais-2, 3, 4
  digitalWrite(2, HIGH);                             // Start setpuls 
  digitalWrite(3, HIGH);                             // Start setpuls
  digitalWrite(4, HIGH);                             // Start setpuls
  delay(on_Puls_5);                                  // 5mSec Setpuls Relais-2, 3, 4

  
  // Stop On Puls Relais-2, 3, 4
  digitalWrite(2, LOW);                              // End set puls
  digitalWrite(3, LOW);                              // End set puls
  digitalWrite(4, LOW);                              // End set puls
  rangeState = 3;                                    // Set range state for Display
  }
// End reading 20V range button code


// Start reading 2V range button code
  if (button3.pressed()) {
  
  // set announcer to V 
  ucg.setFontMode(UCG_FONT_MODE_SOLID);              // Set Fontmode to Solid
  ucg.setFont(ucg_font_profont22_mr);                // Font type
  ucg.setColor(0, 0, 255, 0);                        // Font color
  ucg.setColor(1, 0, 0, 0);                          // Font background
  ucg.setPrintPos(94,69);                            // Font position
  ucg.print(" V");                                   // V announcer

  ucg.setColor(0, 255, 0, 0);                        // Change color to blue
  ucg.drawRBox(78, 25, 46, 17, 4);                   // Draw blue box
  ucg.setFontMode(UCG_FONT_MODE_SOLID);              // Set Fontmode to Solid
  ucg.setFont(ucg_font_9x15B_mr);                    // Font type
  ucg.setColor(0, 255, 255, 255);                    // Font color
  ucg.setColor(1, 255, 0, 0);                        // Fond background
  ucg.setPrintPos(92,40);                            // Font position
  ucg.print("2V");                                   // 2V range announcer

 
  // Reset Puls Relais-2, Relais-3, Relais-4
  digitalWrite(5, HIGH);                             // Start reset puls
  delay(resetPuls);                                  // reset Pulse defines the time how long the relay "reset coil" gets current
  digitalWrite(5, LOW);                              // End reset puls
  delay(wait_2);                                     // Wait a short wile
  // Set Puls Relais-3, Relais-4
  digitalWrite(3, HIGH);                             // Start set puls
  digitalWrite(4, HIGH);                             // Start set puls
  delay(on_Puls_5);                                  // 5mSec timing for Setpuls Relais-3, Relais-4
  digitalWrite(3, LOW);                              // End set puls  
  digitalWrite(4, LOW);                              // End set puls
  rangeState = 2;                                    // Set range state for Display
  }
// End reading 2V range button code


// Start reading 20mV range button code
  if (button2.pressed()) {
  // Set announcer to mV 
  ucg.setColor(0, 255, 0);                           // Set color to white
  ucg.setFont(ucg_font_profont22_mr);                // Font type
  ucg.setPrintPos(94,69);                            // Font position
  ucg.print("mV");                                   // mV announcer

  ucg.setColor(0, 255, 0, 0);                        // Change color to blue
  ucg.drawRBox(78, 25, 46, 17, 4);                   // Draw blue box
  ucg.setFontMode(UCG_FONT_MODE_SOLID);
  ucg.setFont(ucg_font_9x15B_mr);                    // Font type
  ucg.setColor(0, 255, 255, 255);                    // Font color
  ucg.setColor(1, 255, 0, 0);                        // Fond background 
  ucg.setPrintPos(83,40);                            // Font position
  ucg.print("20mV");                                 // 20mV announcer

  
  // Reset Puls Relais-2, Relais-3, Relais-4
  digitalWrite(5, HIGH);                             // Start reset puls
  delay(resetPuls);                                  // reset Pulse defines the time how long the relay "reset coil" gets current
  digitalWrite(5, LOW);                              // End set puls 
  rangeState = 1;                                    // Set range state for Display 
 }
// End reading 20mV range button code


// ADC measure input and place value on displag
  ucg.setFontMode(UCG_FONT_MODE_SOLID);
  ucg.setFont(ucg_font_profont22_mr);                 // Font type
  ucg.setColor(0, 0, 255, 0);                         // Font color
  ucg.setColor(1, 0, 0, 0);                           // Background color, black
  ucg.setPrintPos(13,69);                             // Font position
  char ADC_Buffer[10];
  dtostrf(1.0F * ads.readADC_SingleEnded_V(0), 6, 4, ADC_Buffer);
  ucg.print(ADC_Buffer);
  ucg.setFontMode(UCG_FONT_MODE_TRANSPARENT);
 }

Opmerkingen?
Graag!

Groet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Ik zie hier wel meer dan 2 fonts:
- ucg_font_9x15B_mr
- ucg_font_10x20_mr
- ucg_font_profont22_mr
Dat zijn lange tabellen en dat heeft veel geheugen nodig.

blackdog

Golden Member

Goede morgen!

deKees ga ik aanspreken met "Haviksoog", dat heb je goed gezien! :-)
Er is nog een extra font aanwezig voor "NoisAmp" en op die positie van de tekst,
wil ik een simpele indicatie maken van de geleverde uigangsstroom.
De tekst zal dan weer met de zelfde font worden uitgerust als bijna alle tekst en dat is de 9x15B_mr.

Als ik de code snel genoeg reagerend krijg, en hierdoor een Arduino Nano kan gaan gebruiken.
Dan heb ik nog twee analoge ingangen over waar ik dan wat mee kan zoals een simpele comperator functie aangestuurd door de stroom LED in het schema.
Deze LED kan dan als object op het front weg blijven, en als optocoupler een Arduino pin aansturen.

Er zijn nog wat opties waar ik aan denk zoals deze, de lampdriver voor mijn enable switch te vergeten en dan die uitgang te gebruiken om een zoemer aan te sturen bij overbelasting.
Dat is denk ik dan handig, als je niet naar het instrument kijkt.

Loop snelheid (response snelheid toetsen)
Als eerste ga ik kijken hoelang de i2c bus nu eigenlijk bezig is.
Ook ga ik kijken of het zinnig is de i2c bus clock frequentie hoger te maken, of daar dan snelheids winst in zit.
De temperatuur meting kan als het geheel ingebouwd is, waarschijnlijk naar 1 x per 30 seconde, die is dus niet het probleem van de loop snelheid.

Zoals de code nu is rammelt de ADS1115 constant en de processor heeft het daar druk mee.
En ik ga dus kijken of ik getimed single shot kan gaan toepassen voor de ADC conversie.

Dat wordt weer een aardig deel van de dag tegen zaken aanlopen, waar ik nog geen kaas van heb gegeten... :-)

Groet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
Sine

Moderator

Het "NoisAmp" staat natuurlijk wel leuk op het display .. maar eigenlijk gooi je daarmee een stuk van je scherm oppervak weg, en niemand ziet het als het ding uit staat ;)

blackdog

Golden Member

Hi Sine,

Dat klopt als een zwerende vinger! ;-)

Daarom gaf ik al aan dat op die plek iets anders functioneel komt.
Op het ogenblik heb ik de reactie snelheid al beter gekregen.

Als 1e heb ik de i2c snelheid omhoog gebracht naar 800KHz.
Ik heb testsoftware gedraaid van Rob Tillaart om te zien wat door mijn i2c modules geaccepteerd wordt.

Als 2e heb ik de sample frequentie omhoog gebracht van 8 naar 32 per seconde, de display waarde blijft dan nog steeds stabiel.

Als 3e heb ik wat timing aangepast in de library's betreffende de debounce.

De knoppen reageren nu redelijk goed en als laatste stap ben ik nu met het uitlezen van de ADC waarde bezig (timing)
Het werkt nu goed genoeg als ik 2x per seconde meet.

Laters meer.

Groet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Zoals de code nu is rammelt de ADS1115 constant en de processor heeft het daar druk mee.

Lijkt me niet, daarvoor zou je namelijk de ALERT/READY pin van je ADS1115 moeten aansluiten op je Nano. De ADC gebruikt de I2C bus niet in "Continuous conversion mode".
Kortom als jij twee keer per seconde de ADC waarde ophaalt kun je de bus rustig op de standaard 100Khz laten staan.

De font files zou je kunnen "snoeien" door er alleen de symbolen in te laten staan die je echt gebruikt.

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
Arco

Special Member

Op 28 december 2017 23:29:30 schreef deKees:
Ja, ik weet het. Er wordt wel gemopperd op de arduino omdat het niet efficient is, en traag en beperkt.
En dat klopt ook wel, maar juist daardoor kun je ineens programmeren zonder dat je in de databoeken hoeft te duiken
en daardoor komt de techniek ineens voor veel meer mensen binnen bereik.

Lezen van de datasheets blijft toch nodig om goed te kunnen programmeren. (dat voorkomt juist dat je programma traag en niet efficient wordt... :) )
Je moet in ieder geval weten hoe de processor in mekaar steekt. Dat je bijv. bij 8 bits processor het beste ook 8 bits variabelen kunt gebruiken.
Gebruik van 16 of 32 bits variabelen kan dan wel, maar geeft veel overhead die vaak niet nodig is...

De ADC gebruikt de I2C bus niet in "Continuous conversion mode".

De ADC 'gebruikt' de i2c bus helemaal nooit... ;) ('t is een slave)
De master leest uit en bepaalt wanneer de bus gebruikt wordt...

[Bericht gewijzigd door Arco op zondag 31 december 2017 14:56:23 (12%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
blackdog

Golden Member

Hi,

Ik ben even wezen kijken wat ik kan doen i.v.m. de opmerking van Roeland i.v.m. de grote van de fonts.
Van het onderstaande type heb ik alleen de cijgers nodig, de "." en de karakters "m" en "V".

Als ik in de "ucg_pixel_font_data.c" file kijk zie ik daar de font staan die gebruit wordt voor de uitgangs spanning.
Hieronder het eerste stukje van deze file.
Dat bevat een lijst met pixels van het desbetreffende karakter.
Nu heb ik gezocht naar een converter hiervoor, de zoekactie leverde weinig zinnigs op.
Deze fonts zijn gemaakt volgens Oliekraus met het programma: Fontographer 4.1.5 but... "Computer Say's NO!" grin.
De website, link enz. komt niet door de beveiligingen hier heen.

Weet een van jullie een manier zodat de font leesbaar worden zonder dat ik met de hand de hele lijst af ga?

c code:


const ucg_fntpgm_uint8_t ucg_font_profont22_mr[2288] UCG_FONT_SECTION("ucg_font_profont22_mr") = {
  96,2,4,3,4,5,1,3,5,12,22,0,252,14,252,16,
  254,2,212,6,29,32,9,108,131,63,254,255,37,0,33,14,
  108,131,63,118,162,250,247,136,68,229,177,4,34,21,108,131,
  63,172,136,152,136,152,136,152,136,152,136,152,136,60,254,119,
  0,35,29,108,131,63,86,34,98,34,66,7,35,7,67,34,
  98,34,66,7,35,7,67,34,98,34,242,248,20,0,36,33,
  108,131,63,180,168,160,213,65,204,132,196,136,158,77,200,157,
  221,73,140,137,232,100,66,98,230,32,202,80,84,30,1,37,
  31,108,131,63,86,7,49,7,34,122,49,34,82,35,66,117,
  118,69,34,83,34,50,33,162,55,52,66,242,216,1,38,30,
  108,131,63,86,101,71,51,66,50,67,34,83,118,132,116,38,
  74,76,100,104,70,136,14,132,72,228,177,2,39,11,108,131,
  63,180,168,222,227,127,9,40,16,108,131,63,2,201,193,45,
  69,245,211,157,202,67,3,41,15,108,131,63,172,232,78,245,
  151,131,91,202,35,1,42,22,108,131,63,118,162,98,34,74,
  14,134,204,140,14,70,52,19,149,199,199,0,43,17,108,131,
  63,94,136,106,118,48,114,48,38,170,61,222,0,44,16,108,
  131,63,254,83,73,66,202,81,201,193,165,129,0,45,11,108,
  131,63,254,196,204,30,127,4,46,13,108,131,63,254,83,73,
  66,74,121,156,1,47,27,108,131,63,26,81,73,81,73,81,
  73,81,73,81,73,81,73,81,73,81,73,81,73,81,81,0,
  48,36,108,131,63,86,86,7,49,67,35,82,35,66,36,50,
  37,34,19,34,18,35,34,53,34,68,34,83,34,67,51,7,
  81,246,216,1,49,17,108,131,63,118,162,114,77,245,103,7,

De voorlopige conclusie is dat de looptijd afhankelijk is van het uitlezen van de buttons, de verwerking en de data naar het screen te pushen.
Maar het fijne ervan, daar ben ik nog niet achter.
Straks even met de vier kanaals scoop aan verschillende delen meten.
Mijn Rigol scoop heeft nu 24MB opslagruimte, moet ik mee uit de voeten kunnen denk ik zo :-)

De code is weer een beetje opgeschoon en de loop timing staat er nog in.

c code:


// NoiseAmp Amsterdam
// High Resolution voltage source
// Thanks to: deKees, Olikraus, Arduino, Michael Adams (Buttons), Simon Monk (Timer.h)
// This software controls Bi-Polaire Relay's, Read Buttons and display information on a 128*128 LCD Display
// 
// The LM75 library is used toe readout a SE95 NXP temperature sensor.
// This sensor wil give a impression of the temperature of the potmeters and reference section who are in a appart shielded box
//
//
//
// The part of the software i wrote, is free for personal use :-)


#include <TimeLib.h>
#include <Wire.h>
#include <Button.h>
#include "Timer.h"
#include "Ucglib.h"
#include <LM75.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads;     // Use this for the 16-bit version 
float Voltage = 0;

// initialize an LM75 object
LM75 sensor;

// initialize Display driver object
Ucglib_ST7735_18x128x160_HWSPI ucg(/*cd=*/ 9, /*cs=*/ 10, /*reset=*/ 8);

// Setup variable for temperature measurement
unsigned long currentTime;
unsigned long loopTime;

// Setup variable for ADC conversion
unsigned long currentTime_Conv;
unsigned long loopTime_Conv;


// Setup Range RangeState used for the Display
byte rangeState = 1;                                // RangeState 1 = 20mV Range, 2 = 2V Range, 3 = 20V Range, used for error detection and Display, Power On Preset = 1 (20mV range)

// Setup variable for timing relais driver puls
byte resetPuls = 5;                                 // Time in mSec for Reset Puls
byte wait_2 = 2;                                    // Get Stable, Delay
byte on_Puls_5 = 5;                                 // Relais timing 5mSec ("On" time for "Set" coil of the relais )

// Setup variable for toggle Relaiy Setup (Output On/Off)
byte enable = 0;                                    // 0 = Output Off, 1 = Output On, Power On Preset = 0
byte Enable_In = A0;                                // Toggle Button Pin Setup
byte Enable_Out = 12;                               // Relais driver output setup, used for indicator light
byte ToggleState = HIGH;                            // Preset Enable Output Set To "Off"
byte reading;                                       // The current reading from the input pin
int previous = LOW;                                 // The previous reading from the input pin
long time = 0;                                      // The last time the output pin was toggled
long debounce = 100;                                // The debounce time, increase if the output flickers

// initialize timer library
Timer t;

// Define Range Buttons connected tot a Arduino Nano
Button button2(A1);                                 // 20mV range
Button button3(A2);                                 // 2V range
Button button4(A3);                                 // 20V range



void setup() {
  Serial.begin(115200);
  
  Wire.begin();
  Wire.setClock(800000); 

//Setup Arduino relais outputs
  pinMode(2, OUTPUT);                                // ResetPuls Relay Driver
  pinMode(3, OUTPUT);                                // RE-2 Driver (20/2V)
  pinMode(4, OUTPUT);                                // RE-3 Driver
  pinMode(5, OUTPUT);                                // RE-4 Driver
  pinMode(6, OUTPUT);                                // RE-1 Set driver
  pinMode(7, OUTPUT);                                // RE-1 Reset driver
  pinMode(12, OUTPUT);                               // Output Driver for LED Enable Button )

// Output Enable function setup
  pinMode(A0, INPUT);                                // Set pin-A0 as a input for the enable button

//Setup Arduino range button inputs
  button2.begin();                                   // 20V Range
  button3.begin();                                   // 2V Range
  button4.begin();                                   // 20mV Range


// Timing setup for Temperature measurement samples
  currentTime = millis();
  loopTime = currentTime;

// Setup Display
  ucg.begin(UCG_FONT_MODE_TRANSPARENT);
  ucg.clearScreen();

  
// Place static objects on Display
  ucg.setRotate90(); 
  ucg.setColor(255, 255, 255);
  ucg.drawFrame(0, 0, 128, 128);
  ucg.drawLine(0, 23, 128, 23);
  ucg.setColor(0, 255, 255);
  ucg.drawBox(0, 46, 128, 32);                      // Draw Yellow box
  ucg.setColor(0, 0, 0, 0);
  ucg.drawRBox(4, 49, 120, 26, 4);                  // Draw black box 
  ucg.setColor(255, 255, 255);
  ucg.drawLine(0, 102, 128, 102);

// Set static text on display for temperature
  ucg.setFont(ucg_font_9x15B_mr);                   // Set font type 
  ucg.setColor(0, 255, 255, 255);                   // Switch color to white
  ucg.setPrintPos(4,16);                            // Set position for "Temp =" text
  ucg.print("Temp =");                              // Place "Temp =" on the display

  // Set static text on display for te range
  ucg.setFont(ucg_font_9x15B_mr);                   // Set font type
  ucg.setColor(0, 255, 255, 255);                   // Switch color to white
  ucg.setPrintPos(4,39);                            // Set position for "Range =" text
  ucg.print("Range =");                             // Place "Range =" on display

// Set static text on display for te output status
  ucg.setFont(ucg_font_9x15B_mr);                   // Set font type
  ucg.setColor(0, 255, 255, 255);                   // Switch color to white
  ucg.setPrintPos(4,95);                            // Set position for "Output" text
  ucg.print("Output");                              // Place "Output" on display
  ucg.setPrintPos(62,95);                           // Set position for "=" text
  ucg.print("=");                                   // Place "=" on display

// Set static text on display Produc Name
  ucg.setFont(ucg_font_helvB08_tr);                 // Set font type
  ucg.setColor(0, 255, 255, 0);                     // Switch color to ...
  ucg.setPrintPos(9,118);                           // Set position for "NoiseAmp" text
  ucg.print("To Sine or not to Sine");              // Place "Sine" on display

// Power On Preset relay
  digitalWrite(5, HIGH);                            // Start reset puls
  delay(resetPuls);                                 // "resetPulse" defines the time how long the relay "reset coil" gets drive current (here 5 mSec)
  digitalWrite(5, LOW);                             // Stop reset puls  

  // Place default range on screen
  ucg.setColor(0, 255, 0, 0);                        // Change color to blue
  ucg.setPrintPos(50,17);                            // Position for drawing box
  ucg.drawRBox(78, 25, 46, 18, 4);                   // Draw blue box
  ucg.setFont(ucg_font_9x15B_mr);                    // Set font type
  ucg.setColor(255, 255, 255);                       // Set font color
  ucg.setPrintPos(83,40);                            // Set font position
  ucg.print("20mV");                                 // Place 20mV announcer on display

  // Place mV announcer voor ADC value on screen afther boot
  ucg.setColor(0, 0, 255, 0);                        // Set font color
  ucg.setColor(1, 0, 0, 0);                          // Background color, black
  ucg.setFontMode(UCG_FONT_MODE_SOLID);              // Set Fontmode to Solid
  ucg.setFont(ucg_font_profont22_mr);                // Set font type
  ucg.setPrintPos(94,69);                            // Set font position
  ucg.print("mV");                                   // Place mV announcer on display

  // Place temperature on screen afther boot
  sensor.shutdown(false);                             // Switch on SE95 temp sensor
  char celcius[10];                                   //
  dtostrf(sensor.temp(), 6, 2, celcius);              //
  ucg.setFont(ucg_font_9x15B_mr);                     // Set font type
  ucg.setColor(0, 255, 255, 255);                     // Font color
  ucg.setColor(1, 0, 0, 0);                           // Background color, black
  ucg.setPrintPos(115,17);                            // Set position for "C" text
  ucg.print("C");                                     // Place "C" announcer on display
  ucg.setPrintPos(57,17);                             // Set position for temperature value text
  ucg.print(celcius);                                 // Place "temperature value" on display
  sensor.shutdown(true);                              // Switch off SE95 sensor



// Setup ADC
  ads.setGain(GAIN_TWO);                              // 2x gain   +/- 2.048V  1 bit = 0.1mV (0.0625mV)
  ads.begin();
  ads.setSPS(ADS1115_DR_16SPS);                       // for ADS1115 fastest samples per second is 860 (default is 128)
}


void loop() {

  unsigned long start_loop = millis();                // Start loop measuring time
  ucg.setFontMode(UCG_FONT_MODE_SOLID);               // Set fontmode to solid

// Start to measure temperature
  currentTime = millis();
  if(currentTime >= (loopTime + 5000)){               // Every 5 second sample temperature
  sensor.shutdown(false);                             // Switch on SE95 temp sensor
  char celcius[10];                                   //
  dtostrf(sensor.temp(), 6, 2, celcius);              //

  ucg.setFont(ucg_font_9x15B_mr);                     // Set font type
  ucg.setColor(0, 255, 255, 255);                     // Font color
  ucg.setColor(1, 0, 0, 0);                           // Background color, black
  ucg.setPrintPos(115,17);                            // Set position for "C" text
  ucg.print("C");                                     // Place "C" announcer on display
  ucg.setPrintPos(57,17);                             // Set position for temperature value text
  ucg.print(celcius);                                 // Place "temperature value" on display
  sensor.shutdown(true);                              // Switch off SE95 sensor
  loopTime = currentTime;                             // Update loopTime
  }
  else
// End measure temperature


// Start reading toggle Enable/Disable button code 
   reading = digitalRead(A0);                        // Read if button is pushed
  if (reading == HIGH && previous == LOW && millis() - time > debounce) {
  if (ToggleState == HIGH)
  ToggleState = LOW;
  else
  ToggleState = HIGH;
  time = millis();    

  // Toggle RE-1 comparator start
  if(ToggleState==1) {
  digitalWrite(6, HIGH);                             // Makes output-6 High
  delay(on_Puls_5);                                  // Time for "On" puls (5 mSec)
  digitalWrite(6, LOW);                              // Makes output-6 low

  // Update display with "ON!" text
  ucg.setColor(0, 255, 0, 0);                        // Change color to blue
  ucg.drawRBox(78, 81, 46, 18, 4);                   // Draw blue box
  ucg.setFont(ucg_font_9x15B_mr);                    // Set font type
  ucg.setColor(0, 255, 255, 255);                    // Set font color to white
  ucg.setColor(1, 255, 0, 0);                        // Set font background color to blue
  ucg.setPrintPos(89,96);                            // Set font position
  ucg.print("ON!");                                  // Place "ON!" on display


  } else if(ToggleState==0) {
  digitalWrite(12, HIGH);                            // Makes output 12 High
  delay(on_Puls_5);                                  // Time for "On" puls (5 mSec)
  digitalWrite(12, LOW);                             // Makes output 12 low

  // Update display with "OFF!" text
  ucg.setColor(0, 0, 0, 255);                        // Change color to red
  ucg.drawRBox(78, 82, 46, 17, 4);                   // Draw red box
  ucg.setFont(ucg_font_9x15B_mr);                    // Set font type
  ucg.setColor(0, 255, 255, 255);                    // Set font color
  ucg.setColor(1, 0, 0, 255);                        // Set font background to red
  ucg.setPrintPos(85,95);                            // Set font position
  ucg.print("OFF!");                                 // Place "OFF!" on display
  } 
  }
  digitalWrite(12, ToggleState);
  previous = reading;
// End toggle Enable/Disable button code



// Start reading 20V range button code
  if (button4.pressed()) {

  // Set announcer to V 
  ucg.setFont(ucg_font_profont22_mr);                // Set font type
  ucg.setColor(0, 0, 255, 0);                        // Set font color
  ucg.setColor(1, 0, 0, 0);                          // Set font background to black
  ucg.setPrintPos(94,69);                            // Set font position
  ucg.print(" V");                                   // Place " V" on display

  // Set announcer 20V
  ucg.setColor(0, 255, 0, 0);                        // Change color to blue
  ucg.drawRBox(78, 25, 46, 17, 4);                   // Draw blue box
  ucg.setFont(ucg_font_9x15B_mr);                    // Set font type
  ucg.setColor(0, 255, 255, 255);                    // Set font color
  ucg.setColor(1, 255, 0, 0);                        // Set font background to blue
  ucg.setPrintPos(88,40);                            // Set font position
  ucg.print("20V");                                  // Place " 20V" on display
 
  // Reset Relais-2, Relais-3, Relais-4
  digitalWrite(5, HIGH);                             // Start reset puls
  delay(resetPuls);                                  // reset Pulse defines the time how long the relay "reset coil" gets current
  digitalWrite(5, LOW);                              // Start reset puls
  delay(wait_2);                                     // Wait a short wile

  // Start On puls Relais-2, 3, 4
  digitalWrite(2, HIGH);                             // Start setpuls 
  digitalWrite(3, HIGH);                             // Start setpuls
  digitalWrite(4, HIGH);                             // Start setpuls
  delay(on_Puls_5);                                  // 5mSec Setpuls Relais-2, 3, 4
  
  // Stop On Puls Relais-2, 3, 4
  digitalWrite(2, LOW);                              // End set puls
  digitalWrite(3, LOW);                              // End set puls
  digitalWrite(4, LOW);                              // End set puls
  rangeState = 3;                                    // Set range state for Display
  }
// End reading 20V range button code


// Start reading 2V range button code
  if (button3.pressed()) {
  
  // set announcer to V 
  ucg.setFont(ucg_font_profont22_mr);                // Set font type
  ucg.setColor(0, 0, 255, 0);                        // Set font color
  ucg.setColor(1, 0, 0, 0);                          // Set font background
  ucg.setPrintPos(94,69);                            // Set font position
  ucg.print(" V");                                   // Place " V" on display

  ucg.setColor(0, 255, 0, 0);                        // Change color to blue
  ucg.drawRBox(78, 25, 46, 17, 4);                   // Draw blue box
  ucg.setFont(ucg_font_9x15B_mr);                    // Set font type
  ucg.setColor(0, 255, 255, 255);                    // Set font color
  ucg.setColor(1, 255, 0, 0);                        // Set fond background
  ucg.setPrintPos(92,40);                            // Set font position
  ucg.print("2V");                                   // Place "2V" on display
 
  // Reset Puls Relais-2, Relais-3, Relais-4
  digitalWrite(5, HIGH);                             // Start reset puls
  delay(resetPuls);                                  // reset Pulse defines the time how long the relay "reset coil" gets current
  digitalWrite(5, LOW);                              // End reset puls
  delay(wait_2);                                     // Wait a short wile

  // Set Puls Relais-3, Relais-4
  digitalWrite(3, HIGH);                             // Start set puls
  digitalWrite(4, HIGH);                             // Start set puls
  delay(on_Puls_5);                                  // 5mSec timing for Setpuls Relais-3, Relais-4
  digitalWrite(3, LOW);                              // End set puls  
  digitalWrite(4, LOW);                              // End set puls
  rangeState = 2;                                    // Set range state for Display
  }
// End reading 2V range button code


// Start reading 20mV range button code
  if (button2.pressed()) {
  
  // Set announcer to mV 
  ucg.setColor(0, 255, 0);                           // Set color to green
  ucg.setFont(ucg_font_profont22_mr);                // Set font type
  ucg.setPrintPos(94,69);                            // Set font position
  ucg.print("mV");                                   // Place "mV" on display

  ucg.setColor(0, 255, 0, 0);                        // Change color to blue
  ucg.drawRBox(78, 25, 46, 17, 4);                   // Draw blue box
  ucg.setFont(ucg_font_9x15B_mr);                    // Set font type
  ucg.setColor(0, 255, 255, 255);                    // Set font color
  ucg.setColor(1, 255, 0, 0);                        // Set Font background to blue 
  ucg.setPrintPos(83,40);                            // Set font position
  ucg.print("20mV");                                 // Place "20mV" on display
  
  // Reset Puls Relais-2, Relais-3, Relais-4
  digitalWrite(5, HIGH);                             // Start reset puls
  delay(resetPuls);                                  // reset Pulse defines the time how long the relay "reset coil" gets current
  digitalWrite(5, LOW);                              // End set puls 
  rangeState = 1;                                    // Set range state for Display 
  }
// End reading 20mV range button code



// ADC measure input and place value on displag

  currentTime_Conv = millis();
  if(currentTime >= (loopTime_Conv + 500)){           // Every 1/4 second ADC sample
  ucg.setFont(ucg_font_profont22_mr);                 // Set font type
  ucg.setColor(0, 0, 255, 0);                         // Set font color
  ucg.setColor(1, 0, 0, 0);                           // Set font background to black
  ucg.setPrintPos(13,69);                             // Set font position
  char ADC_Buffer[10];                                // Make "char" variable ADC_Buffer for formatting ADC value
  dtostrf(1.0F * ads.readADC_SingleEnded_V(0), 6, 4, ADC_Buffer);
  ucg.print(ADC_Buffer);                              // Place measuren output voltage on display
  loopTime_Conv = currentTime_Conv;                   // Update loopTime
  }

unsigned long end = millis();
unsigned long delta = end - start_loop;
Serial.println(delta);
 
 }

Het onnodig aanroepen van de fontmode is uit de code gehaald en de meeste omschrijvingen kloppen weer.
Maar er zit nog een "Sine" bug in de code en heb moeite deze er uit te krijgen... *grin"

http://www.bramcam.nl/NA/LowCostCal/LowCostCal-84.png

Groet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
blackdog

Golden Member

Hi,

Ja ik vind dit programmeren leuker dan naar de TV kijken :-)

Het laatste plaatje van dit jaar is een lukky shot.
Precies op het moment dat het laatste cijfer wordt overschreven werd het plaatje gemaakt...

Wat ik heb aangepast in dit plaatje zijn de ronde hoekjes van de kaders, dat ziet er wat beter uit vind ik.
Wat ik al zij, de streepjes zien je niet zelf op het display, dat komt door de aliassing van de LED verlichting hier binnen.
Ook het geel is niet zo mooi geel als in het echt, de kleurbalans is een beetje zoek.
Hier en daar moet het geheel nog een pixel verschoven worden om het voor het oog mooi te zetten.

Op de plek van de Sine tekst komt b.v. "Current" te staan en dan in twee of drie stapjes zoiet als dit < 5mA, > 5mA of >8mA.
Met de aangegeven waarde in een gekleurd vlak, laters meer hierover.

http://www.bramcam.nl/NA/LowCostCal/LowCostCal-85.png

Prettige jaarwisseling!

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Op 31 december 2017 21:19:34 schreef blackdog:
Hi,

Ja ik vind dit programmeren leuker dan naar de TV kijken :-)

Groet,
Bram

En vooral als er resultaat is ????

Smaken verschillen? Ik vind die eerdere layout mooier ;)
En de beste wensen voor het nieuwe jaar.

blackdog

Golden Member

Hi,

Een goed 2018 en nogmaals dank voor eenieder die mij geholpen heeft in 2017.

Natuurlijk begin ik dit nieuwe jaar goed met een vraag *grin*
Ik ben aan het testen om te zien of de ADC waarde na de laatste meting is veranderd.

c code:


// ADC measure input and place value on display

  currentTime_Conv = millis();
  if(currentTime >= (loopTime_Conv + 500)){           // Every 1/4 second ADC sample
  ucg.setFont(ucg_font_profont22_mr);                 // Set font type
  ucg.setColor(0, 0, 255, 0);                         // Set font color
  ucg.setColor(1, 0, 0, 0);                           // Set font background to black
  ucg.setPrintPos(13,69);                             // Set font position
  char ADC_Buffer[10];                                // Make "char" variable ADC_Buffer for formatting ADC value
  char ADC_Old[10];                                   // Make "char" variable ADC_Old[10] for comparing old and new ADC value
  dtostrf(1.0F * ads.readADC_SingleEnded_V(0), 6, 4, ADC_Buffer);

  if (ADC_Buffer != ADC_Old){                         // compare old and new ADC value and write data to screen if different
  ucg.print(ADC_Buffer);                              // Place measured output voltage on display if it is different from the last conversion
  ADC_Old = ADC_Buffer;                               // Update delta_adc
  loopTime_Conv = currentTime_Conv;                   // Update loopTime
  }
}

De Arduino IDE geeft de onderstaande error, heeft dit te maken dat je geen char variabelen zo met elkaar kan vergelijken?
Of vergeet ik weer iets stoms :-)

Button-Bipolaire-Driver-33:372: error: invalid array assignment
ADC_Old = ADC_Buffer; // Update delta_adc

deKees kan je uitlegen wat jij beter vind aan de andere layout en waarom?

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Die andere layout is niet beter of zo, ik vind er alleen mooier uitzien. Misschien ook wel omdat die iets meer ruimte laat voor de tekst.

En strings kopiëren en vergelijken kan met speciale string funkties. Die zijn nogal ouderwets maar nog wel altijd beschikbaar

Kopiëren gaat zo:

code:


   strncpy(ADC_Old, ADC_Buffer, sizeof(ADC_Old));

En strings vergelijken gaat zo:

code:


   if(strncmp(ADC_Old, ADC_Buffer, sizeof(ADC_Old)) != 0)
   {  ...
blackdog

Golden Member

Hi deKees,

De responstijd van de toetsjes gingen er nog niet echt op vooruit...
Na wat looptiming te hebben uitgevoerd en wat regels te hebben uitgezet ben ik er achter gekomen dat de string vergelijking toch wel veel looptijd vreet.
Ik kom uit op ongeveer 64mSec... dat is op zijn Engel een sterk staaltje van "pissing time away" *grin*

Wat is jouw mening om dit nog te verbeteren?
Ik denk er b.v. aan een een tweede "if" vergelijking op te nemen binnen de eerste zodat deze: if (strncmp(ADC_Old, ADC_Buffer, sizeof(ADC_Old)) != 0)
niet steeds wordt uitgevoerd wanneer niet nodig.

Een ander manier is b.v. de ruwe ADC waarde te vergelijken, zou dat niet sneller zijn dan een char string vergelijking?

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

de ruwe ADC waarde te vergelijken

Is zeker sneller, volgende code geeft bij mij voor INT 0 en voor strncmp 4.
Aangezien de resolutie van micros() 4 is kan strncmp ook korter duren.

c code:

void setup() {
 Serial.begin(9600);
}

void loop() {
unsigned long used;
unsigned long start_time;
unsigned long stop_time;

int foo = 100;
int bar = 110;

start_time= micros();
if (foo == bar) {
   // This code will execute...
}
stop_time = micros();

used = stop_time - start_time;
Serial.print("Used INT: ");
Serial.println(used);

char ADC_Old[] = "ADC_Old12345";
char ADC_New[] = "ADC_New12345";

start_time = micros();
if(strncmp(ADC_Old, ADC_New, sizeof(ADC_Old)) != 0)
   { 
    // This code will execute...
   }
stop_time = micros();

used = stop_time - start_time;
Serial.print("Used STR: ");
Serial.println(used);

delay(1000);
}
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.