Kijk hier word ik ook blij van en kan je toch weer een hoop van elkaar leren.
Golden Member
Kijk hier word ik ook blij van en kan je toch weer een hoop van elkaar leren.
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
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%)
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
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
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.
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.
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;
}
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%)
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
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.
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.
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
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.
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
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
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
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.
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%)
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"
Groet,
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.
Prettige jaarwisseling!
Groet,
Bram
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.
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
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)
{ ...
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
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);
}